Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để viết một truy vấn SELECT an toàn có một số giá trị thay đổi do người dùng cung cấp với mysqli?

Nhiệm vụ bạn phải thực hiện là một câu lệnh được chuẩn bị sẵn với một số lượng trình giữ chỗ thay đổi. Điều này đơn giản hơn trong PDO, nhưng tôi sẽ chỉ cho bạn cách tiếp cận kiểu hướng đối tượng mysqli. Không có vấn đề gì, hãy luôn in một mảng được mã hóa json để tập lệnh nhận của bạn biết loại dữ liệu mong đợi.

Tôi đã có một đoạn mã bao gồm toàn bộ pin chẩn đoán và kiểm tra lỗi. Tôi chưa thử nghiệm tập lệnh này nhưng nó khá giống với bài đăng này của tôi .

if (empty($_POST['companyname']) || empty($_POST['username'])) {  // perform any validations here before doing any other processing
    exit(json_encode([]));
}

$config = ['localhost', 'root', '', 'dbname'];  // your connection credentials or use an include file
$values = array_merge([$_POST['companyname']], explode(',', $_POST['username']));  // create 1-dim array of dynamic length
$count = sizeof($values);
$placeholders = implode(',', array_fill(0, $count - 1, '?'));  // -1 because companyname placeholder is manually written into query
$param_types = str_repeat('s', $count);
if (!$conn = new mysqli(...$config)) {
    exit(json_encode("MySQL Connection Error: <b>Check config values</b>"));  // $conn->connect_error
}
if (!$stmt = $conn->prepare("SELECT user_scid, user_scid FROM linked_user WHERE company_name = ? AND username IN ({$placeholders})")) {
    exit(json_encode("MySQL Query Syntax Error: <b>Failed to prepare query</b>"));  // $conn->error
}
if (!$stmt->bind_param($param_types, ...$values)) {
    exit(json_encode("MySQL Query Syntax Error: <b>Failed to bind placeholders and data</b>"));  // $stmt->error;
}
if (!$stmt->execute()) {
    exit(json_encode("MySQL Query Syntax Error: <b>Execution of prepared statement failed.</b>"));  // $stmt->error;
}
if (!$result = $stmt->get_result()) {
    exit(json_encode("MySQL Query Syntax Error: <b>Get Result failed.</b>")); // $stmt->error;
}
exit(json_encode($result->fetch_all(MYSQLI_ASSOC)));

Nếu bạn không muốn tất cả các điều kiện và nhận xét chẩn đoán đó bị phình ra, thì đây là phần tương đương xương trần sẽ hoạt động giống hệt nhau:

if (empty($_POST['companyname']) || empty($_POST['username'])) {
    exit(json_encode([]));
}

$values = explode(',', $_POST['username']);
$values[] = $_POST['companyname'];
$count = count($values);
$placeholders = implode(',', array_fill(0, $count - 1, '?'));
$param_types = str_repeat('s', $count);

$conn = new mysqli('localhost', 'root', '', 'dbname');
$stmt = $conn->prepare("SELECT user_scid, user_scid FROM linked_user WHERE username IN ({$placeholders}) AND company_name = ?");
$stmt->bind_param($param_types, ...$values);
$stmt->execute();
$result = $stmt->get_result();
exit(json_encode($result->fetch_all(MYSQLI_ASSOC)));


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đồng bộ hóa tất cả Vai trò Người dùng giữa hai Bản cài đặt Wordpress chia sẻ cùng bảng wp_users và wp_usermeta.

  2. Làm thế nào để lưu trữ nhiều mục trong một cột cơ sở dữ liệu?

  3. Xây dựng truy vấn chèn từ mảng MySQL và PHP

  4. Làm thế nào để duy trì ràng buộc khóa ngoại trên các cơ sở dữ liệu khác nhau?

  5. Sự khác biệt giữa các kiểu chuỗi VARCHAR (255) và TINYTEXT trong MySQL là gì?