如何将 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表中? [复制]