PHP MySQL Voorbereide verklarings
Voorbereide stellings is baie nuttig teen SQL-inspuitings.
Voorbereide state en gebonde parameters
'n Voorbereide stelling is 'n kenmerk wat gebruik word om dieselfde (of soortgelyke) SQL-stellings herhaaldelik met hoë doeltreffendheid uit te voer.
Voorbereide stellings werk basies soos volg:
- Berei voor: 'n SQL-stellingsjabloon word geskep en na die databasis gestuur. Sekere waardes word ongespesifiseer gelaat, genoem parameters (gemerk "?"). Voorbeeld: VOEG IN IN MyGuests WAARDES (?, ?, ?)
- Die databasis ontleed, stel saam en voer navraagoptimalisering op die SQL-stellingsjabloon uit, en stoor die resultaat sonder om dit uit te voer
- Voer uit: Op 'n later tydstip bind die toepassing die waardes aan die parameters, en die databasis voer die stelling uit. Die toepassing kan die stelling soveel keer uitvoer as wat dit wil met verskillende waardes
In vergelyking met die direk uitvoer van SQL-stellings, het voorbereide stellings drie hoofvoordele:
- Voorbereide stellings verminder ontledingstyd aangesien die voorbereiding op die navraag slegs een keer gedoen word (alhoewel die stelling verskeie kere uitgevoer word)
- Gebonde parameters minimaliseer bandwydte na die bediener aangesien jy elke keer net die parameters hoef te stuur, en nie die hele navraag nie
- Voorbereide stellings is baie nuttig teen SQL-inspuitings, omdat parameterwaardes, wat later met 'n ander protokol oorgedra word, nie korrek ontsnap hoef te word nie. As die oorspronklike stellingsjabloon nie van eksterne invoer afkomstig is nie, kan SQL-inspuiting nie plaasvind nie.
Voorbereide stellings in MySQLi
Die volgende voorbeeld gebruik voorbereide stellings en gebonde parameters in MySQLi:
Voorbeeld (MySQLi met voorbereide verklarings)
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// prepare and bind
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);
// set parameters and execute
$firstname = "John";
$lastname = "Doe";
$email = "[email protected]";
$stmt->execute();
$firstname = "Mary";
$lastname = "Moe";
$email = "[email protected]";
$stmt->execute();
$firstname = "Julie";
$lastname = "Dooley";
$email = "[email protected]";
$stmt->execute();
echo "New records created successfully";
$stmt->close();
$conn->close();
?>
Kodereëls om uit die voorbeeld hierbo te verduidelik:
"INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"
In ons SQL voeg ons 'n vraagteken (?) in waar ons 'n heelgetal-, string-, dubbel- of blobwaarde wil vervang.
Kyk dan na die bind_param() funksie:
$stmt->bind_param("sss", $firstname, $lastname, $email);
Hierdie funksie bind die parameters aan die SQL-navraag en vertel die databasis wat die parameters is. Die "sss"-argument lys die tipe data wat die parameters is. Die s karakter vertel mysql dat die parameter 'n string is.
Die argument kan een van vier tipes wees:
- i - heelgetal
- d - dubbel
- s - tou
- b - BLOP
Ons moet een hiervan vir elke parameter hê.
Deur vir mysql te vertel watter tipe data om te verwag, verminder ons die risiko van SQL-inspuitings.
Let wel: As ons enige data van eksterne bronne (soos gebruikersinvoer) wil invoeg, is dit baie belangrik dat die data ontsmet en gevalideer word.
Voorbereide verklarings in BOB
Die volgende voorbeeld gebruik voorbereide stellings en gebonde parameters in PDO:
Voorbeeld (BOB met voorbereide state)
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// prepare sql and bind parameters
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
VALUES (:firstname, :lastname, :email)");
$stmt->bindParam(':firstname', $firstname);
$stmt->bindParam(':lastname', $lastname);
$stmt->bindParam(':email', $email);
// insert a row
$firstname = "John";
$lastname = "Doe";
$email = "[email protected]";
$stmt->execute();
// insert another row
$firstname = "Mary";
$lastname = "Moe";
$email = "[email protected]";
$stmt->execute();
// insert another row
$firstname = "Julie";
$lastname = "Dooley";
$email = "[email protected]";
$stmt->execute();
echo "New records created successfully";
} catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
$conn = null;
?>