Hướng dẫn multiple select mysql php - nhiều lựa chọn mysql php

MySQL tùy chọn cho phép có nhiều câu lệnh trong một chuỗi câu lệnh, nhưng nó yêu cầu xử lý đặc biệt.

Nhiều câu lệnh hoặc nhiều truy vấn phải được thực thi với mysqli :: multi_query (). Các câu lệnh riêng lẻ của chuỗi câu lệnh được phân tách bằng dấu chấm phẩy. Sau đó, tất cả các bộ kết quả được trả về bởi các câu lệnh được thực thi phải được tìm nạp.mysqli::multi_query(). The individual statements of the statement string are separated by semicolon. Then, all result sets returned by the executed statements must be fetched.

Máy chủ MySQL cho phép có các câu lệnh trả về các bộ kết quả và câu lệnh không trả về tập kết quả trong một câu lệnh.

Ví dụ #1 Câu lệnh

mysqli_report

(MYSQLI_REPORT_ERROR MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com""user""password""database");$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT)");$sql "SELECT COUNT(*) AS _num FROM test;
        INSERT INTO test(id) VALUES (1); 
        SELECT COUNT(*) AS _num 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());

Ví dụ trên sẽ xuất ra:

array(1) {
  [0]=>
  array(1) {
    ["_num"]=>
    string(1) "0"
  }
}
array(1) {
  [0]=>
  array(1) {
    ["_num"]=>
    string(1) "1"
  }
}

Cân nhắc về Bảo mật

API chức năng mysqli :: query () và mysqli :: real_query () không đặt cờ kết nối cần thiết để kích hoạt các truy vấn đa trong máy chủ. Một cuộc gọi API bổ sung được sử dụng cho nhiều tuyên bố để giảm thiệt hại của các cuộc tấn công tiêm SQL tình cờ. Kẻ tấn công có thể cố gắng thêm các câu lệnh như ; DROP DATABASE mysql hoặc ; SELECT SLEEP(999). Nếu kẻ tấn công thành công trong việc thêm SQL vào chuỗi câu lệnh nhưng mysqli::multi_query không được sử dụng, máy chủ sẽ không thực thi câu lệnh SQL được tiêm và độc hại.mysqli::query() and mysqli::real_query() do not set a connection flag necessary for activating multi queries in the server. An extra API call is used for multiple statements to reduce the damage of accidental SQL injection attacks. An attacker may try to add statements such as ; DROP DATABASE mysql or ; SELECT SLEEP(999). If the attacker succeeds in adding SQL to the statement string but mysqli::multi_query is not used, the server will not execute the injected and malicious SQL statement.

Ví dụ #2 SQL tiêm

$mysqli = new mysqli("example.com""user""password""database");
$result $mysqli->query("SELECT 1; DROP TABLE mysql.user");
if (!
$result) {
    echo 
"Error executing query: (" $mysqli->errno ") " $mysqli->error;
}
?>

Ví dụ trên sẽ xuất ra:

Error executing query: (1064) You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax 
to use near 'DROP TABLE mysql.user' at line 1

Cân nhắc về Bảo mật

API chức năng mysqli :: query () và mysqli :: real_query () không đặt cờ kết nối cần thiết để kích hoạt các truy vấn đa trong máy chủ. Một cuộc gọi API bổ sung được sử dụng cho nhiều tuyên bố để giảm thiệt hại của các cuộc tấn công tiêm SQL tình cờ. Kẻ tấn công có thể cố gắng thêm các câu lệnh như ; DROP DATABASE mysql hoặc ; SELECT SLEEP(999). Nếu kẻ tấn công thành công trong việc thêm SQL vào chuỗi câu lệnh nhưng mysqli::multi_query không được sử dụng, máy chủ sẽ không thực thi câu lệnh SQL được tiêm và độc hại.

Ví dụ #2 SQL tiêm

  • mysqli::query()
  • mysqli::multi_query()
  • mysqli::next_result()
  • mysqli::more_results()

Tuyên bố chuẩn bị

Việc sử dụng nhiều câu lệnh với các câu lệnh được chuẩn bị không được hỗ trợ.

Suggested improvement(s) to example 1.

Error executing query: (1064) You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax 
to use near 'DROP TABLE mysql.user' at line 1
0

Error executing query: (1064) You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax 
to use near 'DROP TABLE mysql.user' at line 1
1

Error executing query: (1064) You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax 
to use near 'DROP TABLE mysql.user' at line 1
2

Error executing query: (1064) You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax 
to use near 'DROP TABLE mysql.user' at line 1
3

Error executing query: (1064) You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax 
to use near 'DROP TABLE mysql.user' at line 1
4