为什么只更新最后一行的单元格?

时间:2017-05-26 11:29:25

标签: php html

当我尝试仅更新表单表中的一个单元格时,只更新最后一行。 请帮我解决问题并教我如何更新每一行。 谢谢,谢伊。

相关的PHP代码:

CREATE OR REPLACE TYPE staff_res_t AS OBJECT (staff_id  NUMBER)

CREATE TYPE staff_res_tab AS TABLE OF staff_res_t

CREATE OR REPLACE FUNCTION getdept( in_dept NUMBER )
   RETURN staff_res_tab
   PIPELINED
IS
   CURSOR c_staff
   IS
      SELECT staff_id
      FROM   you_table
      WHERE  dept = in_dept;

   out_rec   staff_res_t := staff_res_t( NULL );
BEGIN
   FOR rec_staff IN c_staff
   LOOP
      out_rec.staff_id   := rec_staff.staff_id;
      PIPE ROW ( out_rec );
   END LOOP;

   RETURN;
END;       

SELECT * FROM TABLE( getdept( 443 ) )

这里是相关的HTML代码:

<?php

if(isset($_POST["submit"])) {
    $callid = $_POST['callid'];
    $statusOfWork = $_POST['statusOfWork'];
    $areaNumber = $_POST['areaNumber'];  

    $connection = mysqli_connect('localhost','root','', 'nitzanpi_calls');

    if (!$connection){
        die("Database connection failed" .mysqli_connect_error());
    }

    mysqli_set_charset($connection,"utf8");

    if($areaNumber == '1'){
        $sql1 = "UPDATE calls SET statusOfWork = '".$statusOfWork."' WHERE areaNumber = '1' AND callid = '".$callid."'";
    }
    elseif($areaNumber == '2'){
        $sql1 = "UPDATE calls SET statusOfWork = '".$statusOfWork."' WHERE areaNumber = '2' AND callid = '".$callid."'";
    }
    elseif($areaNumber == '3'){
        $sql1 = "UPDATE calls SET statusOfWork = '".$statusOfWork."' WHERE areaNumber = '".$areaNumber."' AND callid = '".$callid."'";
    }
    elseif($areaNumber == '4'){
        $sql1 = "UPDATE calls SET statusOfWork = '".$statusOfWork."' WHERE areaNumber = '4' AND callid = '".$callid."'";
    }
    elseif($areaNumber == '5'){
        $sql1 = "UPDATE calls SET statusOfWork = '".$statusOfWork."' WHERE areaNumber = '5' AND callid = '".$callid."'";
    }
    elseif($areaNumber == '6'){
        $sql1 = "UPDATE calls SET statusOfWork = '".$statusOfWork."' WHERE areaNumber = '6' AND callid = '".$callid."'";     
    }

    $query1 = mysqli_query($connection, $sql1);        

    if (!$query1) {
        die ('SQL Error: '. mysqli_error($connection));
    }
}
?>

2 个答案:

答案 0 :(得分:1)

在每个表行中,您具有相同的命名隐藏输入字段,在提交表单时,仅提交最后一个唯一命名元素的值。

您可以使用callid ...

为隐藏字段指定唯一名称
<input type="hidden" name="areaNumber_<?php echo $values['callid']?>" value="<?php echo $values['areaNumber']?>">
<input type="hidden" name="statusOfWork_<?php echo $values['callid']?>" value="<?php echo $values['statusOfWork']?>">

...并且还将提交按钮的值更改为callid。

在PHP方面,您现在可以使用

访问值
$callid = $_POST['submit'];
$statusOfWork = $_POST['statusOfWork_'.$callid];
$areaNumber = $_POST['areaNumber_'.$callid]; 

答案 1 :(得分:1)

修复程序位于HTML表单中。因为你使用foreach来创建具有相同名称的多个字段副本,所以只有最后一个具有相同名称的字段被发送到您的PHP文件。您只需在每个字段名称后添加[],以便所有字段中的值都存储在数组中。

<input type="hidden" name="callid[]" value="<?php echo $values['callid']?>">

你也可以添加callid作为每一行的键。

<input type="hidden" name="areaNumber[<?php echo $values['callid']?>]" value="<?php echo $values['areaNumber']?>">
<input type="hidden" name="statusOfWork[<?php echo $values['callid']?>]" value="<?php echo $values['statusOfWork']?>">

这会将所有表单数据放入如下数组:

Array
(
    [callid] => Array
        (
            [0] => 2
            [1] => 3
        )

    [areaNumber] => Array
        (
            [0] => 2
            [1] => 3
        )

    [statusOfWork] => Array
        (
            [0] => 2
            [1] => 3
        )

)

然后,您需要相应地修改PHP代码。另请注意,您的未转义的SQL语句很容易以当前形式注入,并且从PHP 5.5开始不推荐使用Jakub Matczak。建议使用面向对象的procedural mysql fucntions或{{ 3}}。您应该使用mysqli来阻止SQL注入。如果你想坚持程序风格,那么使用PDO来逃避你的价值观。

你也不应该使用mysql&#39; root&#39;用户查询。最好创建具有​​需要执行的功能的权限的另一个用户。

代码的面向对象prepared statements版本的一个非常粗略的例子是:

if(isset($_POST["submit"])) {
    $callid = $_POST['callid'];
    $statusOfWork = $_POST['statusOfWork'];
    $areaNumbers = $_POST['areaNumber'];  

    $mysqli = new mysqli("localhost", "my_user", "my_password", "world");

    /* check connection */
    if ($mysqli->connect_errno) {
        printf("Connect failed: %s\n", $mysqli->connect_error);
        exit();
    }

    $mysqli->set_charset("utf8");

    foreach($areaNumers as $key => $areaNumer) {

        if ($stmt = $mysqli->prepare("UPDATE calls SET statusOfWork = ? WHERE areaNumber = ? AND callid = ?")) {
        /* bind parameters for markers */
    $stmt->bind_param("s", $statusOfWork[$key]);
    $stmt->bind_param("a", $areaNumer);
    $stmt->bind_param("c", $callid[$key]);

        /* execute query */
    $stmt->execute();  
          $stmt->close();        
        }

        /* close connection */
    $mysqli->close();

    }