Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak za pomocą mysqli napisać bezpieczne zapytanie SELECT, które ma zmienną liczbę wartości podanych przez użytkownika?

Zadanie, które masz do wykonania, to przygotowana instrukcja ze zmienną liczbą symboli zastępczych. Jest to prostsze w PDO, ale pokażę Ci podejście oparte na stylu obiektowym mysqli. Bez względu na wszystko, zawsze drukuj tablicę zakodowaną w formacie json, aby skrypt odbierający wiedział, jakiego typu danych się spodziewać.

Miałem fragment, który zawierał pełną baterię diagnostyki i sprawdzania błędów. Nie testowałem tego skryptu, ale przypomina on ten mój post .

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)));

Jeśli nie chcesz, aby wszystkie te stany diagnostyczne i komentarze były wzdęte, oto odpowiednik nagich kości, który powinien działać identycznie:

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. Jak chronić moje forum przed spamem?

  2. mysql kolejność alfabetyczna

  3. PHP - Ustaw klucz tablicy mojego zapytania jako identyfikator

  4. Sparametryzowane zapytanie dla MySQL z C#

  5. Sprawdzanie pustego pola za pomocą MySQL