首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >截断不正确的双值:'12,11'‘

截断不正确的双值:'12,11'‘
EN

Stack Overflow用户
提问于 2019-04-07 13:18:49
回答 2查看 481关注 0票数 0

我的POST表单发送一个值&messages=12,11

我用的是:$messages = $ep->remove($_POST["messages"]);

我的SQL字符串是:

代码语言:javascript
复制
$query = $db->prepare("DELETE FROM messages WHERE messageID IN ('".$messages."') AND accountID=:accountID");
$query->execute([':accountID' => $accountID]);

错误出现了..。

代码语言:javascript
复制
<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

此代码从数据库中删除多个消息。但别为我工作。有什么解决办法吗?

EN

回答 2

Stack Overflow用户

发布于 2019-04-07 13:21:03

删除引号:

代码语言:javascript
复制
$query = $db->prepare("DELETE FROM messages WHERE messageID IN (".$messages.") AND accountID=:accountID");

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

最后,这个特定的查询结构对SQL注入开放。您可能希望清理$messages变量(因为它只能包含数字),或者创建准备好的语句。

对于本例,消毒可以如下所示:

代码语言:javascript
复制
$messages = preg_replace('/[^0-9,]/', '', $messages);
//Removes all characters besides numbers and commas

还可以确保数值消息ID列表始终与以下regex模式匹配:

代码语言:javascript
复制
$\d+(?:,\d+)*$

也就是说,参数应该始终是某个数字,后面跟着一个可选的,\d+项。

代码语言:javascript
复制
if (!preg_match("/^\d+(?:,\d+)*$/", $messages)) {
    // throw an exception, you are being injected
}
票数 1
EN

Stack Overflow用户

发布于 2019-04-07 13:46:28

为了补充另一个答案,下面是一种正确准备所有值的方法

代码语言:javascript
复制
$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);

输出

代码语言:javascript
复制
//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案例有用的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55559445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档