tutoriais mais recente desenvolvimento web
 

PHP declarações preparadas


declarações preparadas são muito úteis contra injecções SQL.


Instruções preparadas e parâmetros Vinculadas

Uma instrução preparada é um recurso usado para executar as mesmas (or similar) as instruções SQL repetidamente com alta eficiência.

declarações preparadas trabalham basicamente assim:

  1. Preparar: Um modelo de instrução SQL é criada e enviada ao banco de dados. Certos valores não são especificadas, chamados de parâmetros (labeled "?") . Exemplo: INSERT INTO MyGuests VALUES(?, ?, ?)
  2. O banco de dados analisa, compila e executa otimização de consultas no modelo de instrução SQL, e armazena o resultado sem executá-lo
  3. Execute: Em um momento posterior, a aplicação liga-se os valores para os parâmetros, eo banco de dados executa a instrução. O aplicativo pode executar a declaração tantas vezes quanto ele quer com valores diferentes

Comparado ao executar instruções SQL diretamente, declarações preparadas têm duas vantagens principais:

  • Declarações preparadas reduz o tempo de análise como a preparação em que a consulta é feita apenas uma vez (although the statement is executed multiple times)
  • parâmetros vinculados minimizar a largura de banda para o servidor como você precisa enviar apenas os parâmetros de cada vez, e não toda a consulta
  • declarações preparadas são muito úteis contra injecções SQL, porque os valores dos parâmetros, que são transmitidos mais tarde utilizando um protocolo diferente, não precisam de ser correctamente escapou. Se o modelo de declaração original não é derivado de entrada externa, injeção de SQL não pode ocorrer.

Declarações preparadas em MySQLi

O exemplo que se segue utiliza as declarações preparadas e parâmetros de limite em MySQLi:

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

linhas de código para explicar a partir do exemplo acima:

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

No nosso SQL, nós inserimos um ponto de interrogação (?) Onde queremos substituir em um integer, string, o valor de casal ou blob.

Então, ter um olhar para o bind_param() função:

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

Esta função liga os parâmetros para a consulta SQL e diz ao banco de dados de quais são os parâmetros. O "sss" argumento lista os tipos de dados que os parâmetros são. O personagem s diz mysql que o parâmetro é uma cadeia.

O argumento pode ser um dos quatro tipos:

  • i - inteiro
  • d - double
  • s - corda
  • b - BLOB

Devemos ter um destes para cada parâmetro.

Ao dizer mysql que tipo de dados que esperar, nós minimizar o risco de injeções SQL.

Nota: Se desejar inserir quaisquer dados de fontes externas (like user input) , é muito importante que os dados são higienizados e validado.


Demonstrações preparado no DOP

O exemplo que se segue utiliza as declarações preparadas e parâmetros de limite em DOP:

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