sql >> Databáze >  >> RDS >> Mysql

Jak zahrnout proměnnou PHP do příkazu MySQL

Pravidla pro přidání proměnné PHP do jakéhokoli příkazu MySQL jsou jasná a jednoduchá:

  1. Jakákoli proměnná, která představuje datový literál SQL , (nebo zjednodušeně řečeno - řetězec SQL nebo číslo) MUSÍ být přidán prostřednictvím připraveného příkazu. Žádné výjimky.
  2. Jakékoli další části dotazu, jako je klíčové slovo SQL, název tabulky nebo pole nebo operátor – musí být filtrovány přes bílou listinu .

Protože váš příklad zahrnuje pouze datové literály, musí být všechny proměnné přidány prostřednictvím zástupných symbolů (také nazývaných parametry). Postup:

  • Ve svém příkazu SQL nahraďte všechny proměnné zástupnými symboly
  • připravit výsledný dotaz
  • svázat proměnné na zástupné symboly
  • provést dotaz

A zde je návod, jak to udělat se všemi oblíbenými ovladači databáze PHP:

Přidávání datových literálů pomocí mysql ext

Takový ovladač neexistuje .

Přidávání datových literálů pomocí 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();

Kód je trochu komplikovaný, ale podrobné vysvětlení všech těchto operátorů lze nalézt v mém článku Jak spustit INSERT dotaz pomocí Mysqli , stejně jako řešení, které tento proces dramaticky usnadní.

Pro SELECT dotaz budete muset přidat pouze volání get_result() metoda k získání známého mysqli_result ze kterého můžete získat data obvyklým způsobem:

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

Přidávání datových literálů pomocí PDO

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

V PDO můžeme mít svázané a spouštěné části kombinované, což je velmi výhodné. PDO také podporuje pojmenované zástupné symboly, což někteří považují za velmi pohodlné.

Přidání klíčových slov nebo identifikátorů

Někdy musíme přidat proměnnou, která představuje jinou část dotazu, jako je klíčové slovo nebo identifikátor (databáze, tabulka nebo název pole). Je to vzácný případ, ale je lepší být připraven.

V tomto případě musí být vaše proměnná porovnána se seznamem hodnot explicitně napsané ve vašem skriptu. To je vysvětleno v mém dalším článku, Přidání názvu pole do klauzule ORDER BY na základě volby uživatele :

Bohužel PDO nemá žádný zástupný symbol pro identifikátory (názvy tabulek a polí), proto je vývojář musí odfiltrovat ručně. Takový filtr se často nazývá „bílá listina“ (kde uvádíme pouze povolené hodnoty) na rozdíl od „černé listiny“, kde uvádíme nepovolené hodnoty.

Musíme tedy v kódu PHP výslovně uvést všechny možné varianty a následně si z nich vybrat.

Zde je příklad:

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

Přesně stejný přístup by měl být použit pro směr,

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

Po takovém kódu oba $direction a $orderby proměnné lze bezpečně vložit do dotazu SQL, protože se buď rovnají jedné z povolených variant, nebo dojde k chybě.

Poslední věc, kterou je třeba zmínit o identifikátorech, musí být také naformátovány podle syntaxe konkrétní databáze. Pro MySQL by to mělo být backtick znaky kolem identifikátoru. Takže konečný řetězec dotazu pro naši objednávku podle příkladu by byl

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


  1. java.sql.SQLException:Přístup odepřen uživateli 'root'@'localhost' (pomocí hesla:ANO)

  2. Soulad nabídky s poptávkou Výzva

  3. Vytvořte tabulku v SQL Server 2017

  4. Jak uložit hodnoty NULL do polí data a času v MySQL?