O recomendado em PDO é colocar a função dentro de uma classe, veja abaixo como fica nossa conexão dentro de uma classe:
class ConnectionFactory {
private const HOSTNAME = "mysql:host=localhost;dbname=mercadophp;charset=utf8";
private const USERNAME = "root";
private const PASSWORD = "";
public static function getConnection() {
try {
$conexao = new PDO(self::HOSTNAME, self::USERNAME, self::PASSWORD);
return $conexao;
}
catch(PDOException $ex) {
echo "ERRO: " . $ex->getMessage();
}
}
}
PS: Coloque os modificadores public para o método ser acessível e o static para chamarmos ele sem criar um objeto. O const por padrão também é estático.
Daí, aonde tiver a conexão basta colocar assim:
ConnectionFactory::getConnection();
Crie na classe FabricaConexao esse método:
public static function closeConnection($con, $stmt = null, $rs = null) {
if($con != null) {
try {
$con = null;
}
catch(PDOException $ex) {
echo "ERRO: {$ex->getMessage()}";
}
}
if($stmt != null) {
try {
$stmt = null;
}
catch(PDOException $ex) {
echo "ERRO: {$ex->getMessage()}";
}
}
if($rs != null) {
try {
$rs = null;
}
catch(PDOException $ex) {
echo "ERRO: {$ex->getMessage()}";
}
}
}
Esse método usaremos para fechar a conexão ao chamar outros métodos.
Crie uma classe com esse código:
class Produto {
private $id;
private $descricao;
private $qtd;
private $valor;
public function getId() {
return $this->id;
}
public function getDescricao() {
return $this->descricao;
}
public function getQtd() {
return $this->qtd;
}
public function getValor() {
return $this->valor;
}
public function setId($id) {
$this->id = $id;
}
public function setDescricao($descricao) {
$this->descricao = $descricao;
}
public function setQtd($qtd) {
$this->qtd = $qtd;
}
public function setValor($valor) {
$this->valor = $valor;
}
}
Agora crie a classe ProdutoDAO com esse código:
require_once "ConnectionFactory.php";
require_once "Produto.php";
class ProdutoDAO {
private $con = null;
public function __construct() {
$this->con = ConnectionFactory::getConnection();
}
public function save($prod) {
$sql = "insert into produto (descricao, qtd, valor) values (?, ?, ?)";
$stmt = null;
try {
$stmt = $this->con->prepare($sql);
$stmt->bindValue(1, $prod->getDescricao());
$stmt->bindValue(2, $prod->getQtd());
$stmt->bindValue(3, $prod->getValor());
$stmt->execute();
return true;
}
catch(PDOException $ex) {
echo "Erro: " . $ex;
}
finally { // Isso fecha a conexão
ConnectionFactory::closeConnection($this->con, $stmt);
}
}
}
Crie também a classe ProdutoDAOTest:
require_once "Produto.php";
require_once "ProdutoDAO.php";
class ProdutoDAOTest {
public function inserir() {
$prod = new Produto();
$prod->setDescricao("Feijão");
$prod->setQtd(20);
$prod->setValor(10);
$dao = new ProdutoDAO();
if($dao->save($prod)) {
echo "Salvo com Sucesso!";
}
else {
echo "Erro ao Salvar!";
}
}
}
E no index coloque isso pra inserir o dado:
require_once "ProdutoDAOTest.php";
$test = new ProdutoDAOTest();
$test->inserir();
Em ProdutoDAO, coloque esse método:
public function findAll() {
$sql = "select * from produto";
$stmt = null;
$rs = null;
$produtos = array();
try {
$stmt = $this->con->prepare($sql);
$stmt->execute();
$rs = $stmt->fetchAll();
$total = $rs[0] ?? 0;
foreach($rs as $r) {
$prod = new Produto();
$prod->setId($r["id"]);
$prod->setDescricao($r["descricao"]);
$prod->setQtd($r["qtd"]);
$prod->setValor($r["valor"]);
array_push($produtos, $prod);
}
}
catch(PDOException $ex) {
echo "ERRO: {$ex->getMessage()}";
}
finally {
ConnectionFactory::closeConnection($this->con, $stmt, $rs);
}
return $produtos;
}
Em ProdutoDAOTest, coloque isso:
public function listar() {
$dao = new ProdutoDAO();
foreach($dao->findAll() as $p) {
echo "<hr/>";
echo "Descrição: {$p->getDescricao()}<br/>";
echo "Qtd: {$p->getQtd()}<br/>";
echo "Valor: {$p->getValor()}<br/>";
echo "<hr/>";
}
}
E no index.php, apenas isso:
$test = new ProdutoDAOTest();
$test->listar();
Em ProdutoDAO, adicione um método dessa forma:
public function update($prod) {
$sql = "update produto set descricao = ?, qtd = ?, valor = ? where id = ?";
$stmt = null;
try {
$stmt = $this->con->prepare($sql);
$stmt->bindValue(1, $prod->getDescricao());
$stmt->bindValue(2, $prod->getQtd());
$stmt->bindValue(3, $prod->getValor());
$stmt->bindValue(4, $prod->getId());
$stmt->execute();
return true;
}
catch(PDOException $ex) {
echo "Erro: " . $ex;
}
finally {
ConnectionFactory::closeConnection($this->con, $stmt);
}
}
E na classe ProdutoDAOTest coloque isso:
public function atualizar() {
$prod = new Produto();
$prod->setDescricao("Farinha");
$prod->setQtd(20);
$prod->setValor(10);
$prod->setId(2);
$dao = new ProdutoDAO();
if($dao->update($prod)) {
echo "Atualizado com Sucesso!";
}
else {
echo "Erro ao Atualizar!";
}
}
E no index coloque isso pra atualizar o dado:
$test = new ProdutoDAOTest();
$test->atualizar();
Em ProdutoDAO, adicione um método dessa forma:
public function delete($prod) {
$sql = "delete from produto where id = ?";
$stmt = null;
try {
$stmt = $this->con->prepare($sql);
$stmt->bindValue(1, $prod->getId());
$stmt->execute();
return true;
}
catch(PDOException $ex) {
echo "Erro: " . $ex;
}
finally {
ConnectionFactory::closeConnection($this->con, $stmt);
}
}
E na classe ProdutoDAOTest coloque isso:
public function excluir() {
$prod = new Produto();
$prod->setId(3);
$dao = new ProdutoDAO();
if($dao->delete($prod)) {
echo "Deletado com Sucesso!";
}
else {
echo "Erro ao Deletar!";
}
}
E no index coloque isso pra excluir o dado:
$test = new ProdutoDAOTest();
$test->excluir();