【问题标题】:Unable to update multiple records into mysql无法将多条记录更新到mysql
【发布时间】:2019-08-14 01:45:55
【问题描述】:

无法通过在php中使用foreach将多条记录更新到mysql中,出现以下错误;

foreach( $_POST['edit'] AS $edit ) {
    $fromdate=mysql_real_escape_string($_POST['fromdate'][$edit]);
    $todate=mysql_real_escape_string($_POST['todate'][$edit]);
    $total=mysql_real_escape_string($_POST['total'][$edit]);
    $ampm=mysql_real_escape_string($_POST['ampm'][$edit]);
    $Update_leavedetails .= "UPDATE leaverequestdetails SET fromdate='$fromdate', " . "todate='$todate',total='$total',ampm='$ampm' " . "WHERE tranid = '$edit';";
}

if(!mysql_query($Update_leavedetails)){
    die('Invaild query: ' . mysql_error());
} else {
    .....

无效查询:您的 SQL 语法有错误;检查手册 对应于正确语法的 MariaDB 服务器版本 在'UPDATE leaverequestdetails SET fromdate='2019-08-26'附近使用, todate='2019-08-26',total=' 在第 1 行

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    您正尝试一次运行多个查询,mysql_query 不支持。您需要将查询的执行带入循环,即

    foreach( $_POST['edit'] AS $edit ) {
        $fromdate=mysql_real_escape_string($_POST['fromdate'][$edit]);
        $todate=mysql_real_escape_string($_POST['todate'][$edit]);
        $total=mysql_real_escape_string($_POST['total'][$edit]);
        $ampm=mysql_real_escape_string($_POST['ampm'][$edit]);
        $Update_leavedetails = "UPDATE leaverequestdetails SET fromdate='$fromdate', ".
        "todate='$todate',total='$total',ampm='$ampm' ".
        "WHERE tranid = '$edit';";
        if(!mysql_query($Update_leavedetails)){
            die('Invalid query: ' . mysql_error());
        }
    }
    

    你真的需要停止使用mysql_* 接口,它自 PHP5.5 起已被弃用,自 PHP7 起已被删除。升级到mysqlithis question 可以提供帮助)或者更好的是PDOthis question 可以提供帮助)。在此过程中,更改为准备好的语句(MySQLiPDO),它们将比mysql_real_escape_string 更好地防止注入。

    使用 MySQLi 准备好的语句,你会写

    $stmt = $link->prepare("UPDATE leaverequestdetails SET fromdate=?, todate=?,total=?,ampm=? WHERE tranid = ?");
    foreach( $_POST['edit'] AS $edit ) {
        $stmt->bind_param("ssssi", $_POST['fromdate'][$edit], $_POST['todate'][$edit], $_POST['total'][$edit], $_POST['ampm'][$edit], $edit);
        if (!$stmt->execute()) die($stmt->error);
    }
    

    【讨论】:

    • 请记住,您的应用程序不应因错误消息而死掉。这可能是一个巨大的安全问题。
    • @Dharman 这是一个公平的评论,我假设(可能没有任何理由)OP 会在投入生产之前处理这个问题。但是 OP 的原始代码已经在里面了,我试图做尽可能少的更改。
    猜你喜欢
    • 2019-02-18
    • 2012-01-08
    • 2014-06-21
    • 1970-01-01
    • 2018-07-17
    • 2016-05-01
    • 2013-05-02
    • 2014-03-04
    • 1970-01-01
    相关资源
    最近更新 更多