更新语句不起作用(常规语句以及准备好的语句)

update statement is not working (regular statement as well as prepared statement)

我可以毫无问题地从 mysql 数据库中插入和 select,但无法更新记录。

最初我使用 mysqli_query 没有任何结果或错误。后来我试了prepared statement,没有结果。

在这里分享我的代码:

 define('DB_SERVER', 'localhost');
 define('DB_USERNAME', 'xxxx');
 define('DB_PASSWORD', 'xxxx');
 define('DB_DATABASE', 'xxxx');
 $db = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE);

 //the function
 function SaveLineItem() {
     $sql = "update lineitems set deliverycost=? ";

     $tdetail = "";
     if($_POST['tdetail']){
        $sql .= ",tracking_details=?" ;
        $tdetail = $_POST['tdetail'];
     }

     $sql .= " where id=?";

     $dc = $_POST['dc'];
     $lineItemId = $_POST['lineItemId'];
     echo $sql;

     $stmt = mysqli_prepare($db, $sql);
     echo "<br>after prepare statement";

    if($tdetail<>""){
        mysqli_stmt_bind_param($stmt,"isi",$dc1,$tdetail1,$lineItemId1);
     }else {
        mysqli_stmt_bind_param($stmt,"ii",$dc1,$lineItemId1);
    }

    echo "<br>after binding";

    $dc1 = $dc;
    if($tdetail<>""){
        $tdetail1 = $tdetail;   
        echo "<br>detail param bound";
    }

    $lineItemId1 = $lineItemId;
    mysqli_stmt_execute($stmt);

    echo "<br>statement executed";
     //header("location:../welcome.php");
}

输出为:

update lineitems set deliverycost=? ,tracking_details=? where id=?
after prepare statement
after binding
detail param bound
statement executed

但是检查 table 没有更新。 从昨天开始尝试,我错过了什么?

更新: 此代码最初是在 windows 中开发的,但后来我决定在 Ubuntu 16.04 中继续工作。在 ubuntu 中似乎连插入都不起作用。可能是 ubuntu 安全相关问题?

尝试将 execute 语句放入一个变量中,并在最后回显它,以便您可以查看查询是否失败。

然后尝试将查询的输出放入 phpmyadmin 以查看是否有错误。

请试试这个。 $dc1mysqli_stmt_bind_param 中使用时未定义。对于您 $dc1 持有更新记录的 id。如果这是空的,这就是为什么您不会在数据库中看到任何更改的原因。查询运行但不影响任何行。

 define('DB_SERVER', 'localhost');
 define('DB_USERNAME', 'xxxx');
 define('DB_PASSWORD', 'xxxx');
 define('DB_DATABASE', 'xxxx');
 $db = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE);

 //the function
 function SaveLineItem() {
     $sql = "update lineitems set deliverycost=? ";

     $tdetail = "";
     if($_POST['tdetail']){
        $sql .= ",tracking_details=?" ;
        $tdetail = $_POST['tdetail'];
     }

     $sql .= " where id=?";

     $dc = intval($_POST['dc']);
     $lineItemId = intval($_POST['lineItemId']);
     echo $sql;
     $stmt = mysqli_prepare($db, $sql);
     echo "<br>after prepare statement";
     // define $dc1 here since you use it below. If it is undefined could resolve to an error or a wrong query.
     $dc1 = $dc;    
    if($tdetail<>""){
        mysqli_stmt_bind_param($stmt,"isi",$dc1,$tdetail1,$lineItemId1);
     }else {
        mysqli_stmt_bind_param($stmt,"ii",$dc1,$lineItemId1);
    }

    echo "<br>after binding";


    if($tdetail<>""){
        $tdetail1 = $tdetail;   
        echo "<br>detail param bound";
    }

    $lineItemId1 = $lineItemId;
    mysqli_stmt_execute($stmt);

    echo "<br>statement executed";
    mysqli_stmt_close($stmt);
    echo "<br>statement closed";
     //header("location:../welcome.php");
}