sql >> Databáze >  >> RDS >> Mysql

Jak napsat bezpečný dotaz SELECT, který má proměnný počet hodnot zadaných uživatelem pomocí mysqli?

Úkol, který máte provést, je připravený příkaz s proměnným počtem zástupných symbolů. V PDO je to jednodušší, ale ukážu vám objektově orientovaný styl mysqli. Bez ohledu na to vždy vytiskněte pole zakódované ve formátu json, aby váš přijímající skript věděl, jaký typ dat může očekávat.

Měl jsem položený úryvek, který obsahuje plnou baterii diagnostiky a kontroly chyb. Tento skript jsem netestoval, ale dost se podobá tomuto mému příspěvku .

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

Pokud nechcete, aby všechny tyto diagnostické stavy a komentáře byly nafouklé, zde je ekvivalent holých kostí, který by měl fungovat stejně:

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. "aktivní" příznak nebo ne?

  2. Jak funguje SYSDATE() v MariaDB

  3. Zadání konkrétních polí pomocí Sequelize (NodeJS) namísto *

  4. Jak ELT() funguje v MariaDB