我有一堆行nieaktualny
email_1
字段等于数组$sprawdzone_temp
中的值的所有行的列 (TINYINT(1)
( 从 0 修改为 1。我已经尝试了很多方法,通过exec()
,prepare()
,execute()
但似乎没有一种有效,我只是不知道为什么。尝试/捕获时不会弹出任何错误。当我使用phpMyAdmin时,查询工作得很好。
这是我的PHP:
$sql = "UPDATE database.table SET `nieaktualny` = '1' WHERE `email_1` LIKE ?";
$stmt = $db->prepare($sql);
foreach($sprawdzone_temp as $email) {
$stmt->execute(array($email));
}
带有数据的数组很好,我想如何使用 PDO 似乎有问题。
我怀疑您的$sprawdzone_temp
可能没有SQL通配符
通配符用于替换字符串中的任何其他字符。
通配符与 SQL LIKE 运算符一起使用。LIKE 运算符在 WHERE 子句中用于搜索列中的指定模式。
有两个通配符与 LIKE 运算符结合使用:
- (%(- 百分号表示零、一个或多个字符
阿拉伯数字。(_( - 下划线表示单个字符
因此,您的代码应遵循以下行:
<?php
$sprawdzone_temp = "%".$sprawdzone_temp."%";
$sql = "UPDATE database.table SET `nieaktualny` = 1 WHERE `email_1` LIKE ?";
$stmt = $db->prepare($sql);
foreach($sprawdzone_temp as $email) {
$stmt->execute(array($email));
}
if(!$stmt){
echo "nPDO::errorInfo():n";
print_r($db->errorInfo());
}
?>
更新
我建议您也尝试使用 SQL IN 运算符,它允许您在 WHERE 子句中指定多个值。
IN 运算符是多个 OR 条件的简写。
<?php
$sprawdzone_temp = array($nadawca);
$in = str_repeat('?,', count($sprawdzone_temp) - 1) . '?';
$sql = "UPDATE database.table SET `nieaktualny` = 1 WHERE `email_1` in($in)";
$stmt = $db->prepare($sql);
$stmt->execute($sprawdzone_temp);
if (!$stmt) {
echo "nPDO::errorInfo():n";
print_r($db->errorInfo());
} else {
echo "record updated";
}
?>
tl;博士我不得不strip_tags
应用于后来在PDO查询中使用的电子邮件。
问题不在于与查询相关的任何内容。来自$sprawdzone_temp
数组的电子邮件未正确准备。当我print_r
数组时,它看起来很正常,只有正确的电子邮件地址,没有任何空格或类似内容。当我将它们从print_r
复制粘贴到 phpMyAdmin 时,查询工作正常,但似乎有一些非法字符中断了 SQL 查询的 LIKE 条件。
当我在将电子邮件地址插入$sprawdzone_temp
数组时随机尝试应用strip_tags
时,我已经修复了这个问题。现在它起作用了。只是出于好奇 - 我可以以某种方式打印所有字符的值 - 只是为了检查导致 PDO 查询停止的字符?