Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да напиша защитена SELECT заявка, която има променлив брой стойности, предоставени от потребителя с mysqli?

Задачата, която трябва да изпълните, е подготвено изявление с променлив брой заместители. Това е по-просто в PDO, но ще ви покажа подхода на mysqli обектно-ориентирания стил. Без значение какво, винаги отпечатвайте json кодиран масив, така че приемащият ви скрипт да знае какъв тип данни да очаква.

Имах фрагмент, който включва пълна батерия от диагностика и проверка на грешки. Не съм тествал този скрипт, но има доста прилика с тази моя публикация .

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

Ако не искате подуването на всички тези диагностични състояния и коментари, ето еквивалентът на голите кости, който трябва да работи идентично:

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. MySQL ограничение от низходящ ред

  2. MySQL смесване на Damerau–Levenshtein Fuzzy с Like Wildcard

  3. Прехвърлянията на отдалечена mySQL връзка не могат да се свържат с MySQL 4.1+, като се използва старата несигурна грешка при удостоверяване от XAMPP

  4. MySQL групово вмъкване чрез PHP

  5. MySQL Connector/J буферира ли се редове при поточно предаване на ResultSet?