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

Sådan inkluderes en PHP-variabel i en MySQL-sætning

Reglerne for tilføjelse af en PHP-variabel i enhver MySQL-sætning er enkle og enkle:

  1. Enhver variabel, der repræsenterer en SQL-dataliteral , (eller, for at sige det enkelt - en SQL-streng eller et tal) SKAL tilføjes gennem en forberedt sætning. Ingen undtagelser.
  2. Enhver anden forespørgselsdel, såsom et SQL nøgleord, en tabel eller et feltnavn eller en operator - skal filtreres gennem en hvid liste .

Så da dit eksempel kun involverer bogstavelige data, så skal alle variable tilføjes gennem pladsholdere (også kaldet parametre). For at gøre det:

  • I din SQL-sætning skal du erstatte alle variabler med pladsholdere
  • forbered dig den resulterende forespørgsel
  • bind variabler til pladsholdere
  • udfør forespørgslen

Og her er, hvordan du gør det med alle populære PHP-databasedrivere:

Tilføjelse af data bogstaver ved hjælp af mysql ext

Sådan en driver findes ikke .

Tilføjelse af data bogstaver ved hjælp af mysqli

$type = 'testing';
$reporter = "John O'Hara";
$query = "INSERT INTO contents (type, reporter, description) 
             VALUES(?, ?, 'whatever')";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("ss", $type, $reporter);
$stmt->execute();

Koden er lidt kompliceret, men den detaljerede forklaring af alle disse operatører kan findes i min artikel, Sådan kører man en INSERT forespørgsel ved hjælp af Mysqli , samt en løsning, der letter processen dramatisk.

For en SELECT-forespørgsel skal du blot tilføje et kald til get_result() metode til at få et velkendt mysqli_result hvorfra du kan hente dataene på den sædvanlige måde:

$reporter = "John O'Hara";
$stmt = $mysqli->prepare("SELECT * FROM users WHERE name=?");
$stmt->bind_param("s", $reporter);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc(); // or while (...)

Tilføjelse af bogstavelige data ved hjælp af PDO

$type = 'testing';
$reporter = "John O'Hara";
$query = "INSERT INTO contents (type, reporter, description) 
             VALUES(?, ?, 'whatever')";
$stmt = $pdo->prepare($query);
$stmt->execute([$type, $reporter]);

I PDO kan vi få binde- og eksekveringsdelene kombineret, hvilket er meget praktisk. PDO understøtter også navngivne pladsholdere, som nogle finder yderst praktiske.

Tilføjelse af søgeord eller identifikatorer

Nogle gange er vi nødt til at tilføje en variabel, der repræsenterer en anden del af en forespørgsel, såsom et nøgleord eller en identifikator (en database, tabel eller et feltnavn). Det er et sjældent tilfælde, men det er bedre at være forberedt.

I dette tilfælde skal din variabel kontrolleres mod en liste med værdier eksplicit skrevet i dit manuskript. Dette er forklaret i min anden artikel, Tilføjelse af et feltnavn i ORDER BY-klausulen baseret på brugerens valg :

Desværre har PDO ingen pladsholder for identifikatorer (tabel- og feltnavne), derfor skal en udvikler filtrere dem fra manuelt. Et sådant filter kaldes ofte en "hvid liste" (hvor vi kun angiver tilladte værdier) i modsætning til en "sortliste", hvor vi angiver ikke-tilladte værdier.

Så vi skal udtrykkeligt liste alle mulige varianter i PHP-koden og derefter vælge fra dem.

Her er et eksempel:

$orderby = $_GET['orderby'] ?: "name"; // set the default value
$allowed = ["name","price","qty"]; // the white list of allowed field names
$key = array_search($orderby, $allowed, true); // see if we have such a name
if ($key === false) { 
    throw new InvalidArgumentException("Invalid field name"); 
}

Præcis den samme tilgang bør bruges til retningen,

$direction = $_GET['direction'] ?: "ASC";
$allowed = ["ASC","DESC"];
$key = array_search($direction, $allowed, true);
if ($key === false) { 
    throw new InvalidArgumentException("Invalid ORDER BY direction"); 
}

Efter sådan en kode, både $direction og $orderby variabler kan sikkert placeres i SQL-forespørgslen, da de enten er lig med en af ​​de tilladte varianter, eller der vil opstå en fejl.

Den sidste ting at nævne om identifikatorer, de skal også formateres i henhold til den særlige databasesyntaks. For MySQL skal det være backtick tegn omkring identifikatoren. Så den sidste forespørgselsstreng for vores rækkefølge efter eksempel ville være

$query = "SELECT * FROM `table` ORDER BY `$orderby` $direction";


  1. chmod mislykkedes:EPERM (operation ikke tilladt) i Android?

  2. Underforespørgsler med EXISTS vs IN - MySQL

  3. Sådan ændres kolonne fra Null til Ikke Null i SQL Server-tabel - SQL Server / T-SQL vejledning del 52

  4. Forstå Amazon Auroras Multi-AZ-implementering