Declaração preparada em PHP

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 INSERTafirmaçã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 PDOStatementclasse.

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 authorstabela:

<?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.phparquivo que se conecta ao bookdbbanco 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 PDOStatementobjeto:

public PDOStatement::bindValue ( mixed $parameter , mixed $value , int $data_type = PDO::PARAM_STR ) : boolLinguagem de código:  PHP  ( php )

O bindValue()método possui três parâmetros:

  • $parameterespecifica o nome do parâmetro :parameterse 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.
  • $valueespecifica o valor a ser vinculado ao parâmetro.
  • $data_typeespecifica o tipo de dados para o parâmetro usando, por PDO::PARAM_*exemplo, PDO::PARAM_INT. Por padrão, o $data_typeé PDO::PARAM_STR.

O exemplo a seguir mostra como inserir o autor Nick Abadzisna authorstabela 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 o bindValue()método, não o $authorvalor no momento em que o execute()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 = ? ) : boolLinguagem de código:  PHP  ( php )

O exemplo a seguir ilustra como usar o bindParam()método para inserir um novo autor na authorstabela:

<?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 $authorvariá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 o prepare()método de um PDOStatementobjeto.
  • Use o execute()método com valores para executar uma instrução não vinculada.
  • Use o método bindValue()ou bindParam()para vincular valores a uma instrução vinculada.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *