Para começar, crie um banco de dados com esse código:
create database mercadophp
default character set utf8
default collate utf8_general_ci;
use mercadophp;
create table produto (
id int not null auto_increment,
descricao varchar(30) unique,
qtd int,
valor decimal(10, 2),
primary key(id)
)
default charset = utf8;
Para trabalhar com PDO, crie uma página com o nome dados.php e coloque esse código:
$hostname = "mysql:host=localhost;dbname=mercadophp;charset=utf8";
$username = "root";
$password = "";
$conexao = new PDO($hostname, $username, $password);
Como visto, a conexão não é muito diferente do mysqli, tirando o fato do hostname ter que indicar não apenas o host, mas também o banco de dados e o charset, na mesma variável. E a conexão é criada com um objeto PDO.
PS: É possível usarmos outros tipos de bancos de dados, como o PostgreSQL, caso o banco de dados seja PostgreSQL, utilize pgsql
, se for Oracle SQL, use oci
e se for Microsoft SQL Server, use dblib
.
Só que é necessário tratar os erros da conexão com try catch, dessa forma:
try {
$conexao = new PDO($hostname, $username, $password);
}
catch(PDOException $ex) {
echo "ERRO: {$ex->getMessage()}";
}
Como isso utiliza orientação a objetos, se torna mais seguro e fácil de criar.
O mesmo código feito na parte anterior em dados.php, coloque numa função, no mesmo arquivo, dessa forma:
function getConnection() {
$hostname = "mysql:host=localhost;dbname=mercadophp;charset=utf8";
$username = "root";
$password = "";
try {
$conexao = new PDO($hostname, $username, $password);
return $conexao; // Não esqueça do retorno
}
catch(PDOException $ex) {
echo "ERRO: {$ex->getMessage()}";
}
}
PS: Observe que tem um retorno dentro do try.
E crie um arquivo PHP com o nome inserir, dessa forma:
include_once "dados.php";
$conn = getConnection(); // Isso cria a conexão.
$sql = "insert into produto (descricao, qtd, valor) values (?, ?, ?)";
$stmt = $conn->prepare($sql); // Isso pega os dados da variável
$stmt->bindValue(1, "Arroz"); // Isso substitui os ? na ordem numérica
$stmt->bindValue(2, 10);
$stmt->bindValue(3, 4.50);
if($stmt->execute()) { // Isso executa o SQL
echo "Salvo com Sucesso!";
}
else {
echo "Erro ao Salvar!";
}
O ideal, no entando, é passar as variáveis, que serão referenciadas, assim:
$descricao = "Farinha";
$qtd = 10;
$valor = 10.80;
$stmt = $conn->prepare($sql); // Isso pega os dados da variável
$stmt->bindValue(1, $descricao); // Isso substitui os ? na ordem numérica
$stmt->bindValue(2, $qtd);
$stmt->bindValue(3, $valor);
Ao invés de números, podemos passar os parâmetros assim:
$sql = "insert into produto (descricao, qtd, valor) values (:desc, :qtd, :val)";
$descricao = "Farinha";
$qtd = 10;
$valor = 10.80;
$stmt = $conn->prepare($sql); // Isso pega os dados da variável
$stmt->bindValue(":desc", $descricao); // Isso substitui os ? na ordem numérica
$stmt->bindValue(":qtd", $qtd);
$stmt->bindValue(":val", $valor);
Também podemos salvar com exec, dessa forma (podemos criar um arquivo só pra isso):
include_once "dados.php";
$conn = getConnection(); // Isso cria a conexão.
$sql = "insert into produto (descricao, qtd, valor) values ('Sal', 10, 2.50)";
if($conn->exec($sql)) { // Isso executa o SQL
echo "Salvo com Sucesso!";
}
else {
echo "Erro ao Salvar!";
}
O problema é que dessa forma, apesar de ser mais simples, é mais vulnerável à SQL Injection. Por isso deve se usar consultas preparadas com o bindValue e as interrogações ou labels com dois pontos.
Crie um arquivo com o nome consultas.php e coloque esse código:
include_once "dados.php";
$conn = getConnection(); // Isso cria a conexão.
$sql = "select * from produto";
$stmt = $conn->prepare($sql); // Isso pega os dados da variável
$stmt->execute(); // Isso executa o SQL
$result = $stmt->fetchAll(); // Isso retorna o array com os dados do banco
var_dump($result);
Claro que usar o var_dump() vai mostrar os dados de forma complicada de visualizar, nesse caso, substituiremos pelo foreach, assim:
foreach($result as $value) {
echo "Descrição: " . $value['descricao'] . "<br/>";
}
Da mesma forma, podemos colocar os outros campos do array e colocar ele com tags HTML para ser formatada na página.
Podemos usar outros parâmetros também, por exemplo:
$sql = "select * from produto where id = :id";
$stmt = $conn->prepare($sql);
$stmt->bindValue(":id", 1);
$stmt->execute();
Agora crie um arquivo com o nome update.php, com esse código:
include_once "dados.php";
$conn = getConnection(); // Isso cria a conexão.
$sql = "update produto set descricao = :desc, qtd = :qtd, valor = :val where id = :id";
$descricao = "Farinha de Trigo";
$qtd = 10;
$valor = 10.80;
$id = 2;
$stmt = $conn->prepare($sql); // Isso pega os dados da variável
$stmt->bindValue(":desc", $descricao); // Isso substitui os ? na ordem numérica
$stmt->bindValue(":qtd", $qtd);
$stmt->bindValue(":val", $valor);
$stmt->bindValue(":id", $id);
if($stmt->execute()) {
echo "Atualizado com Sucesso!";
}
else {
echo "Erro ao Atualizar!";
}
Não tem segredo, pode ver que são poucas as alterações em relação ao inserir.
Também não tem segredo em relação ao inserir e atualizar, e é ainda mais fácil, crie um arquivo com o nome deletar.php e coloque o código abaixo:
include_once "dados.php";
$conn = getConnection(); // Isso cria a conexão.
$sql = "delete from produto where id = :id";
$id = 1;
$stmt = $conn->prepare($sql); // Isso pega os dados da variável
$stmt->bindValue(":id", $id); // Isso substitui os ? na ordem numérica
if($stmt->execute()) {
echo "Deletado com Sucesso!";
}
else {
echo "Erro ao Excluir!";
}