我的 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
此代码从数据库中删除 多个 消息。但是不要为我工作。可以解决吗?
答案 0 :(得分:1)
删除引号:
$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的列表始终与以下正则表达式模式匹配:
$\d+(?:,\d+)*$
也就是说,该参数应始终为某个数字,后跟可选数量的,\d+
个词
if (!preg_match("/^\d+(?:,\d+)*$/", $messages)) {
// throw an exception, you are being injected
}
答案 1 :(得分:0)
只需添加另一个答案,这是一种正确准备所有值的方法
$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 replace,我们可以获取序列号并向其添加字符串(占位符必须以字母开头)。从技术上讲,要执行的数组中的:
是可选的。
然后我们可以将其放入查询中,因为所有这些都是由PHP生成的,因为键是由explode制成的。如果您有POST中的键,请不要使用这些键,而应使用array_keys(array_values($array))
数组值将使该数组被数字索引,然后使用这些键。
接下来使用数组组合,我们可以将这些键合并回原始值,并将该数组放入execute
在这种情况下,您可以使用正则表达式进行操作,但是我想展示一些对更复杂的IN案例有用的东西。