Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal, tenho um problema com o foreach, não sei o que esta errado venho pedir ajuda para tentar resolver, o problema é o seguinte;
Tenho duas tabelas mysql,
Tabela: mao_obra - campos, id (auto incremento), mao_obra(descrição) e preço
Tabela: detalhe_orcamento - campos, id (auto incremento), orcamento_id, mao_obra_id e preço
Consigo gravar os dados da tabela mao_obra na tabela detalhe_orcamento, mas com um problema que não resolvi na época e agora estou precisado resolver sem falta, o problema é que o campo preço gravado na tabela detalhe_orcamento, é sempre o primeiro preço da tabela mao_obra, o id grava corretamente segue o código que uso:
<?php
if (isset($_POST['enviar'])){
$mao_obra_id = $_POST['mao_obra_id'];
$orcamento_id = $_POST['orcamento_id'];
$preco = $_POST['preco'];
foreach($_POST['mao_obra_id'] as $indice => $valor){
$inserir = "INSERT INTO detalhe_orcamento (mao_obra_id, orcamento_id, preco) VALUE ('".$valor."', '".$orcamento_id."', '".$preco."')" or die(mysql_error());
$ex = mysql_query($inserir) or die(mysql_error());
print_r ($valor);
echo'<br />';
print_r ($preco);
}
}
?>
<?php
// consulta do select de Serviços
$selec = "SELECT * FROM mao_obra";
$exec = mysql_query($selec) or die(mysql_error());
// Lista dados do checkbox
while($dados=mysql_fetch_array($exec)) {
$id = $dados['id'];
$mao_obra = $dados['mao_obra'];
$preco = $dados['preco'];
?>
<form action="" name="form1" enctype="multipart/form-data" method="post">
<input style="margin-left:30px" name="mao_obra_id[]" type="checkbox" value="<?php echo $id; ?>"/> <?php echo $mao_obra; ?>
<input type="text" name="preco" value="<?php echo $preco; ?>" /><?php echo $preco; ?>
<?php
}
?>
<input type="text" name="orcamento_id" /></td>
<input type="submit" name="enviar" value="Adicionar Orçamento" /></td>
</form>
O resultado do print_r ($valor); mostra o id correto mas o print_r ($preco); mostra o preço sempre do id 1
Já pesquisei muito mas não consegui resolver esse problema
o que está acontecendo é lógico, sua variável $valor é uma variável temporária do foreach, e ela serve para pegar uma posição do array de cada vez,é por isso que ela está funcionando certinho, mais no caso dá variável $preço você esta dando um print nela sempre na mesma posição, por isso sempre imprime e salva só o primeiro id, tenta fazer um foreach pra que a var $preco vire um array com todos os id.
Oi Cleiton, não entendi muito bem, estou a pouco tempo aprendendo php, não sei se era isso o que você sugeriu
if (isset($_POST['enviar'])){
$mao_obra_id = $_POST['mao_obra_id'];
$orcamento_id = $_POST['orcamento_id'];
foreach($_POST['mao_obra_id'] as $indice => $valor){
//$inserir = "INSERT INTO detalhe_orcamento (mao_obra_id, orcamento_id, preco) VALUE ('".$valor."', '".$orcamento_id."', '".$preco[$indice]."')" or die(mysql_error());
//$ex = mysql_query($inserir) or die(mysql_error());
echo'Nº do ID: '; print_r ($valor);
echo'<br />';
$preco = $_POST['preco'];
foreach($_POST['preco'] as $valor1){
echo'<br />';
print_r ($valor1);
//echo'<br />';
}
}
}
Com isso o $valor mostra o ID correto, mas o $valor1 mostra todos os valores com segue abaixo:
Nº do ID: 9
250.00
300.00
300.00
300.00
250.00
250.00
250.00
250.00
250.00
você até que pegou a lógica do que eu falei, mais não saiu legal, na verdade era mais ou menos assim que eu sugeri:
<?php
if (isset($_POST['enviar'])){
$mao_obra_id = $_POST['mao_obra_id'];
$orcamento_id = $_POST['orcamento_id'];
$preco = $_POST['preco'];
$contador = 0;
$preco = 0;
foreach ($_POST['preco'] as $value)
{
$preco[$contador] = $value;
$contador++;
}
$contador = 0;
foreach($_POST['mao_obra_id'] as $indice => $valor){
$inserir = "INSERT INTO detalhe_orcamento (mao_obra_id, orcamento_id, preco) VALUE ('".$valor."', '".$orcamento_id."', '".$preco[$contador]."')" or die(mysql_error());
$ex = mysql_query($inserir) or die(mysql_error());
print_r ($valor);
echo'<br />';
print_r ($preco[$contador]);
contador++;
}
}
?>Cleiton fiz o teste e da o erro abaixo
Warning: Cannot use a scalar value as an array in C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\Gurski\teste_orcamento.php on line 15
A linha 15 contém
$preco[$contador] = $value;
Pesquisei sobre esse erro mas não achei nada que desse entender...
cara é por que eu esqueci de transformar preço em array antes, na linha que eu atribui 0 pra variável $preço que deve ser a linha 10 ou 11 , faz isso:
está assim:
$preco = 0;
coloca assim:
$preco[0] = 0;
Ok, fiz a alteração, e o erro sumiu, só que notei o seguinte
Ele esta pegando o preço por ordem e não por id quando seleciono o id 1 vem o preço certo, quando seleciono o id 9 vem o preço do id 2 e assim sucessivamente.
Ola Cleiton fiz um
echo '<pre>';
print_r($_POST);
echo '</pre>';
e o resultado foi selecionando o id 4 foi
Array( [preco] => Array ( [0] => 250.00 [1] => 300.00 [2] => 300.00 [3] => 300.00 [4] => 250.00 [5] => 250.00 [6] => 250.00 [7] => 250.00 [8] => 250.00 ) [mao_obra_id] => Array ( [0] => 4 ) [orcamento_id] => 1 [enviar] => Adicionar Orçamento)
Notei que o array [preco ] esta iniciando do zero e esta repetindo todos a noite vou fazer uns testes com o loop...
o que está acontecendo é lógico, sua variável $valor é uma variável temporária do foreach, e ela serve para pegar uma posição do array de cada vez,é por isso que ela está funcionando certinho, mais no caso dá variável $preço você esta dando um print nela sempre na mesma posição, por isso sempre imprime e salva só o primeiro id, tenta fazer um foreach pra que a var $preco vire um array com todos os id.