sql >> Database >  >> RDS >> Mysql

Hoe schrijf je een veilige SELECT-query met een variabel aantal door de gebruiker geleverde waarden met mysqli?

De taak die u moet uitvoeren, is een voorbereide verklaring met een variabel aantal tijdelijke aanduidingen. Dit is eenvoudiger in PDO, maar ik zal je de mysqli objectgeoriënteerde stijlbenadering laten zien. Wat er ook gebeurt, druk altijd een json-gecodeerde array af, zodat uw ontvangende script weet wat voor soort gegevenstype het kan verwachten.

Ik had een fragment rondslingeren dat een volledige batterij aan diagnostiek en foutcontrole bevat. Ik heb dit script niet getest, maar het lijkt nogal op dit bericht van mij .

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

Als u niet wilt dat al die diagnostische aandoeningen en opmerkingen worden opgezwollen, is hier het kale equivalent dat identiek zou moeten presteren:

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. Verkeerde waarde geretourneerd door mysql float

  2. MySQL-database start niet in XAMPP Manager-osx

  3. MySQL ATAN() Functie - Retourneer de boogtangens van een waarde (of waarden)

  4. Draaien op meerdere kolommen met Tablefunc