我有一堆行,nieaktualny
列(TINYINT(1)
)从0到1修改为email_1
字段等于数组$sprawdzone_temp
中的值的所有行。我通过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似乎有问题。
答案 0 :(得分:1)
我怀疑您的$sprawdzone_temp
可能没有{{3}}
通配符用于替换字符串中的任何其他字符。
通配符与SQL LIKE运算符一起使用。 LIKE运算符在WHERE子句中用于搜索列中的指定模式。
有两个通配符与LIKE运算符一起使用:
2。 (_) - 下划线表示单个字符
因此,您的代码应该遵循这些方针:
<?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";
}
?>
答案 1 :(得分:0)
<强> TL;博士强>
我必须将strip_tags
应用于稍后在PDO查询中使用的电子邮件。
问题与查询无关。来自$sprawdzone_temp
阵列的电子邮件未正确准备。当我print_r
对数组进行编辑时,它看起来正常,只有正确的电子邮件地址没有任何空格或类似。当我将它们从print_r
复制粘贴到phpMyAdmin时,查询工作正常,但似乎有一些非法字符正在中断SQL查询的LIKE条件。
我已修复当我在将strip_tags
数组插入电子邮件地址时随机尝试应用$sprawdzone_temp
时。现在它有效。只是出于好奇 - 我可以以某种方式打印出所有角色 - 只是为了检查那里导致PDO查询停止的角色?