php - 使用 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);
解决方案
在 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上查看实时代码
推荐阅读
- wysiwyg - Jodit -> 初始化后隐藏工具栏
- excel - Excel 在公式中以不同的方式处理相同的日期格式?
- .net - 将字符串解析为具有不同字段名称(键值)的实体
- javascript - javascript悬停在TR上以在悬停时显示图像仅在悬停后显示
- sql-server - 如何在 SQL Server 中调用 sp_prepexecrpc?
- python-3.x - NLTK - 如何获取频率分布大于特定数字的项目
- python - 如何遍历 xml 并将其保存到 Python 中的数据框中?
- javascript - 可以用角度编写javascript代码吗
- mysql - 使用子查询选择时为空结果
- html - 通过 Internet 发送 HTML 时图像消失