首页 > 解决方案 > 使用 PDO 更新 IN

问题描述

出于安全原因,我正在将旧系统迁移到 PDO。现在,我很难使用 IN 进行过滤来进行更新。WHERE 中的过滤器正在工作,但更新外衣 id_user 和 date_prog 没有。

目前我没有收到任何错误消息,当我打印 stmt 时,我得到:

UPDATE os SET id_user =?, date_prog =? WHERE words IN (?,?)

数组():

Array ([1] => 30762507, [2] => 30762508)

即便如此,UPDATE 也不会发生。我哪里错了。

到目前为止,我使用了一个老问题作为基础: PDO: Invalid parameter number: mixed named and positional parameters

提前感谢您的帮助。拥抱。

我的完整代码:

$data = date('Y-m-d H:i:s', time());
$id_user = $_POST['id_user'];
$date_prog = $_POST['date_prog'];
$list_words = $_POST['words'];


$where = array();

$words = preg_split('/[\s]+/',$list_words);

array_unshift($words, '');
unset($words[0]);
        
$IN  = str_repeat('?,',count($words) - 1) . '?';
    
$stmt = "UPDATE os SET id_user = ?, date_prog = ? WHERE words IN ($IN)";
$stmt = $conn->prepare($stmt);

foreach($words AS $index => $word){
    $sqlupos->bindValue($index, $word, PDO::PARAM_STR);
}
$stmt->bindValue($index+1, $id_user, PDO::PARAM_INT);
$stmt->bindValue($index+2, $date_prog, PDO::PARAM_STR);
$stmt->execute();
$data_stmt = $stmt->fetchAll(PDO::FETCH_ASSOC);

标签: phpmysqlpdo

解决方案


在 PHP 中,PDO 方法bindValue使用命名占位符,因此您可以使用下面的代码:

$IN = ':a' . implode(', :a', array_keys($words));

$sql = "UPDATE os SET id_user = :id_user, date_prog = :date_prog WHERE words IN ($IN)";

$stmt = $conn->prepare($sql);

foreach($words AS $index => $word){
    $stmt->bindValue("a$index", $word, PDO::PARAM_STR);
}

$stmt->bindValue(':id_user', $id_user, PDO::PARAM_INT);
$stmt->bindValue(':date_prog', $date_prog, PDO::PARAM_STR);
$stmt->execute();

在PHPize.online上查看实时代码


推荐阅读