Hướng dẫn mysqli prepared statement insert not working - chèn câu lệnh chuẩn bị mysqli không hoạt động

Bạn có một vài biến không khớp.

0 -
1 -
2

được liên kết với và trong các ràng buộc của bạn:

3


Điều này sẽ hoạt động ngay bây giờ:

prepare($ins);
$num = 1;
$stmt->bind_param('isissis', $pid, $pname, $poster_id, $poster_name, $message, $num, $datetime);
$stmt->execute();

?>

Tuy nhiên, bạn nên thay thế

4 bằng
5

Để bắt các lỗi.

Đồng thời thêm báo cáo lỗi vào đầu (các) tệp của bạn sẽ giúp tìm lỗi.error reporting to the top of your file(s) which will help find errors.

mà sẽ báo hiệu một cảnh báo biến không xác định.

Sidenote: Báo cáo lỗi chỉ nên được thực hiện trong dàn dựng và không bao giờ sản xuất. Error reporting should only be done in staging, and never production.


Một cái nhìn sâu sắc

Như Ghost đã chỉ ra:

6 Định dạng
7 cũng đáng ngờ, nó có thể làm hỏng định dạng cột ____ 18 của cột
9 nếu nó thực sự theo cách đó.

do đó bạn có thể cần phải thay đổi

$datetime = date("M d, Y");

đến

$datetime = date("Y-m-d H:i:s");

hoặc

$datetime = date("Y-m-d");

Tùy thuộc vào loại cột của bạn được đặt thành.

n lần và phân tích cú pháp mọi lúc

Api liên kết tham số đầu vào

Đúng

Không, đầu vào thủ công thoát ra

API liên kết biến đầu ra

Không

$datetime = date("M d, Y");
1

$datetime = date("M d, Y");
2

$datetime = date("M d, Y");
3

Hỗ trợ sử dụng API mysqli_result

Có, sử dụng mysqli_stmt :: get_result ()

Bộ kết quả đệm

$datetime = date("M d, Y");
1

$datetime = date("M d, Y");
2

$datetime = date("M d, Y");
6

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

array(3) {
  [0]=>
  array(2) {
    ["id"]=>
    string(1) "1"
    ["label"]=>
    string(3) "PHP"
  }
  [1]=>
  array(2) {
    ["id"]=>
    string(1) "2"
    ["label"]=>
    string(4) "Java"
  }
  [2]=>
  array(2) {
    ["id"]=>
    string(1) "3"
    ["label"]=>
    string(3) "C++"
  }
}

Có, sử dụng mysqli_stmt :: get_result () hoặc ràng buộc với mysqli_stmt :: store_result ()

Có, mặc định của mysqli :: truy vấn ()

Ngoài ra, hãy xem xét việc sử dụng cú pháp SQL đa điểm của MySQL để chèn. Ví dụ, Multi-Insert yêu cầu ít chuyến đi vòng nào giữa máy chủ và máy khách so với câu lệnh đã chuẩn bị ở trên.

Ví dụ #3 Các chuyến đi vòng ít sử dụng SQL đa điểm

$datetime = date("M d, Y");
1

$datetime = date("M d, Y");
2

$datetime = date("Y-m-d H:i:s");
0

Kết quả đặt các loại dữ liệu giá trị

Giao thức máy khách MySQL định nghĩa một giao thức truyền dữ liệu khác nhau cho các câu lệnh đã chuẩn bị và các câu lệnh không được chuẩn bị. Các câu lệnh được chuẩn bị đang sử dụng cái gọi là giao thức nhị phân. Máy chủ MySQL gửi dữ liệu đặt kết quả "như là" ở định dạng nhị phân. Kết quả không được tuần tự hóa thành chuỗi trước khi gửi. Thư viện máy khách nhận được dữ liệu nhị phân và cố gắng chuyển đổi các giá trị thành các loại dữ liệu PHP phù hợp. Ví dụ: kết quả từ cột SQL

$datetime = date("Y-m-d H:i:s");
1 sẽ được cung cấp dưới dạng các biến số nguyên PHP.

Ví dụ #4 Kiểu dữ liệu gốc

$datetime = date("M d, Y");
1

$datetime = date("M d, Y");
2

$datetime = date("Y-m-d H:i:s");
4

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

id = 1 (integer)
label = PHP (string)

Hành vi này khác với các tuyên bố không chuẩn bị. Theo mặc định, các câu lệnh không được chuẩn bị trả về tất cả các kết quả dưới dạng chuỗi. Mặc định này có thể được thay đổi bằng cách sử dụng tùy chọn kết nối. Nếu tùy chọn kết nối được sử dụng, không có sự khác biệt.

Tìm nạp kết quả bằng cách sử dụng các biến bị ràng buộc

Kết quả từ các câu lệnh đã chuẩn bị có thể được truy xuất bằng cách liên kết các biến đầu ra hoặc bằng cách yêu cầu đối tượng mysqli_result.mysqli_result object.

Các biến đầu ra phải được ràng buộc sau khi thực thi câu lệnh. Một biến phải được ràng buộc cho mỗi cột của bộ kết quả câu lệnh.

Ví dụ #5 Liên kết biến đầu ra

$datetime = date("M d, Y");
1

$datetime = date("M d, Y");
2

$datetime = date("Y-m-d H:i:s");
7

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

id = 1 (integer), label = PHP (string)

Hành vi này khác với các tuyên bố không chuẩn bị. Theo mặc định, các câu lệnh không được chuẩn bị trả về tất cả các kết quả dưới dạng chuỗi. Mặc định này có thể được thay đổi bằng cách sử dụng tùy chọn kết nối. Nếu tùy chọn kết nối được sử dụng, không có sự khác biệt.

Tìm nạp kết quả bằng cách sử dụng các biến bị ràng buộcmysqli_stmt::store_result().

Kết quả từ các câu lệnh đã chuẩn bị có thể được truy xuất bằng cách liên kết các biến đầu ra hoặc bằng cách yêu cầu đối tượng mysqli_result.

Các biến đầu ra phải được ràng buộc sau khi thực thi câu lệnh. Một biến phải được ràng buộc cho mỗi cột của bộ kết quả câu lệnh.mysqli_stmt::get_result() returns a buffered result set.

Ví dụ #5 Liên kết biến đầu ra

$datetime = date("M d, Y");
1

$datetime = date("M d, Y");
2

$datetime = date("Y-m-d");
1

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

array(1) {
  [0]=>
  array(2) {
    ["id"]=>
    int(1)
    ["label"]=>
    string(3) "PHP"
  }
}

Hành vi này khác với các tuyên bố không chuẩn bị. Theo mặc định, các câu lệnh không được chuẩn bị trả về tất cả các kết quả dưới dạng chuỗi. Mặc định này có thể được thay đổi bằng cách sử dụng tùy chọn kết nối. Nếu tùy chọn kết nối được sử dụng, không có sự khác biệt.mysqli_result interface offers the additional benefit of flexible client-side result set navigation.

Tìm nạp kết quả bằng cách sử dụng các biến bị ràng buộc

$datetime = date("M d, Y");
1

$datetime = date("M d, Y");
2

$datetime = date("Y-m-d");
4

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

array(2) {
  ["id"]=>
  int(3)
  ["label"]=>
  string(3) "C++"
}
array(2) {
  ["id"]=>
  int(2)
  ["label"]=>
  string(4) "Java"
}
array(2) {
  ["id"]=>
  int(1)
  ["label"]=>
  string(3) "PHP"
}

Hành vi này khác với các tuyên bố không chuẩn bị. Theo mặc định, các câu lệnh không được chuẩn bị trả về tất cả các kết quả dưới dạng chuỗi. Mặc định này có thể được thay đổi bằng cách sử dụng tùy chọn kết nối. Nếu tùy chọn kết nối được sử dụng, không có sự khác biệt.

Tìm nạp kết quả bằng cách sử dụng các biến bị ràng buộcmysqli_stmt::bind_param() function for more information.

Kết quả từ các câu lệnh đã chuẩn bị có thể được truy xuất bằng cách liên kết các biến đầu ra hoặc bằng cách yêu cầu đối tượng mysqli_result.

Các biến đầu ra phải được ràng buộc sau khi thực thi câu lệnh. Một biến phải được ràng buộc cho mỗi cột của bộ kết quả câu lệnh.

Ví dụ #5 Liên kết biến đầu ra

Các câu lệnh đã chuẩn bị trả về các bộ kết quả không có bộ theo mặc định. Kết quả của câu lệnh không được tìm nạp và chuyển từ máy chủ một cách ngầm định sang máy chủ để đệm phía máy khách. Bộ kết quả lấy tài nguyên máy chủ cho đến khi tất cả các kết quả đã được khách hàng tìm nạp. Do đó, nên tiêu thụ kết quả kịp thời. Nếu một khách hàng không tìm nạp tất cả các kết quả hoặc máy khách đóng câu lệnh trước khi tìm nạp tất cả dữ liệu, dữ liệu phải được tìm nạp ngầm bởi

$datetime = date("Y-m-d H:i:s");
8.

Cũng có thể đệm kết quả của một câu lệnh đã chuẩn bị bằng cách sử dụng mysqli_stmt :: store_result ().

Hấp thụ kết quả bằng giao diện mysqli_result
  Thay vì sử dụng kết quả bị ràng buộc, kết quả cũng có thể được truy xuất thông qua giao diện mysqli_result. mysqli_stmt :: get_result () trả về một tập kết quả được đệm.Ví dụ #6 Sử dụng mysqli_result để tìm nạp kết quả
Sử dụng giao diện MySQLI_Result cung cấp lợi ích bổ sung của điều hướng thiết lập kết quả phía khách hàng linh hoạt.2 1
Ví dụ #7 Bộ kết quả được bộ đệm để đọc linh hoạt1 1
Thoát ra và tiêm SQL Các biến ràng buộc được gửi đến máy chủ riêng biệt với truy vấn và do đó không thể can thiệp vào nó. Máy chủ sử dụng các giá trị này trực tiếp tại điểm thực thi, sau khi mẫu câu lệnh được phân tích cú pháp. Các tham số ràng buộc không cần phải thoát ra vì chúng không bao giờ được thay thế trực tiếp vào chuỗi truy vấn. Một gợi ý phải được cung cấp cho máy chủ cho loại biến ràng buộc, để tạo chuyển đổi thích hợp. Xem hàm mysqli_stmt :: bind_param () để biết thêm thông tin. Một sự tách biệt như vậy đôi khi được coi là tính năng bảo mật duy nhất để ngăn chặn tiêm SQL, nhưng cùng một mức độ bảo mật có thể đạt được với các câu lệnh không được chuẩn bị, nếu tất cả các giá trị được định dạng chính xác. Cần lưu ý rằng định dạng chính xác không giống như thoát ra và liên quan đến logic nhiều hơn so với việc trốn thoát đơn giản. Do đó, các câu lệnh được chuẩn bị chỉ đơn giản là một cách tiếp cận thuận tiện hơn và dễ bị lỗi hơn đối với yếu tố bảo mật cơ sở dữ liệu này.
Ví dụ #7 Bộ kết quả được bộ đệm để đọc linh hoạt Thoát ra và tiêm SQL Các biến ràng buộc được gửi đến máy chủ riêng biệt với truy vấn và do đó không thể can thiệp vào nó. Máy chủ sử dụng các giá trị này trực tiếp tại điểm thực thi, sau khi mẫu câu lệnh được phân tích cú pháp. Các tham số ràng buộc không cần phải thoát ra vì chúng không bao giờ được thay thế trực tiếp vào chuỗi truy vấn. Một gợi ý phải được cung cấp cho máy chủ cho loại biến ràng buộc, để tạo chuyển đổi thích hợp. Xem hàm mysqli_stmt :: bind_param () để biết thêm thông tin.
Một sự tách biệt như vậy đôi khi được coi là tính năng bảo mật duy nhất để ngăn chặn tiêm SQL, nhưng cùng một mức độ bảo mật có thể đạt được với các câu lệnh không được chuẩn bị, nếu tất cả các giá trị được định dạng chính xác. Cần lưu ý rằng định dạng chính xác không giống như thoát ra và liên quan đến logic nhiều hơn so với việc trốn thoát đơn giản. Do đó, các câu lệnh được chuẩn bị chỉ đơn giản là một cách tiếp cận thuận tiện hơn và dễ bị lỗi hơn đối với yếu tố bảo mật cơ sở dữ liệu này. Mô phỏng tuyên bố chuẩn bị phía khách hàng API không bao gồm mô phỏng cho mô phỏng câu lệnh được chuẩn bị phía khách hàng.
So sánh nhanh các tuyên bố đã chuẩn bị và không chuẩn bị Mô phỏng tuyên bố chuẩn bị phía khách hàng API không bao gồm mô phỏng cho mô phỏng câu lệnh được chuẩn bị phía khách hàng.
So sánh nhanh các tuyên bố đã chuẩn bị và không chuẩn bị Bảng dưới đây so sánh các câu lệnh được chuẩn bị và không chuẩn bị phía máy chủ.mysqli_stmt::get_result() Mô phỏng tuyên bố chuẩn bị phía khách hàng
API không bao gồm mô phỏng cho mô phỏng câu lệnh được chuẩn bị phía khách hàng.Có, sử dụng mysqli_stmt :: get_result () hoặc ràng buộc với mysqli_stmt :: store_result ()mysqli_stmt::get_result() or binding with mysqli_stmt::store_result() Có, mặc định của mysqli :: truy vấn ()mysqli::query()
Bộ kết quả không bị ảnh hưởngCó, sử dụng API liên kết đầu ra Có, sử dụng mysqli :: real_query () với mysqli :: use_result ()mysqli::real_query() with mysqli::use_result()
Hương vị truyền dữ liệu giao thức máy khách MySQLGiao thức nhị phânGiao thức văn bản
Kết quả đặt giá trị các loại dữ liệu SQLĐược bảo tồn khi tìm nạpĐược chuyển đổi thành chuỗi hoặc được bảo tồn khi tìm nạp
Hỗ trợ tất cả các câu lệnh SQLCác phiên bản MySQL gần đây hỗ trợ hầu hết nhưng không phải tất cảĐúng

Xem thêm

  • mysqli::__construct()
  • mysqli::query()
  • mysqli::prepare()
  • mysqli_stmt::prepare()
  • mysqli_stmt::execute()
  • mysqli_stmt::bind_param()
  • mysqli_stmt::bind_result()

Không có người dùng đóng góp ghi chú cho trang này.