Đã lâu rồi và có lẽ bạn đã tìm ra câu trả lời nhưng chỉ trong trường hợp, hóa ra đó thực sự là một vấn đề đơn giản trong đó bạn đặt trích dẫn và dấu chấm đôi trong câu lệnh MYSQLI truy vấn tại các giá trị ['". $ Username" '], nhưng nếu bạn chỉ để nó trong các trích dẫn đơn và chỉ viết tên biến bên trong các trích dẫn như, giá trị [' $ username '], nó sẽ hoạt động. Tôi nghĩ rằng nó áp dụng cho các phiên bản mới của PHP mặc dù không chắc chắn thay đổi
"INSERT INTO users [username, password, email, firstName, lastName, createDate] VALUES ['".$username."', 'test', 'test', 'test', 'test', 'test']"
đến
"INSERT INTO users [username, password, email, firstName, lastName, createDate] VALUES ['$username', 'test', 'test', 'test', 'test', 'test']"
Thông báo trong trường Giá trị Biến của tôi không được đặt trong các trích dẫn kép hoặc được nối trong các khoảng thời gian, tức là các giá trị ['$ username'], vì nó sẽ lưu các khoảng thời gian dưới dạng giá trị.
Điều này phù hợp với tôi nhưng tôi đã nhận thấy một vấn đề trong việc chạy truy vấn với cùng một giá trị một lần nữa, nó mang lại lỗi nhưng có thể tránh được bằng cách thêm một cột trong bảng cơ sở dữ liệu của bạn cho ID tăng tự động để đảm bảo rằng giá trị là được thay đổi mỗi khi bạn chạy truy vấn
Hi vọng điêu nay co ich
- Chạy truy vấn chèn với mysqli thô
- Giải trình
- Chèn truy vấn với hàm trợ giúp
- Chèn truy vấn từ một mảng
- Nó thường xảy ra rằng chúng ta có một mảng bao gồm các trường và các giá trị của chúng đại diện cho một hàng được chèn vào cơ sở dữ liệu. Và tự nhiên sẽ là một ý tưởng tốt để có một chức năng để chuyển đổi một mảng như vậy thành một câu lệnh SQL chèn chính xác và thực hiện nó. Vì vậy, ở đây nó đi [sử dụng hàm trợ giúp được đề cập ở trên nhưng bạn có thể dễ dàng viết lại nó thành RAW MySQLI nếu bạn muốn]:
Trước hết chức năng này sẽ cần một chức năng trợ giúp của riêng nó. Chúng tôi sẽ cần một chức năng để thoát khỏi số nhận dạng MySQL. Có, tất cả các định danh phải được trích dẫn và thoát ra, theo tiêu chuẩn MySQL, để tránh các vấn đề cú pháp khác nhau.prepared statements for any SQL query that would contain a PHP variable. Therefore, as usually the INSERT query makes little sense without variables, it should always run through a prepared statement. To do so:
- Và bây giờ chúng ta cuối cùng có thể có một chức năng chấp nhận tên bảng và một mảng có dữ liệu và chạy truy vấn chèn đã chuẩn bị đối với cơ sở dữ liệu:
Bài viết liên quan:function prepared_insert[$conn, $table, $data] {
$keys = array_keys[$data];
$keys = array_map['escape_mysql_identifier', $keys];
$fields = implode[",", $keys];
$table = escape_mysql_identifier[$table];
$placeholders = str_repeat['?,', count[$keys] - 1] . '?';
$sql = "INSERT INTO $table [$fields] VALUES [$placeholders]";
prepared_query[$conn, $sql, array_values[$data]];
}- MySQLI chọn truy vấn với các câu lệnh đã chuẩn bị
- Cách chạy truy vấn chọn bằng MySQLI
- Cách chạy truy vấn cập nhật bằng MySQLI
Câu lệnh đã chuẩn bị MySQLI với nhiều giá trị cho trong mệnh đề
Chạy truy vấn chèn với mysqli thô
Giải trình
Nhận xét [3]Không cần phải nói rằng bạn phải sử dụng các câu lệnh đã chuẩn bị cho bất kỳ truy vấn SQL nào có chứa biến PHP. Do đó, như thường thì truy vấn chèn có rất ít ý nghĩa mà không có biến, nó phải luôn luôn chạy qua một câu lệnh đã chuẩn bị. Làm như vậy:
Giải trình
Nhận xét [3]
$sql = "INSERT INTO users [name, email, password] VALUES [?,?,?]";
Không cần phải nói rằng bạn phải sử dụng các câu lệnh đã chuẩn bị cho bất kỳ truy vấn SQL nào có chứa biến PHP. Do đó, như thường thì truy vấn chèn có rất ít ý nghĩa mà không có biến, nó phải luôn luôn chạy qua một câu lệnh đã chuẩn bị. Làm như vậy:
Tạo câu lệnh SQL Chèn chính xác there should be no quotes around question marks, you are adding placeholders, not strings.
$stmt= $conn->prepare[$sql];
Thay thế tất cả các biến trong truy vấn bằng các dấu câu hỏi [được gọi là người giữ chỗ hoặc tham số]
$stmt->bind_param["sss", $name, $email, $passwor];
Sau đó các biến phải được liên kết với câu lệnh. Cuộc gọi bao gồm hai phần - chuỗi với các loại và danh sách các biến. Với MySQLI, bạn phải chỉ định loại cho từng biến bị ràng buộc. Nó được đại diện bởi một chữ cái duy nhất trong tham số đầu tiên. Số lượng chữ cái phải luôn bằng số lượng biến. Các loại có thể là
- Tôi cho số nguyên
- D FOF Double [Float]
- s cho chuỗi
- B cho đốm màu
Lưu ý rằng bạn hầu như luôn có thể sử dụng "S" một cách an toàn cho bất kỳ biến nào. that you can almost always safely use "s" for any variable.
Vì vậy, bạn có thể nói bây giờ rằng "SSS" có nghĩa là "sẽ có 3 biến, tất cả các loại chuỗi". Và sau đó, một cách tự nhiên, ba biến ngoan ngoãn làm theo.
$stmt->execute[];
Sau đó, truy vấn cuối cùng đã được thực thi. Có nghĩa là các biến được gửi đến máy chủ cơ sở dữ liệu và truy vấn thực sự được thực thi.
Lưu ý rằng bạn không phải kiểm tra kết quả thực thi. Cho bạn có mã kết nối thích hợp được đề cập ở trên, trong trường hợp lỗi MySQLI sẽ tự động tăng lỗi. that you don't have to check the execution result. Given you have the proper connection code mentioned above, in case of error mysqli will raise an error automatically.
Chèn truy vấn với hàm trợ giúp
Như bạn có thể lưu ý, mã khá dài dòng. Nếu bạn thích xây dựng một mã như một nhân vật Lego, với hàng ngũ các nhà khai thác tỏa sáng, bạn có thể giữ nó như hiện tại. Nếu bạn, giống như tôi, ghét sự lặp lại vô dụng và thích viết mã ngắn gọn và có ý nghĩa, thì có một chức năng trợ giúp đơn giản. Với nó, mã sẽ trở nên ngắn hơn hai lần:
$sql = "INSERT INTO users [name, email, password] VALUES [?,?,?]";
prepared_query[$conn, $sql, [$name, $email, $password]];
Ở đây chúng tôi đang gọi chức năng trợ giúp bằng cách sử dụng biến kết nối, truy vấn SQL và một mảng với các biến. Đơn giản, sạch sẽ và an toàn!
Chèn truy vấn từ một mảng
Nó thường xảy ra rằng chúng ta có một mảng bao gồm các trường và các giá trị của chúng đại diện cho một hàng được chèn vào cơ sở dữ liệu. Và tự nhiên sẽ là một ý tưởng tốt để có một chức năng để chuyển đổi một mảng như vậy thành một câu lệnh SQL chèn chính xác và thực hiện nó. Vì vậy, ở đây nó đi [sử dụng hàm trợ giúp được đề cập ở trên nhưng bạn có thể dễ dàng viết lại nó thành RAW MySQLI nếu bạn muốn]:
Trước hết chức năng này sẽ cần một chức năng trợ giúp của riêng nó. Chúng tôi sẽ cần một chức năng để thoát khỏi số nhận dạng MySQL. Có, tất cả các định danh phải được trích dẫn và thoát ra, theo tiêu chuẩn MySQL, để tránh các vấn đề cú pháp khác nhau.a function to escape MySQL identifiers. Yes, all identifiers must be quoted and escaped, according to MySQL standards, in order to avoid various syntax issues.
function escape_mysql_identifier[$field]{
return "`".str_replace["`", "``", $field]."`";
}
Và bây giờ chúng ta cuối cùng có thể có một chức năng chấp nhận tên bảng và một mảng có dữ liệu và chạy truy vấn chèn đã chuẩn bị đối với cơ sở dữ liệu:
function prepared_insert[$conn, $table, $data] {
$keys = array_keys[$data];
$keys = array_map['escape_mysql_identifier', $keys];
$fields = implode[",", $keys];
$table = escape_mysql_identifier[$table];
$placeholders = str_repeat['?,', count[$keys] - 1] . '?';
$sql = "INSERT INTO $table [$fields] VALUES [$placeholders]";
prepared_query[$conn, $sql, array_values[$data]];
}
Bài viết liên quan:Related articles:
- MySQLI chọn truy vấn với các câu lệnh đã chuẩn bị
- Cách chạy truy vấn chọn bằng MySQLI
- Cách chạy truy vấn cập nhật bằng MySQLI
- Câu lệnh đã chuẩn bị MySQLI với nhiều giá trị cho trong mệnh đề
- Sử dụng các câu lệnh đã chuẩn bị MySQLI với toán tử giống như trong SQL
- Ví dụ mysqli
- Cách gọi các thủ tục được lưu trữ với MySQLI
- Cách tạo bộ lọc tìm kiếm cho mysqli
- Làm thế nào để chạy các truy vấn chèn 1000s với MySQLI?