PHP DOP preparado declarações e procedimentos armazenados
Muitos bancos de dados mais maduros apoiar o conceito de declarações preparadas.
O que é instruções preparadas? Pense nisso como um modelo compilado que deseja executar SQL, que podem ser personalizados usando parâmetros variáveis. declarações preparadas oferecem duas vantagens principais:
- Consultar apenas resolve (ou pré-tratamento), uma vez, mas pode ser executada várias vezes com o mesmo ou diferentes parâmetros. Quando a consulta estiver pronta, o banco de dados irá analisar, compilar e executar o plano de otimização de consulta. Para consultas complexas, esse processo leva um longo tempo, se você precisa de ser repetido várias vezes com parâmetros diferentes a mesma consulta, em seguida, o processo irá reduzir muito a velocidade da aplicação. Usando a evitar declaração preparada repetindo analisar / compilação ciclo / optimize. Em suma, preparou demonstrações usar menos recursos e, assim, correr mais rápido.
- Fornecer parâmetros para instruções preparadas não precisa usar aspas, o driver será feito automaticamente. Se a aplicação utiliza apenas instruções preparadas, podemos garantir que nenhuma injeção SQL. (No entanto, se as outras partes da consulta não é escapado da entrada para construir, em seguida, ainda existe o risco de injecção SQL).
declarações preparadas tão úteis que eles só apresentam é o processamento analógico quando o motorista não suporta o DOP. Isso garante que, independentemente de o banco de dados tem uma função, você pode garantir que os aplicativos podem usar os mesmos padrões de acesso a dados.
inserção PreparedStatements repetido
O exemplo a seguir, substituindo o espaço reservado nome apropriado com o nome e valor para executar uma consulta de inserção
<?php $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); $stmt->bindParam(':name', $name); $stmt->bindParam(':value', $value); // 插入一行 $name = 'one'; $value = 1; $stmt->execute(); // 用不同的值插入另一行 $name = 'two'; $value = 2; $stmt->execute(); ?>
inserção PreparedStatements repetido
O exemplo a seguir, substituindo o nome eo valor? Espaços reservados para executar uma consulta de inserção.
<?php $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)"); $stmt->bindParam(1, $name); $stmt->bindParam(2, $value); // 插入一行 $name = 'one'; $value = 1; $stmt->execute(); // 用不同的值插入另一行 $name = 'two'; $value = 2; $stmt->execute(); ?>
Obter dados usando instruções preparadas
O exemplo a seguir na forma de chave de acesso à base de dados já fornecidos. A entrada do usuário é automaticamente colocado entre aspas, por isso não há risco de ataques de injeção SQL.
<?php $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?"); if ($stmt->execute(array($_GET['name']))) { while ($row = $stmt->fetch()) { print_r($row); } } ?>
Se o suporte de driver de banco de dados, a aplicação também pode vincular parâmetros de entrada e saída parâmetros de saída são normalmente utilizados para obter valores a partir do procedimento armazenado. Parâmetros de saída de usar do que os parâmetros de entrada para ser um pouco mais complicado, porque quando se ligar a um parâmetro de saída, você deve conhecer os parâmetros de um determinado comprimento. Se o valor para o parâmetro é maior do que as recomendações de ligação do comprimento, irá gerar um erro.
Chamar um procedimento armazenado com um parâmetro de saída
<?php $stmt = $dbh->prepare("CALL sp_returns_string(?)"); $stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); // 调用存储过程 $stmt->execute(); print "procedure returned $return_value\n"; ?>
Você também pode especificar ambos os valores de entrada e saída dos parâmetros, a sintaxe é semelhante a parâmetros de saída. No próximo exemplo, a string "Olá" é passado para o procedimento armazenado quando o procedimento armazenado retorna, Olá é substituído com o valor de retorno do procedimento armazenado.
Com entrada / saída parâmetros para chamar um procedimento armazenado
<?php $stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)"); $value = 'hello'; $stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); // 调用存储过程 $stmt->execute(); print "procedure returned $value\n"; ?>
Uso inválido de espaço reservado
<?php $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE '%?%'"); $stmt->execute(array($_GET['name'])); // 占位符必须被用在整个值的位置 $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE ?"); $stmt->execute(array("%$_GET[name]%")); ?>