Resumo : neste tutorial, você aprenderá sobre as instruções preparadas em PHP no PDO e como usá-las de forma eficaz.
Introdução às instruções preparadas em PHP
Uma instrução preparada é um modelo para executar uma ou mais instruções SQL com valores diferentes. Uma instrução preparada é altamente eficiente e ajuda a proteger o aplicativo contra injeções de SQL.
Quando um servidor de banco de dados executa uma consulta, ela passa por duas etapas principais: preparação e execução.
- Preparação – o servidor de banco de dados verifica a sintaxe da instrução SQL e inicializa os recursos internos do servidor para o estágio de execução.
- Execução – a aplicação vincula os valores e envia a instrução SQL para o servidor de banco de dados. O servidor de banco de dados executa a instrução com os valores vinculados usando o recurso interno do servidor alocado na fase de preparação.
Construindo uma declaração preparada em PDO
Para construir uma declaração preparada em PDO, siga estas etapas:
Primeiro, crie um modelo de instrução SQL. Por exemplo:
$sql = 'insert into authors(first_name, last_name)
values(?,?)';
Linguagem de código: PHP ( php )
Esta INSERT
afirmação tem dois pontos de interrogação ( ?
). Eles são chamados de espaços reservados posicionais.
Ao executar a instrução, você precisa passar valores para os placeholders por suas posições. Em outras palavras, você precisa passar o primeiro nome para o primeiro espaço reservado e o sobrenome para o segundo espaço reservado
Segundo, chame o prepare()
método de uma instância do PDO:
$statement = $pdo->prepare($sql);
Linguagem de código: PHP ( php )
O prepare()
método retorna uma nova instância da PDOStatement
classe.
Terceiro, chame o execute()
método e passe os valores para os espaços reservados:
$statement->execute(['Sandra', 'Aamodt']);
Linguagem de código: PHP ( php )
O execute()
método substituirá o primeiro espaço reservado por 'Sandra'
e o segundo por 'Aamodt'
na instrução de inserção.
Junte tudo.
A seguir mostramos como usar a instrução preparada para inserir uma nova linha na authors
tabela:
<?php
$pdo = require 'connect.php';
$sql = 'insert into authors(first_name, last_name)
values(?,?)';
$statement = $pdo->prepare($sql);
$statement->execute(['Sandra', 'Aamodt']);
Linguagem de código: HTML, XML ( xml )
Observe que o script reutiliza o connect.php
arquivo que se conecta ao bookdb
banco de dados e retorna uma nova instância da classe PDO.
Usando espaços reservados nomeados
Ao usar os espaços reservados posicionais em uma instrução SQL, você precisa passar valores que correspondam às posições dos espaços reservados.
Se uma instrução SQL tiver muitos espaços reservados, será muito fácil usar as posições erradas. Para evitar isso, você pode usar os espaços reservados nomeados. Por exemplo:
$sql = 'insert into authors(first_name, last_name)
values(:first_name,:last_name)';
Linguagem de código: PHP ( php )
Neste exemplo, em vez de usar os pontos de interrogação ( ?
), você usa o nome do parâmetro prefixado por dois pontos ( :
). Os dois pontos são obrigatórios na instrução SQL.
Ao executar a instrução, você precisa passar um array associativo para o execute()
método como este:
$statement->execute([
'first_name' => 'Henry',
'last_name' => 'Aaron'
]);
Linguagem de código: PHP ( php )
Observe que a chave do array é importante, não a ordem dos elementos. Além disso, você pode opcionalmente usar the :
nas chaves do array:
$statement->execute([
':first_name' => 'Henry',
':last_name' => 'Aaron'
]);
Linguagem de código: PHP ( php )
A ordem dos elementos do array não é importante, então você pode usar um array com elementos em qualquer ordem. Por exemplo:
$statement->execute([
'last_name' => 'Aaron',
'first_name' => 'Henry',
]);
Linguagem de código: PHP ( php )
Junte tudo.
<?php
$pdo = require 'connect.php';
$sql = 'insert into authors(first_name, last_name)
values(:first_name,:last_name)';
$statement = $pdo->prepare($sql);
$statement->execute([
'last_name' => 'Aaron',
'first_name' => 'Henry',
]);
Linguagem de código: HTML, XML ( xml )
Valores vinculados
Nos exemplos acima, passamos os valores ao execute()
método para executar a consulta. Essas declarações são chamadas de declarações não vinculadas .
Além das instruções não vinculadas, o PDO também suporta instruções vinculadas . As instruções vinculadas permitem vincular explicitamente um valor ou uma variável a um espaço reservado nomeado ou posicional.
Para vincular um valor, você usa o bindValue()
método do PDOStatement
objeto:
public PDOStatement::bindValue ( mixed $parameter , mixed $value , int $data_type = PDO::PARAM_STR ) : bool
Linguagem de código: PHP ( php )
O bindValue()
método possui três parâmetros:
$parameter
especifica o nome do parâmetro:parameter
se a instrução usar espaços reservados nomeados ou o índice do parâmetro se a instrução usar espaços reservados posicionais. Caso você utilize o placeholder posicional, o primeiro parâmetro começa com o índice 1.$value
especifica o valor a ser vinculado ao parâmetro.$data_type
especifica o tipo de dados para o parâmetro usando, porPDO::PARAM_*
exemplo,PDO::PARAM_INT
. Por padrão, o$data_type
éPDO::PARAM_STR
.
O exemplo a seguir mostra como inserir o autor Nick Abadzis
na authors
tabela usando uma instrução vinculada:
<?php
$pdo = require 'connect.php';
$sql = 'insert into authors(first_name, last_name)
values(?,?)';
$statement = $pdo->prepare($sql);
$statement->bindValue(':first_name', 'Nick');
$statement->bindValue(':last_name', 'Abadzis');
$statement->execute();
Linguagem de código: HTML, XML ( xml )
Quando você usa o bindValue()
método, o execute()
método executa a instrução com os valores passados para o bindValue()
método, não com os valores no momento em que o execute()
método é executado. Por exemplo:
<?php
$pdo = require 'connect.php';
$sql = 'insert into authors(first_name, last_name)
values(:first_name,:last_name)';
$statement = $pdo->prepare($sql);
$author = [
'first_name' => 'Chris',
'last_name' => 'Abani',
];
$statement->bindValue(':first_name', $author['first_name']);
$statement->bindValue(':last_name', $author['last_name']);
// change the author variable
$author['first_name'] = 'Tom';
$author['last_name'] = 'Abate';
// execute the query with value Chris Abani
$statement->execute();
Linguagem de código: HTML, XML ( xml )
Neste exemplo:
- Primeiro, vincule o valor
'Chris'
e'Abate'
aos parâmetros de nome e sobrenome. - Segundo, altere os valores da variável
$author
. - Terceiro, execute a consulta. No entanto, o
execute()
método usa os valores passados para obindValue()
método, não o$author
valor no momento em que oexecute()
método é executado.
É por isso que o bindParam()
método entra em ação.
O método bindParam()
Para executar uma instrução cujos valores dos parâmetros são avaliados no momento da execute()
execução do método, você usa o bindParam()
método:
public PDOStatement::bindParam ( mixed $parameter , mixed &$variable , int $data_type = PDO::PARAM_STR , int $length = ? , mixed $driver_options = ? ) : bool
Linguagem de código: PHP ( php )
O exemplo a seguir ilustra como usar o bindParam()
método para inserir um novo autor na authors
tabela:
<?php
$pdo = require 'connect.php';
$sql = 'insert into authors(first_name, last_name)
values(:first_name,:last_name)';
$statement = $pdo->prepare($sql);
$author = [
'first_name' => 'Chris',
'last_name' => 'Abani',
];
$statement->bindParam(':first_name', $author['first_name']);
$statement->bindParam(':last_name', $author['last_name']);
// change the author variable
$author['first_name'] = 'Tom';
$author['last_name'] = 'Abate';
// execute the query with value Tom Abate
$statement->execute();
Linguagem de código: HTML, XML ( xml )
Neste exemplo, o execute()
método avalia a $author
variável no momento da execução para que ela use valores 'Tom'
e 'Abage'
.
Resumo
- Use uma instrução preparada em PHP para executar uma consulta várias vezes com valores diferentes.
- Use espaços reservados posicionais (
?
) ou espaços reservados nomeados (:parameter
) na instrução SQL antes de passar oprepare()
método de umPDOStatement
objeto. - Use o
execute()
método com valores para executar uma instrução não vinculada. - Use o método
bindValue()
oubindParam()
para vincular valores a uma instrução vinculada.