Classe Crud com PDO e MYSQLi - #3
06/05/2018Hoje vamos trabalhar com "Prepared Statements" que é um requisito básico para trabalhar com banco de dados usando PHP. Elas evitam o SQL Injection e são obrigatórias a partir do PHP 7+.
Prepared Statements no PHP
Primeiramente vamos criar o arquivo ClassCrud dentro da pasta Class e vamos incluí-la e instanciá-la na nossa index.php. Essa classe extenderá a ClassConexao feita na última aula:
<div class="Content">
<?php
include("Class/ClassConexao.php");
include("Class/ClassCrud.php");
$Crud=new ClassCrud();
?>
</div>
PDO
No PDO utilizaremos as declarativas preparatórias da seguinte forma:
class ClassCrud extends ClassConexao{
#Atributos
private $Crud;
private $Contador;
#Preparação das declativas
private function preparedStatements($Query , $Parametros)
{
$this->countParametros($Parametros);
$this->Crud=$this->conectaDB()->prepare($Query);
if($this->Contador > 0){
for($I=1; $I <= $this->Contador; $I++){
$this->Crud->bindValue($I,$Parametros[$I-1]);
}
}
$this->Crud->execute();
}
#Contador de parâmetros
private function countParametros($Parametros)
{
$this->Contador=count($Parametros);
}
}
No código acima criamos o método countParametros que receberá a quantidade de parâmetros passados para setarmos a quantidade de bindValue. Nossa preparedStatements() receberá a query e os parâmetros.
MYSQLi
As declarativas preparatórias dinâmicas no MYSQLi são mais complicadas, pois o MYSQLi não aceita o bindValue igual o PDO, ele só aceita o bind_param que recebe dois parâmetros: o tipo do valor passado e a variável com o valor. Dessa forma, não conseguimos fazer um simples for como no PDO. Precisamos utilizar a função do PHP call_user_func_array() e passar os dados por referência.
class ClassCrud extends ClassConexao{
#Atributos
private $Crud;
private $Contador;
private $Resultado;
#Preparação das declarativs
private function preparedStatements($Query, $Tipos , $Parametros)
{
$this->countParametros($Parametros);
$Con=$this->conectaDB();
$this->Crud=$Con->prepare($Query);
if($this->Contador > 0){
$CallParametros = array();
foreach($Parametros as $Key => $Parametro){
$CallParametros[$Key] = &$Parametros[$Key];
}
array_unshift($CallParametros, $Tipos);
call_user_func_array(array($this->Crud,'bind_param'),$CallParametros);
}
$this->Crud->execute();
$this->Resultado=$this->Crud->get_result();
}
#Contador de parâmetros
private function countParametros($Parametros)
{
$this->Contador=count($Parametros);
}
}