无法将多条记录更新到mysql

Posted

技术标签:

【中文标题】无法将多条记录更新到mysql【英文标题】:Unable to update multiple records into 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 行

【问题讨论】:

【参考方案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 起已被删除。升级到mysqli(this question 可以提供帮助)或者更好的是PDO(this question 可以提供帮助)。在此过程中,更改为准备好的语句(MySQLi 或 PDO),它们将比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 的原始代码已经在里面了,我试图做尽可能少的更改。

以上是关于无法将多条记录更新到mysql的主要内容,如果未能解决你的问题,请参考以下文章

mysql进阶 十四 批量更新与批量更新多条记录的不同值实现方法

mysql 批量更新多条记录(且不同值)的实现方法

mysql 批量更新与批量更新多条记录的不同值实现方法

mysql 批量更新与批量更新多条记录的不同值实现方法

使用mysql在单个查询中更新多条记录

如果 mysql 数据库中的表中不存在,则更新或插入多条记录