Hướng dẫn insert query in php with variables - chèn truy vấn trong php với các biến

Các quy tắc của việc thêm một biến PHP bên trong bất kỳ câu lệnh MySQL nào là đơn giản và đơn giản:

1. Sử dụng các câu lệnh đã chuẩn bị

Quy tắc này bao gồm 99% truy vấn và truy vấn của bạn nói riêng. Bất kỳ biến nào đại diện cho một dữ liệu SQL theo nghĩa đen, (hoặc, để đặt nó đơn giản - một chuỗi SQL hoặc một số) phải được thêm vào thông qua một câu lệnh đã chuẩn bị. Không có ngoại lệ.

Cách tiếp cận này bao gồm bốn bước cơ bản

  • Trong câu lệnh SQL của bạn, thay thế tất cả các biến bằng trình giữ chỗ
  • Chuẩn bị truy vấn kết quả
  • Liên kết các biến với người giữ chỗ
  • thực hiện truy vấn

Và đây là cách làm điều đó với tất cả các trình điều khiển cơ sở dữ liệu PHP phổ biến:

Thêm dữ liệu theo nghĩa đen bằng cách sử dụng
$reporter = "John O'Hara";
$stmt = $mysqli->prepare("SELECT * FROM users WHERE name=?");
$stmt->bind_param("s", $reporter);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc(); // or while (...)
4
$type = 'testing';
$reporter = "John O'Hara";
$query = "INSERT INTO contents (type, reporter, description) 
             VALUES(?, ?, 'whatever')";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("ss", $type, $reporter);
$stmt->execute();

Mã này hơi phức tạp nhưng lời giải thích chi tiết về tất cả các toán tử này có thể được tìm thấy trong bài viết của tôi, cách chạy truy vấn chèn bằng MySQLI, cũng như một giải pháp giúp giảm đáng kể quá trình.

Đối với một truy vấn được chọn, bạn sẽ cần thêm một cuộc gọi vào phương thức

$reporter = "John O'Hara";
$stmt = $mysqli->prepare("SELECT * FROM users WHERE name=?");
$stmt->bind_param("s", $reporter);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc(); // or while (...)
5 để có được một
$reporter = "John O'Hara";
$stmt = $mysqli->prepare("SELECT * FROM users WHERE name=?");
$stmt->bind_param("s", $reporter);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc(); // or while (...)
6 quen thuộc mà bạn có thể tìm nạp dữ liệu theo cách thông thường:

$reporter = "John O'Hara";
$stmt = $mysqli->prepare("SELECT * FROM users WHERE name=?");
$stmt->bind_param("s", $reporter);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc(); // or while (...)
Thêm dữ liệu theo nghĩa đen bằng cách sử dụng PDO
$type = 'testing';
$reporter = "John O'Hara";
$query = "INSERT INTO contents (type, reporter, description) 
             VALUES(?, ?, 'whatever')";
$stmt = $pdo->prepare($query);
$stmt->execute([$type, $reporter]);

Trong PDO, chúng ta có thể có các bộ phận liên kết và thực thi kết hợp, rất thuận tiện. PDO cũng hỗ trợ các khoản giữ chỗ được đặt tên mà một số người tìm thấy cực kỳ thuận tiện.

2. Sử dụng lọc danh sách trắng

Bất kỳ phần truy vấn nào khác, chẳng hạn như từ khóa SQL, bảng hoặc tên trường hoặc toán tử - phải được lọc qua danh sách màu trắng.white list.

Đôi khi chúng ta phải thêm một biến đại diện cho một phần khác của truy vấn, chẳng hạn như từ khóa hoặc mã định danh (cơ sở dữ liệu, bảng hoặc tên trường). Đó là một trường hợp hiếm hoi nhưng tốt hơn là nên chuẩn bị.

Trong trường hợp này, biến của bạn phải được kiểm tra dựa trên danh sách các giá trị được viết rõ ràng trong tập lệnh của bạn. Điều này được giải thích trong bài viết khác của tôi, thêm một tên trường theo thứ tự theo mệnh đề dựa trên sự lựa chọn của người dùng:explicitly written in your script. This is explained in my other article, Adding a field name in the ORDER BY clause based on the user's choice:

Thật không may, PDO không có trình giữ chỗ cho số nhận dạng (tên bảng và trường), do đó, một nhà phát triển phải lọc chúng ra bằng tay. Một bộ lọc như vậy thường được gọi là "danh sách trắng" (trong đó chúng tôi chỉ liệt kê các giá trị cho phép) trái ngược với "danh sách đen" trong đó chúng tôi liệt kê các giá trị không được phép.

Vì vậy, chúng tôi phải liệt kê rõ ràng tất cả các biến thể có thể trong mã PHP và sau đó chọn từ chúng.

Đây là một ví dụ:

$orderby = $_GET['orderby'] ?: "name"; // set the default value
$allowed = ["name","price","qty"]; // the white list of allowed field names
$key = array_search($orderby, $allowed, true); // see if we have such a name
if ($key === false) { 
    throw new InvalidArgumentException("Invalid field name"); 
}

Chính xác thì cách tiếp cận tương tự nên được sử dụng cho hướng,

$direction = $_GET['direction'] ?: "ASC";
$allowed = ["ASC","DESC"];
$key = array_search($direction, $allowed, true);
if ($key === false) { 
    throw new InvalidArgumentException("Invalid ORDER BY direction"); 
}

Sau một mã như vậy, cả hai biến

$reporter = "John O'Hara";
$stmt = $mysqli->prepare("SELECT * FROM users WHERE name=?");
$stmt->bind_param("s", $reporter);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc(); // or while (...)
7 và
$reporter = "John O'Hara";
$stmt = $mysqli->prepare("SELECT * FROM users WHERE name=?");
$stmt->bind_param("s", $reporter);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc(); // or while (...)
8 đều có thể được đặt một cách an toàn vào truy vấn SQL, vì chúng bằng một trong các biến thể được phép hoặc sẽ có lỗi.

Điều cuối cùng cần đề cập đến các định danh, chúng cũng phải được định dạng theo cú pháp cơ sở dữ liệu cụ thể. Đối với MySQL, nó phải là

$reporter = "John O'Hara";
$stmt = $mysqli->prepare("SELECT * FROM users WHERE name=?");
$stmt->bind_param("s", $reporter);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc(); // or while (...)
9 ký tự xung quanh định danh. Vì vậy, chuỗi truy vấn cuối cùng cho đơn đặt hàng của chúng tôi bằng ví dụ sẽ là

$query = "SELECT * FROM `table` ORDER BY `$orderby` $direction";

  1. Chạy truy vấn chèn với mysqli thô
  2. Giải trình
  3. Chèn truy vấn với hàm trợ giúp
  4. Chèn truy vấn từ một mảng
  5. 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:
  • $reporter = "John O'Hara";
    $stmt = $mysqli->prepare("SELECT * FROM users WHERE name=?");
    $stmt->bind_param("s", $reporter);
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_assoc(); // or while (...)
    
    3 Bài viết liên quan:
  • Chuẩn bị truy vấn kết quả
  • Liên kết các biến với người giữ chỗ
  • thực hiện truy vấn

Chỉ cần đảm bảo rằng bạn đã có một biến kết nối MySQLI được cấu hình đúng cách được yêu cầu để chạy các truy vấn SQL và thông báo cho bạn về các lỗi có thể xảy ra.

Chạy truy vấn chèn với mysqli thô

Chỉ cần viết một mã như trong ví dụ này

$sql "INSERT INTO users (name, email, password) VALUES (?,?,?)";
$stmt$conn->prepare($sql);
$stmt->bind_param("sss"$name$email$password);
$stmt->execute();

và thực thi truy vấn của bạn mà không có một lỗi cú pháp hoặc tiêm SQL!

Giải trình

Chuyện gì đang xảy ra ở đây?

$sql "INSERT INTO users (name, email, password) VALUES (?,?,?)";

Giống như đã nói ở trên, đầu tiên chúng tôi đang viết một truy vấn SQL trong đó tất cả các biến được thay thế bằng các dấu hỏi.

QUAN TRỌNG! Không nên có trích dẫn xung quanh dấu hỏi, bạn đang thêm chỗ giữ chỗ, không phải chuỗi. there should be no quotes around question marks, you are adding placeholders, not strings.

$stmt$conn->prepare($sql);

Sau đó, truy vấn được chuẩn bị. Ý tưởng rất thông minh. Để tránh ngay cả khả năng tiêm SQL hoặc lỗi cú pháp do dữ liệu đầu vào gây ra, truy vấn và dữ liệu được gửi đến máy chủ cơ sở dữ liệu một cách riêng biệt. Vì vậy, nó tiếp tục ở đây: Với

$type = 'testing';
$reporter = "John O'Hara";
$query = "INSERT INTO contents (type, reporter, description) 
             VALUES(?, ?, 'whatever')";
$stmt = $pdo->prepare($query);
$stmt->execute([$type, $reporter]);
0, chúng tôi đang gửi truy vấn đến máy chủ cơ sở dữ liệu phía trước. Một biến đặc biệt, một câu lệnh được tạo ra. Chúng tôi sẽ sử dụng biến này kể từ bây giờ.

$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.

$reporter = "John O'Hara";
$stmt = $mysqli->prepare("SELECT * FROM users WHERE name=?");
$stmt->bind_param("s", $reporter);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc(); // or while (...)
0

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:

$reporter = "John O'Hara";
$stmt = $mysqli->prepare("SELECT * FROM users WHERE name=?");
$stmt->bind_param("s", $reporter);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc(); // or while (...)
1

Ở đâ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.

$reporter = "John O'Hara";
$stmt = $mysqli->prepare("SELECT * FROM users WHERE name=?");
$stmt->bind_param("s", $reporter);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc(); // or while (...)
2

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:

$reporter = "John O'Hara";
$stmt = $mysqli->prepare("SELECT * FROM users WHERE name=?");
$stmt->bind_param("s", $reporter);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc(); // or while (...)
3 Bài viết liên quan:

  • 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?

Làm thế nào để chèn biến trong truy vấn SQL trong PHP?

$ type = 'kiểm tra';mysql_query ("chèn vào nội dung (loại, phóng viên, mô tả) giá trị ($ type, 'john', 'bất cứ điều gì')");PHP ...
Trong câu lệnh SQL của bạn, hãy thay thế tất cả các biến bằng trình giữ chỗ ..
Chuẩn bị truy vấn kết quả ..
liên kết các biến với người giữ chỗ ..
thực hiện truy vấn ..

Làm thế nào bao gồm biến PHP trong truy vấn chọn MySQL?

Bạn có thể thử điều này: $ query = "Chọn * từ CountryInfo WHERE name = '". $ Name.$query="SELECT * FROM CountryInfo WHERE Name = '". $name.

Làm cách nào để thêm một biến vào bảng trong mysql?

Đặt @biến = @Biến1+ @Biến2 Chèn vào bảng (cột) Giá trị (@varable);Chèn vào bảng (cột) giá trị ('biến');

Loại trả lại của mysqli_query là gì?

Trả về các giá trị ¶ Đối với các truy vấn thành công tạo ra một tập kết quả, chẳng hạn như chọn, hiển thị, mô tả hoặc giải thích, mysqli_query () sẽ trả về đối tượng mysqli_result.Đối với các truy vấn thành công khác, mysqli_query () sẽ trả về đúng.mysqli_result object. For other successful queries, mysqli_query() will return true .