如何将 PHP 逗号分隔的字符串集成到 SQL 查询中?

Posted

技术标签:

【中文标题】如何将 PHP 逗号分隔的字符串集成到 SQL 查询中?【英文标题】:How to integrate PHP comma separated String in to SQL Query? 【发布时间】:2018-08-03 07:38:37 【问题描述】:

不幸的是,我不明白...

我有一个 php 变量,其中包含逗号分隔的数字作为字符串:

$var = $_POST['postvar'];

并且 postvar 包含字符串:1,2,3,4,5,6,7,8,9,10

我想在 SQL 查询中使用这个字符串:

SELECT * FROM table WHERE id NOT IN ('$var');

但是 MS SQL 忽略了我的身份限制。

错在哪里?

非常感谢!

【问题讨论】:

WHERE id NOT IN ('1,2,3,4,5,6,7,8,9,10'); 将在由一个字符串文字组成的列表中查找整数。 警告:您对SQL Injections 持开放态度,应该真正使用参数化Prepared Statements,而不是像那样手动构建查询。特别是因为您根本没有逃避用户输入! IN() 与prepared statements 一起使用时,您需要动态创建占位符。这是一个答案:***.com/questions/3703180/…。那是给mysql的,但是原理是一样的(不知道你用的是什么mssql-api)。 【参考方案1】:

不要在 SQL 查询中使用连接!

首先要么检查 每个 值是一个 int 还是强制转换它,例如:

<?php

$var = '1,2,3,4,5,6,7,8,9,10,11);DROP table users;--';

$var = explode(',', $var);

array_walk($var, function(&$value)
    $value = (int) $value;
);

print_r($var);

https://3v4l.org/AGRqL

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
    [7] => 8
    [8] => 9
    [9] => 10
    [10] => 0
)

然后在构建查询字符串后使用准备好的查询 [sqlsrv_prepare()]:

$sql = '
    SELECT * 
    FROM table 
    WHERE id NOT IN (
        '.implode(',', array_fill(0, count($var), '?')).'
    )
';

echo $sql;

https://3v4l.org/oU6iB

【讨论】:

谢谢第一部分效果很好!但是查询部分仍然不起作用:您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的“)”附近使用正确的语法 MariaDB 不是MS SQL 你的意思是MY SQL?,在运行之前打印你的语句,我贴的SQL 代码没问题。 p.s 还显示了您用于查询数据库的代码..(所以我可以更新手册的链接)。 print_r 显示:SELECT * FROM table WHERE id NOT IN ( ); 那么$var 为空。需要查看您的代码才能知道原因。

以上是关于如何将 PHP 逗号分隔的字符串集成到 SQL 查询中?的主要内容,如果未能解决你的问题,请参考以下文章

php如何将逗号分隔的多个json格式的字符串作为一个值插入到mysql表中? [复制]

sql 如何将查出来的一列用逗号拼接

如何将 PHP 数组表示为逗号分隔的字符串? [复制]

PHP:使用逗号分隔值创建字符串,但字符串末尾没有逗号

如何根据一个字段是不是包含oracle sql中的逗号分隔字符串将单行拆分为多行?

将逗号分隔值转换为双引号逗号分隔字符串