sql >> Databasteknik >  >> RDS >> Mysql

Hur man inkluderar en PHP-variabel i en MySQL-sats

Reglerna för att lägga till en PHP-variabel i en MySQL-sats är enkla och enkla:

  1. Varje variabel som helst som representerar en SQL-dataliteral , (eller, för att uttrycka det enkelt - en SQL-sträng eller ett nummer) MÅSTE läggas till genom en förberedd sats. Inga undantag.
  2. Alla andra frågedelar, till exempel ett SQL-nyckelord, en tabell eller ett fältnamn eller en operator - måste filtreras genom en vit lista .

Så eftersom ditt exempel bara involverar dataliteraler, måste alla variabler läggas till genom platshållare (även kallade parametrar). För att göra det:

  • I din SQL-sats, ersätt alla variabler med platshållare
  • förbered den resulterande frågan
  • binda variabler till platshållare
  • kör frågan

Och här är hur du gör det med alla populära PHP-databasdrivrutiner:

Lägga till bokstavliga data med mysql ext

En sådan drivrutin finns inte .

Lägga till bokstavliga data med 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 är lite komplicerad men den detaljerade förklaringen av alla dessa operatorer finns i min artikel, Hur man kör en INFOGA fråga med Mysqli , samt en lösning som underlättar processen dramatiskt.

För en SELECT-fråga behöver du bara lägga till ett anrop till get_result() metod för att få ett välbekant mysqli_result varifrån du kan hämta data på vanligt sätt:

$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 (...)

Lägga till bokstavliga data med 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 kombinera bindnings- och exekveringsdelarna, vilket är väldigt bekvämt. PDO stöder även namngivna platshållare som vissa tycker är extremt bekväma.

Lägga till sökord eller identifierare

Ibland måste vi lägga till en variabel som representerar en annan del av en fråga, till exempel ett nyckelord eller en identifierare (en databas, tabell eller ett fältnamn). Det är ett sällsynt fall men det är bättre att vara förberedd.

I det här fallet måste din variabel kontrolleras mot en lista med värden explicit skrivet i ditt manus. Detta förklaras i min andra artikel, Lägga till ett fältnamn i ORDER BY-satsen baserat på användarens val :

Tyvärr har PDO ingen platshållare för identifierare (tabell- och fältnamn), därför måste en utvecklare filtrera bort dem manuellt. Ett sådant filter kallas ofta en "vit lista" (där vi bara listar tillåtna värden) till skillnad från en "svart lista" där vi listar otillåtna värden.

Så vi måste uttryckligen lista alla möjliga varianter i PHP-koden och sedan välja bland dem.

Här är ett exempel:

$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"); 
}

Exakt samma tillvägagångssätt bör användas för riktningen,

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

Efter en sådan kod, både $direction och $orderby Variabler kan säkert placeras i SQL-frågan, eftersom de antingen är lika med en av de tillåtna varianterna eller så kommer ett fel att visas.

Det sista att nämna om identifierare, de måste också formateras enligt den specifika databassyntaxen. För MySQL bör det vara backtick tecken runt identifieraren. Så den sista frågesträngen för vår ordning efter exempel skulle vara

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


  1. SQL Server-låsets anatomi och de bästa sätten att undvika dem

  2. Arbetar dina anställda på distans? Så här håller du din data säker.

  3. Utfasad:mysql_connect()

  4. Hur man formaterar ett tal med kommatecken i Oracle