sql >> Databasteknik >  >> RDS >> Mysql

Hur skriver man en säker SELECT-fråga som har ett variabelt antal användarangivna värden med mysqli?

Uppgiften du ska utföra är ett förberett uttalande med ett varierande antal platshållare. Detta är enklare i PDO, men jag ska visa dig mysqli objektorienterade stilmetod. Oavsett vad, skriv alltid ut en json-kodad array så att ditt mottagande skript vet vilken typ av data du kan förvänta dig.

Jag hade ett utdrag liggande som innehåller ett helt batteri av diagnostik och felkontroll. Jag har inte testat det här skriptet, men det liknar det här mitt inlägg .

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

Om du inte vill ha svullnaden av alla dessa diagnostiska tillstånd och kommentarer, här är motsvarigheten till nakna ben som bör fungera identiskt:

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. Laravel-5 "LIKE" motsvarighet (vältalande)

  2. Hantera MySQL med phpMyAdmin på Ubuntu 9.10 (Karmic)

  3. Google kalender API :Välja/skapa kalendrar?

  4. Kopiera rad men med nytt id