sql >> Database teknologi >  >> RDS >> Mysql

Hvordan skriver man en sikker SELECT-forespørgsel, som har et variabelt antal brugerleverede værdier med mysqli?

Opgaven du skal udføre er en udarbejdet redegørelse med et variabelt antal pladsholdere. Dette er enklere i PDO, men jeg vil vise dig den mysqli objektorienterede stiltilgang. Uanset hvad, udskriv altid et json-kodet array, så dit modtagende script ved, hvilken type data du kan forvente.

Jeg havde et uddrag liggende, der inkluderer et fuldt batteri af diagnostik og fejlkontrol. Jeg har ikke testet dette script, men det minder meget om dette mit indlæg .

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

Hvis du ikke vil have oppustethed af alle disse diagnostiske tilstande og kommentarer, er her den ækvivalente knogle, som burde fungere identisk:

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. Hvordan forskønner man det output, der kommer fra SELECT-forespørgslen i kommandoprompten?

  2. Brug af Dapper med Oracle lagrede procedurer, der returnerer markører

  3. Hvordan kan jeg indsætte i en BLOB-kolonne fra en insert-sætning i sqldeveloper?

  4. Beviser SQL-forespørgselsækvivalens