截断了错误的DOUBLE值:“ 12,11”

时间:2019-04-07 13:18:49

标签: php mysql

我的 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

此代码从数据库中删除 多个 消息。但是不要为我工作。可以解决吗?

2 个答案:

答案 0 :(得分:1)

删除引号:

$query = $db->prepare("DELETE FROM messages WHERE messageID IN (".$messages.") AND accountID=:accountID");

否则,您要发送的值是12,11(根据您的数据库定义,这不是数字),而不是1211,它们都是数字。

最后,这个特定的查询结构可以进行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
)

Sandbox

评论太多了。

基本上,它需要键,并且使用preg replace,我们可以获取序列号并向其添加字符串(占位符必须以字母开头)。从技术上讲,要执行的数组中的:是可选的。

然后我们可以将其放入查询中,因为所有这些都是由PHP生成的,因为键是由explode制成的。如果您有POST中的键,请不要使用这些键,而应使用array_keys(array_values($array))数组值将使该数组被数字索引,然后使用这些键。

接下来使用数组组合,我们可以将这些键合并回原始值,并将该数组放入execute

在这种情况下,您可以使用正则表达式进行操作,但是我想展示一些对更复杂的IN案例有用的东西。