PDF(美国Ltr)- 2.4 mb
PDF (A4)- 2.4 mb
MySQL可选地允许在一个语句字符串中包含多个语句,但这需要特殊处理。
必须执行多个语句或多个查询mysqli: multi_query
.语句字符串中的各个语句用分号分隔。然后,必须获取所执行语句返回的所有结果集。
MySQL服务器允许在多个语句中有返回结果集的语句和不返回结果集的语句。
例3.23多条语句
<?php mysqli_report(MYSQLI_REPORT_ERROR);$mysqli = new mysqli("example.com", "user", "password", "database");$mysqli->查询("DROP TABLE IF EXISTS test");$mysqli->查询("CREATE TABLE test(id INT)");$sql = "SELECT COUNT(*) AS _num FROM test;INSERT INTO test(id) VALUES (1);SELECT COUNT(*) FROM test;”;mysqli - > multi_query ($ sql); do { if ($result = $mysqli->store_result()) { var_dump($result->fetch_all(MYSQLI_ASSOC)); $result->free(); } } while ($mysqli->next_result());
上面的例子将输出:
数组(1){[0]=>数组(1){["_num"]=> string(1)“0”}}数组(1){[0]= >数组(1){[“_num”]= >字符串(1)"1"}}
安全注意事项
API函数mysqli:查询
而且mysqli: real_query
不要设置激活服务器中多个查询所需的连接标志。对多条语句使用额外的API调用,以减少意外SQL注入攻击的破坏。攻击者可能会尝试添加如下语句;DROP DATABASE mysql
或;选择睡眠(999)
.如果攻击者成功地将SQL添加到语句字符串butmysqli: multi_query
,服务器将不会执行注入的恶意SQL语句。
例3.24 SQL注入
<?PHP $mysqli = new mysqli("example.com", "用户","密码","数据库");$result = $mysqli->查询("SELECT 1;删除mysql.user表if (!$result) {echo "执行查询(")时出错。mysqli - > errno美元。”)”。mysqli - >错误;} ? >
上面的例子将输出:
执行查询时出错:(1064)SQL语法错误;查看MySQL服务器版本对应的手册,在'DROP TABLE MySQL '附近使用正确的语法。用户'在第1行
准备好的语句
不支持对预处理语句使用多重语句。
另请参阅
mysqli:查询 |
mysqli: multi_query |
mysqli: next_result |
mysqli: more_results |