更新脚本将所有行设置为相同的值

时间:2015-02-24 10:07:06

标签: php

我正在尝试在表格中创建一个编辑表单,如果进行了更改,我想在数据库中替换它。我正在使用下表。

<?php
$query = "SELECT * FROM jos_ib_ponude_stavke WHERE BrojPonude = $id";
$q=$conn->query($query);
?>

我做的第一件事是在表格中打印值,这一步很好。

<form method="post" action="">
<button type="submit" class="btn btn-success" id="submit" name="submit">Snimi</button>
<table class="table table-bordered table-hover">
<thead>
    <tr class="bg bg-primary">
        <th class="text-center">Opis Radova</th>
        <th class="text-center">Jm</th>
        <th class="text-center">Kolicina</th>
        <th class="text-center">Cijena</th>
        <th class="text-center">Rabat</th>
    </tr>
</thead>
<tbody>
    <tr>
    <?php while ($r=$q->fetch()):?>
        <td><input type="text" name='opis_edit[]' value="<?php echo $r['OpisRadova']?>"  class="form-control"/></td>
        <td class="col-md-1"><input type="text" name='jm_edit[]' value="<?php echo $r['Jm'] ?>" class="form-control"/></td>
        <td class="col-md-1"><input type="text" name='kolicina_edit[]' value="<?php echo $r['Kolicina'] ?>" class="form-control"/></td>
        <td class="col-md-1"><input type="text" name='cijena_edit[]' value="<?php echo $r['Cijena'] ?>"  class="form-control"/></td>
        <td class="col-md-1"><input type="number" name='rabat_edit[]' value="<?php echo $r['Rbt'] ?>" class="form-control"/></td>
    </tr>
    <tr></tr>
</tbody>
<?php endwhile; ?>
</table>
</form>

一旦我点击提交,我就会获得数组中的所有值。

$br_ponude = $_GET['Id'];
$opis_post = $_POST['opis_edit'];
$jm_post = $_POST['jm_edit'];
$kolicina_post = $_POST['kolicina_edit'];
$cijena_post = $_POST['cijena_edit'];
$rabat_post = $_POST['rabat_edit'];
$pdv_post = "17,00";

我得到了所有的价值观。问题出现在下面的陈述中。

for ($i=0; $i < sizeof($opis_post) ; $i++) 
{ 

$iznosbpdv = $cijena_post[$i] * $kolicina_post[$i]; // izracunaj iznos bez pdva i bez rabata

    if ($rabat_post !=0) 
        {

    $rbt = ($cijena_post[$i] * $kolicina_post[$i]) - 
            ($cijena_post[$i] * $kolicina_post[$i] * $rabat_post[$i] /100);
        }

    else { 
        $rbt = 1.00;
        }


$query_stavke = $conn->prepare("UPDATE jos_ib_ponude_stavke SET OpisRadova=:opis, Jm=:jm,Kolicina=:kolicina,
                             Cijena=:cijena, Rbt=:rbt, Pdv=:pdv, IznosBPDV=:iznosbpdv, IznosRbt=:iznosrbt 
     WHERE BrojPonude = '$br_ponude'");

        $query_stavke->bindParam(':opis',$opis_post[$i]);
        $query_stavke->bindParam(':jm',$jm_post[$i]);
        $query_stavke->bindParam(':kolicina',$kolicina_post[$i]);
        $query_stavke->bindParam(':cijena',$cijena_post[$i]);
        $query_stavke->bindParam(':rbt',$rabat_post[$i]);
        $query_stavke->bindParam(':pdv',$pdv_post);
        $query_stavke->bindParam(':iznosbpdv',$iznosbpdv);
        $query_stavke->bindParam(':iznosrbt',$rbt);
        $query_stavke->execute(); 
}

执行语句后,表中的所有行都相同。我使用类似的脚本插入,它工作正常。任何帮助或建议表示赞赏!

1 个答案:

答案 0 :(得分:1)

首先,使用PDO的引用变量功能而不是不断地重新绑定事物可能更有效。它不需要。

此外,您在查询中有$ br_ponude而不是绑定参数。这也没有帮助。由于查询字符串只生成一次。所以你总是一遍又一遍地更新同样的东西。

所以对于这些缺陷。现在是错误

使用您的语句,您将更新用户ID匹配的每一行。

WHERE BrojPonude = :BrojPonude

这告诉sql数据库:BrojPunde =此值的任何记录都会使用这些值更新它。

所以你的程序所做的就是每次循环更新每一行。 现在我不熟悉您的语言,但您需要在where语句中添加一个额外的选项以选择要更新的特定行

WHERE BrojPonude = :BrojPonude AND SecondSelect = :SelectionParam

$query_stavke = $conn->prepare("UPDATE jos_ib_ponude_stavke SET OpisRadova=:opis, Jm=:jm,Kolicina=:kolicina,
                         Cijena=:cijena, Rbt=:rbt, Pdv=:pdv, IznosBPDV=:iznosbpdv, IznosRbt=:iznosrbt 
 WHERE BrojPonude = :BrojPonude  AND SecondSelect = :SelectionParam");// <-- dont ever use local variables.

    $query_stavke->bindParam(':opis',$opis_post_insert);
    $query_stavke->bindParam(':jm',$jm_post_insert;
    $query_stavke->bindParam(':kolicina',$kolicina_post_insert);
    $query_stavke->bindParam(':cijena',$cijena_post_insert);
    $query_stavke->bindParam(':rbt',$rabat_post_insert);
    $query_stavke->bindParam(':pdv',$pdv_post_insert);
    $query_stavke->bindParam(':iznosbpdv',$iznosbpdv_insert);
    $query_stavke->bindParam(':iznosrbt',$rbt_insert);
    $query_stavke->bindparam(':BrojPonude',$br_ponude); // <-----
    $query_stavke->bindparam(':SecondSelect ',$SecondSelect);

for ($i=0; $i < sizeof($opis_post) ; $i++) 
{ 

$iznosbpdv_insert = $cijena_post[$i] * $kolicina_post[$i]; // izracunaj iznos bez pdva i bez rabata

if ($rabat_post !=0) 
    {

$rbt_insert = ($cijena_post[$i] * $kolicina_post[$i]) - 
        ($cijena_post[$i] * $kolicina_post[$i] * $rabat_post[$i] /100);
    }

else { 
    $rbt_insert = 1.00;
    }
$opis_post_insert = $opis_post[$i];

$jm_post_insert = $jm_post[$i];
$kolicina_post_insert = $kolicina_post[$i];
$cijena_post_insert = $cijena_post[$i];
$rabat_post_insert = $rabat_post[$i];
$execres = $query_stavke->execute();

}