Ultimele tutoriale de dezvoltare web
 

PHP Declarațiile preparate


Declarații preparate sunt foarte utile împotriva injecțiilor SQL.


Declarațiile pregătite și parametri Bound

O declarație pregătită este o caracteristică utilizată pentru a executa aceleași (or similar) declarațiile SQL în mod repetat , cu eficiență ridicată.

situațiile financiare întocmite în principiu funcționează ca aceasta:

  1. Se prepară: Un șablon de instrucțiune SQL este creată și trimisă la baza de date. Anumite valori sunt lăsate nespecificată, numite parametri (labeled "?") . Exemplu: INSERT INTO MyGuests VALUES(?, ?, ?)
  2. Baza de date Analizează, compilează, și efectuează optimizare interogare pe șablonul declarație SQL, și stochează rezultatul fără al executa
  3. Execute: La un moment ulterior, cererea se leaga valorile parametrilor, iar baza de date execută declarația. Cererea poate executa declarația ori de câte ori dorește cu valori diferite

Comparativ cu executarea în mod direct declarații SQL, declarații pregătite au două avantaje principale:

  • Declarații preparate reduce timpul de parsare ca pregătirea pentru interogarea se face o singură dată (although the statement is executed multiple times) de (although the statement is executed multiple times)
  • Parametrii Bound minimiza lățime de bandă de la server ca ai nevoie sa trimiteti numai parametrii de fiecare dată, și nu întreaga interogare
  • Declarații preparate sunt foarte utile împotriva injecțiilor SQL, deoarece valorile parametrilor, care sunt transmise ulterior folosind un protocol diferit, nu trebuie să fie corect scăpat. Dacă șablonul declarația inițială nu este derivat de la intrare externă, injecție SQL nu poate avea loc.

Declarațiile preparat în MySQLi

Următorul exemplu folosește declarații pregătite și parametri legați în MySQLi:

Exemplu (MySQLi with Prepared Statements)

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

linii de cod pentru a explica din exemplul de mai sus:

"INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"

În SQL nostru, vom introduce un semn de întrebare (?) , În cazul în care vrem să înlocuiască într - un număr întreg, șir de caractere, valoare dublă sau pată de cerneală.

Apoi, au o privire la bind_param() Funcția:

$stmt->bind_param("sss", $firstname, $lastname, $email);

Această funcție se leagă parametrii pentru interogarea SQL și spune baza de date care sunt parametrii. "sss" argument enumeră tipurile de date pe care parametrii sunt. S Caracterul mysql spune că parametrul este un șir de caractere.

Argumentul poate fi unul dintre cele patru tipuri:

  • i - întreg
  • d - dublu
  • s - string
  • b - BLOB

Noi trebuie să aibă una dintre acestea pentru fiecare parametru.

Prin a spune MySQL ce tip de date pentru a aștepta, vom reduce la minimum riscul de injecții SQL.

Notă: Dacă vrem să inserați orice date din surse externe (like user input) de (like user input) , este foarte important ca datele sunt igienizat și validate.


Declarațiile preparat în DOP

Următorul exemplu folosește declarații pregătite și parametri legați în DOP:

Exemplu (PDO with Prepared Statements)

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