Declarações preparadas PHP MySQL

Neste artigo, demonstraremos como as instruções preparadas do PHP Mysql podem ser usadas para desenvolver aplicativos da Web, a fim de torná-los seguros e eficientes.

Durante esta palestra, abordaremos as instruções preparadas do PHP MySQL, como criá-las, como executá-las e como passar parâmetros para as instruções preparadas.

Além disso, discutiremos as melhores práticas a serem seguidas ao usar declarações preparadas para desenvolvimento web.

Uma instrução preparada é uma maneira de executar instruções SQL que contêm parâmetros que podem ser vinculados a valores posteriormente no processo de execução.

Ao usar essa abordagem, podemos nos proteger contra ataques de injeção de SQL, que é um problema de segurança comum encontrado em aplicativos da web.



PHP MySQL Instruções Preparadas e Parâmetros Vinculados

As instruções preparadas são um tipo de instrução SQL que pode ser usada para repetir as mesmas instruções (ou semelhantes) de maneira altamente eficiente.

É basicamente assim que as declarações preparadas funcionam:

  1. Prepare: A primeira etapa é criar um modelo de instrução SQL que será enviado ao banco de dados. Existem alguns valores que são deixados de fora da equação, chamados de parâmetros (rotulados como “?”). Exemplo: INSERT INTO Users VALUES(?, ?, ?)
  2. Os bancos de dados analisam , compilam e otimizam o modelo de instrução SQL para executar a otimização de consulta e, em seguida, armazenam o resultado de cada um deles sem executá-lo no servidor.
  3. Execute: Após vincular os parâmetros aos valores, o aplicativo executa a instrução no banco de dados. O aplicativo pode executar a instrução quantas vezes quiser com valores diferentes

As principais vantagens de usar instruções preparadas sobre a execução direta de instruções SQL são as seguintes:

  • O uso de instruções preparadas reduz o tempo necessário para analisar a consulta porque a preparação para a consulta é feita apenas uma vez (mesmo que a instrução tenha que ser executada várias vezes).
  • Um parâmetro vinculado minimiza a largura de banda que é enviada ao servidor, pois apenas os parâmetros são enviados todas as vezes, e não toda a consulta.
  • Existe uma grande vantagem em usar instruções preparadas quando se trata de prevenir injeções de SQL, pois os valores de parâmetros que serão transmitidos posteriormente usando um protocolo diferente não precisam ser escapados corretamente. Um ataque de injeção SQL não pode ocorrer se o modelo original da instrução não for derivado de uma fonte externa de entrada.

Declarações Preparadas no MySQLi

Usando o MySQLi, o exemplo a seguir mostra como usar instruções preparadas e parâmetros vinculados:

Example (MySQLi with Prepared Statements): 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
$servername = "localhost";
$username = "my_user";
$password = "my_pass";
$dbname = "mrx_test_db";
// Creating connection
$conn= new mysqli($servername, $username, $password, $dbname);
// Checking connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// prepare and bind
$stmt = $conn->prepare("INSERT INTO Users (firstname, lastname, email, age, gender) VALUES (?, ?, ?, ?, ?)");
$stmt->bind_param("sssis", $firstname, $lastname, $email, $age, $gender);
// set parameters and execute
// inserting data 1
$firstname = "Matt";
$lastname = "LeBlanc";
$email = "[email protected]";
$age = 55;
$gender = "Male";
$stmt->execute();
// inserting data 2
$firstname = "Matthew";
$lastname = "Perry";
$email = "[email protected]";
$age = 53;
$gender = "Male";
$stmt->execute();
// inserting data 3
$firstname = "Jennifer";
$lastname = "Anniston";
$email = "[email protected]";
$age = 54;
$gender = "Female";
$stmt->execute();
echo "New records added successfully";
$stmt->close();
$conn->close();
?>
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Usando o exemplo acima, aqui estão algumas linhas de código para explicar:

"INSERT INTO Users (firstname, lastname, email, age, gender) VALUES (?, ?, ?, ?, ?)"

Se quisermos substituir um valor inteiro, string, double ou blob em nosso SQL, inserimos um ponto de interrogação ( ? ) no local onde queremos inserir o valor.

Vamos dar uma olhada na função bind_param() agora:

$stmt->bind_param("sssis", $firstname, $lastname, $email, $age, $gender);

O objetivo desta função é vincular os parâmetros à consulta SQL, para que o banco de dados saiba quais são os parâmetros.

Listados no argumento “sssis” estão os tipos de dados que estão contidos entre os parâmetros. Há um caractere s no parâmetro, que indica que é uma string.

Existem quatro tipos de argumentos que podem ser feitos:

  1. eu - inteiro
  2. d- duplo
  3. s - cadeia
  4. b - BLOB

Para cada um dos parâmetros, precisamos de um deles.

Este método minimiza o risco de injeções de SQL especificando ao MySQL que tipo de dados esperar.

Nota : Para inserir quaisquer dados de fontes externas (como a entrada do usuário), é muito importante que eles sejam sanitizados e validados antes de serem inseridos.

Declarações Preparadas em PDO

Uma instrução preparada por PDO e parâmetros vinculados são usados ​​no exemplo a seguir:

Example (PDO with Prepared Statements): 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
$servername = "localhost";
$username = "my_user";
$password = "my_pass";
$dbname = "mrx_test_db";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// Specify the exception error mode in the PDO
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// prepare sql and bind parameters
$stmt = $conn->prepare("INSERT INTO Users (firstname, lastname, email, age, gender)
VALUES (:firstname, :lastname, :email, :age, :gender)");
$stmt->bindParam(':firstname', $firstname);
$stmt->bindParam(':lastname', $lastname);
$stmt->bindParam(':email', $email);
$stmt->bindParam(':age', $age);
$stmt->bindParam(':gender', $gender);
// inserting data 1
$firstname = "Matt";
$lastname = "LeBlanc";
$email = "[email protected]";
$age = 55;
$gender = "Male";
$stmt->execute();
// inserting data 2
$firstname = "Matthew";
$lastname = "Perry";
$email = "[email protected]";
$age = 53;
$gender = "Male";
$stmt->execute();
// inserting data 2
$firstname = "Jennifer";
$lastname = "Anniston";
$email = "[email protected]";
$age = 54;
$gender = "Female";
$stmt->execute();
echo "New records added successfully";
}
catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
$conn = null;
?>
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Exemplo de Explicação

Este é o código PHP que exibe exemplos do uso de instruções preparadas Php Mysql usando PDO (PHP Data Objects).

  • Primeiro estabelecemos uma conexão com um banco de dados MySQL usando a classe PDO, especificando o nome do servidor, nome de usuário, senha e nome do banco de dados. O código então define o modo de erro como ERRMODE_EXCEPTION para que qualquer erro gere uma exceção.
  • Em seguida, uma instrução preparada é criada usando o método prepare() da classe PDO. A instrução SQL é especificada com espaços reservados para os valores que serão inseridos na tabela. Os espaços reservados são nomeados usando dois pontos seguidos por um nome (:firstname, :lastname, etc.).
  • Após a criação da instrução preparada, o método bindParam() é usado para vincular os espaços reservados nomeados às variáveis ​​PHP ($ firstname , $ lastname , etc.) que conterão os valores a serem inseridos na tabela.
  • O código então define os valores das variáveis ​​PHP para os dados que devem ser inseridos na tabela e chama o método execute() da instrução preparada para inserir os dados na tabela. Esse processo é repetido três vezes para inserir três conjuntos de dados na tabela Usuários.
  • Por fim, o código captura todas as exceções que ocorrem durante a execução da instrução preparada pelo Php Mysql e exibe uma mensagem de erro, se necessário.
Nós valorizamos o seu feedback.
+1
0
+1
0
+1
0
+1
0
+1
0
+1
0
+1
0

Assine a nossa newsletter
Digite seu e-mail para receber um resumo semanal de nossos melhores posts. Saber mais!
ícone