我知道pdo不支持在一个语句中执行多个查询。我一直在google上搜索,发现很少有关于pdo\umysql和pdo\umysqlnd的帖子。
pdoèumysql是一个比其他任何传统mysql应用程序更危险的应用程序。传统的mysql只允许一个sql查询。在pdoèumysql中没有这样的限制,但是您有被注入多个查询的风险。
来自:使用pdo和zend框架防止sql注入(2010年6月;(朱利安)
看起来pdo_mysql和pdo_mysqlnd确实提供了对多个查询的支持,但是我找不到关于它们的更多信息。这些项目停止了吗?现在有没有办法使用pdo运行多个查询。
7条答案
按热度按时间vyu0f0g11#
又快又脏的方法:
在合理的sql语句端点处拆分。没有错误检查,没有注入保护。使用前先了解自己的用途。就我个人而言,我使用它来为集成测试播种原始迁移文件。
lnvxswe22#
pdo确实支持这一点(截至2020年)。只需像往常一样对pdo对象执行query()调用,按分隔查询;然后使用nextrowset()转到下一个select结果(如果有多个)。结果集的顺序与查询相同。很明显,请考虑安全性问题—所以不要接受用户提供的查询、使用参数等。例如,我将其用于代码生成的查询。
weylhg0b3#
尝试了以下代码
然后
得到了
如果添加
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
之后$db = ...
然后是空白页如果相反
SELECT
尝试DELETE
,然后在这两种情况下都会出现如下错误所以我的结论是不可能注射。。。
68bkxrlz4#
据我所知,
PDO_MYSQLND
已替换PDO_MYSQL
在PHP5.3中。令人困惑的是这个名字仍然是PDO_MYSQL
. 所以现在nd是mysql+pdo的默认驱动程序。总之,要同时执行多个查询,您需要:
PHP5.3+
mysqlnd公司
模拟准备好的语句。确保
PDO::ATTR_EMULATE_PREPARES
设置为1
(默认)。或者,您可以避免使用准备好的语句并使用$pdo->exec
直接。使用exec
使用语句
注意:
使用模拟的准备语句时,请确保在dsn中设置了正确的编码(反映实际的数据编码)(从5.3.6开始提供)。否则,如果使用一些奇数编码,那么sql注入的可能性很小。
mwecs4sa5#
像成千上万的人一样,我在寻找这个问题:
可以同时运行多个查询,如果有一个错误,没有一个会运行我去这个页面到处
但是,尽管这里的朋友给出了很好的答案,这些答案对我的问题并不好
所以我写了一个很好的函数,几乎没有sql注入的问题。
它可能会对那些正在寻找类似问题的人有所帮助,所以我把它们放在这里使用
使用(示例):
和我的联系:
注:
这个解决方案可以帮助您同时运行多个语句,
如果出现错误的a语句,它不会执行任何其他语句
mqxuamgl6#
尝试此函数:mltiple查询和多值插入。
dxpyg8gm7#
经过半天的摆弄,发现pdo有一个错误,在那里。。。
--
--
它将执行
"valid-stmt1;"
,停止"non-sense;"
永远不要犯错误。不会运行"valid-stmt3;"
,说实话,说一切都很好。我希望它会出错
"non-sense;"
但事实并非如此。我在这里找到了以下信息:invalid pdo query不返回错误
以下是错误:https://bugs.php.net/bug.php?id=61613
所以,我试着用mysqli来做这件事,但还没有找到任何可靠的答案,所以我想我应该把它留给那些想用它的人。。