我确实知道PDO不支持在一条语句中执行多个查询。我一直在谷歌上搜索,发现很少有帖子讨论PDO_MYSQL和PDO_MYSQLND。
PDO_MySQL是一个比其他传统MySQL应用程序更危险的应用程序。传统MySQL只允许一个SQL查询。PDO_MySQL没有这样的限制,但您有被注入多个查询的风险。
发件人:Protection against SQL Injection using PDO and Zend Framework (June 2010; by Julian)
似乎PDO_MYSQL和PDO_MYSQLND确实提供了对多个查询的支持,但是我无法找到关于它们的更多信息。这些项目已经停止了吗?现在是否有任何方法可以使用PDO运行多个查询?
7条答案
按热度按时间hfwmuf9z1#
据我所知,在PHP 5.3中,
PDO_MYSQLND
取代了PDO_MYSQL
。令人困惑的是,名称仍然是PDO_MYSQL
。所以现在ND是MySQL+PDO的默认驱动程序。总之,要一次执行多个查询,您需要:
PDO::ATTR_EMULATE_PREPARES
设定为1
(预设值)。或者,您可以避免使用预准备陈述式,而直接使用$pdo->exec
。使用exec
使用语句
注意:
使用模拟预准备语句时,确保在DSN(从5.3.6开始可用)中设置了正确的编码(反映实际数据编码)。否则为there can be a slight possibility for SQL injection if some odd encoding is used。
vfhzx4xs2#
在摆弄了半天这个之后,发现PDO有一个bug在那里...
--
--
它将执行
"valid-stmt1;"
,在"non-sense;"
停止,并且从不抛出错误。将不运行"valid-stmt3;"
,返回true,并谎称一切运行良好。我希望它在
"non-sense;"
上出错,但它没有。这里是我找到这个信息的地方:Invalid PDO query does not return an error
下面是错误:https://bugs.php.net/bug.php?id=61613
所以,我试着用mysqli做这个,还没有真正找到任何关于它如何工作的可靠答案,所以我想我只是把它留在这里给那些想使用它的人。
btqmn9zl3#
快速而肮脏的方法:
在合理的SQL语句结束点拆分。没有错误检查,没有注入保护。在使用它之前了解您的使用。就个人而言,我使用它来播种原始迁移文件以进行集成测试。
smdnsysy4#
Like thousands of people, I'm looking for this question:
Can run multiple queries simultaneously, and if there was one error, none would run I went to this page everywhere
But although the friends here gave good answers, these answers were not good for my problem
So I wrote a function that works well and has almost no problem with sql Injection.
It might be helpful for those who are looking for similar questions so I put them here to use
for use(example):
and my connection:
Note:
This solution helps you to run multiple statement together,
If an incorrect a statement occurs, it does not execute any other statement
cyej8jka5#
PDO确实支持这一点(截至2020年)。然后调用nextRowset(),如果您有多个SELECT结果,那么它将跳转到下一个SELECT结果。结果集的顺序将与查询的顺序相同。显然,请考虑安全隐患-因此不要接受用户提供的查询,使用参数等。例如,我将它用于由代码生成的查询。
ggazkfy86#
请尝试以下功能:多个查询和多个值插入。
rqqzpn5f7#
已尝试以下代码
然后
而且得到了
如果在
$db = ...
之后添加$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
然后得到空白页
如果改为
SELECT
尝试DELETE
,则在这两种情况下都会出现如下错误所以我的结论是不可能注射...