我的POST表单发送一个值&messages=12,11
我用的是:$messages = $ep->remove($_POST["messages"]);
我的SQL字符串是:
$query = $db->prepare("DELETE FROM messages WHERE messageID IN ('".$messages."') AND accountID=:accountID");
$query->execute([':accountID' => $accountID]);错误出现了..。
<b>Fatal error</b>: Uncaught exception 'PDOException' with message 'SQLSTATE[22007]: Invalid datetime format: 1292 Truncated incorrect DOUBLE value: '12,11'' in /var/www/vhosts/xxx.xxx/xx/xxx/xx/xxxx/messages.php:17此代码从数据库中删除多个消息。但别为我工作。有什么解决办法吗?
发布于 2019-04-07 13:21:03
删除引号:
$query = $db->prepare("DELETE FROM messages WHERE messageID IN (".$messages.") AND accountID=:accountID");否则,您要发送的值是12,11 (根据数据库定义它不是一个数字),而不是12和11,它们都是数字。
最后,这个特定的查询结构对SQL注入开放。您可能希望清理$messages变量(因为它只能包含数字),或者创建准备好的语句。
对于本例,消毒可以如下所示:
$messages = preg_replace('/[^0-9,]/', '', $messages);
//Removes all characters besides numbers and commas还可以确保数值消息ID列表始终与以下regex模式匹配:
$\d+(?:,\d+)*$也就是说,参数应该始终是某个数字,后面跟着一个可选的,\d+项。
if (!preg_match("/^\d+(?:,\d+)*$/", $messages)) {
// throw an exception, you are being injected
}发布于 2019-04-07 13:46:28
为了补充另一个答案,下面是一种正确准备所有值的方法
$array = explode(',', '1,2,3,4,5,6');
$keys = preg_replace('/(.+)/', ':v\1', array_keys($array));
print_r($keys);
$sql = "DELETE FROM messages WHERE messageID IN ( ".implode(',', $keys)." ) AND accountID=:accountID";
print_r($sql);
$params = array_combine($keys,$array);
$params['accountID'] = 'foo';
print_r($params);
//$stmt->execute($params);输出
//print_r($keys);
Array
(
[0] => :v0
[1] => :v1
[2] => :v2
[3] => :v3
[4] => :v4
[5] => :v5
)
//print_r($sql);
DELETE FROM messages WHERE messageID IN ( :v0,:v1,:v2,:v3,:v4,:v5 ) AND accountID=:accountID
//print_r($params);
Array
(
[:v0] => 1
[:v1] => 2
[:v2] => 3
[:v3] => 4
[:v4] => 5
[:v5] => 6
[accountID] => foo
)沙盒
这实在是太过分了,不能发表评论。
基本上,它使用键并使用preg替换,我们可以获取顺序数字并向其添加一个字符串(占位符必须以alpha开头)。从技术上讲,用于执行的数组中的:是可选的。
然后,我们可以将其放入查询中,因为所有这些都是由PHP生成的,因为密钥是由from生成的。如果您有来自POST的键,不要使用那些,而是使用array_keys(array_values($array))数组值将数组进行数字索引,然后使用这些键。
接下来,使用数组组合,我们可以将这些键合并回原始值,并将该数组放入execute中。
--在本例中是--您可以使用正则表达式来完成,但是我想展示一些对于更复杂的IN案例有用的东西。
https://stackoverflow.com/questions/55559445
复制相似问题