Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como escrever instruções de preparação e execução em OOP PDO?


Não sou muito bom com explicações bru, mas só vejo que não há resposta depois de muito tempo. Eu criei uma classe básica para você inserir valores usando o PDO, espero que te aponte a direção correta, também compartilharei alguns links úteis para você.

Primeiro a conexão.

Eu posso ver que você já fez a conexão em sua classe, mas abaixo está a melhor conexão pdo adequada.
    $host = '127.0.0.1';
    $db   = 'YourDatabase';
    $user = 'YourDBUser';
    $pass = 'YourDBPass';
    $charset = 'utf8';

    $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
    $opt = [
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES   => false,
            ];

$dbh = new PDO($dsn, $user, $pass, $opt);

é assim que você configura a conexão PDO adequada. dns significa nome da fonte de dados Referência do https://phpdelusions.net/pdo#dsn acima esse cara explica melhor. tudo o que você precisa saber.

Agora, como você coloca essa conexão toda junto com sua classe?

bem vou criar um arquivo collect pdoClass.php e trabalhar a partir dessa classe.
<?php
class Connection
{
    private $host = "127.0.0.1";
    private $dbName = "YourDB";
    private $user = "YourUser";
    private $pass = "YourPass";
    private $charset = 'utf8';

    private $dbh;
    private $error;
    private $stmt;

    //connection
    public function __construct()
    {
        $dsn     = "mysql:host=" . $this->host . ";dbname=" . $this->dbName . ";charset=" . $this->charset;
        $options = array(
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES => false
        );

        try {
            // setup connection
            $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
        }
        //catch any errors
        catch (PDOException $e) {
            $this->error = $e->getMessage();
        }

    }

    //prepare statement
    public function insertUserValues($query)
    {
        $this->stmt = $this->dbh->prepare($query);
    }

    //bind values
    public function bind($param, $value, $type = null)
    {
        if (is_null($type)) {
            switch (true) {
                case is_int($value):
                    $type = PDO::PARAM_INT;
                    break;
                case is_bool($value):
                    $type = PDO::PARAM_BOOL;
                    break;
                case is_null($value):
                    $type = PDO::PARAM_NULL;
                    break;
                default:
                    $type = PDO::PARAM_STR;
            }
        }
        //actual value binding
        $this->stmt->bindValue($param, $value, $type);
    }
    //execute statement
    public function run()
    {
        return $this->stmt->execute();
    }
}

?>

basicamente isso é tudo que você precisa para configurar o banco de dados e a função para inserir no seu db, tentei comentar algumas seções.

Agora, para usar esta classe, crie index.php ou o que você quiser. então inclua a classe
<?php
    include'pdoClass.php';


    $users = new Connection();

    $users->insertUserValues('INSERT INTO test (name, age, description) VALUES(?,?,?)');
    $users->bind(1, 'User'); //bind each value
    $users->bind(2, 391); // bind
    $users->bind(3, 'This is a value');
    if($database->run()){

        echo "record inserted";
    }

?>

Feito, se você tiver alguma dúvida ou quiser que eu explique qualquer coisa, sinta-se à vontade para comentar abaixo que farei o possível para ajudá-lo.

Editar: se você precisar buscar os resultados, você também pode fazer uma nova função na classe,

Linha única:
public function SingleRow(){
      $this->run();
      return $this->stmt->fetch();
  }

veja que usamos fetch(); para buscar apenas uma linha. a maioria das pessoas ao buscar resultados irá buscá-los assim fetch(PDO::FETCH_ASSOC) mas como fizemos uma conexão adequada e definimos nosso modo de busca padrão na conexão, não precisamos de tudo, podemos apenas usar fetch();

para exibir esses resultados em seu arquivo index.php, é assim que você fará:
$users->insertUserValues("SELECT name, age, description FROM test WHERE name = :name");
$users->bind(':name','joe');
$row = $users->SingleRow();

echo '<pre>';
print_r($row);
echo '</pre>';
';
isso exibirá o resultado de joe como uma matriz.

para obter todos os resultados do nosso banco de dados

fazemos outra função para exibir todos os resultados.
 public function All(){
          $this->run();
          return $this->stmt->fetchall();
      }

Você vê a diferença agora que usamos fetchall() porque queremos todos os resultados.
 $users->insertUserValues("SELECT *  FROM test");
    $row = $users->All();

    echo '<pre>';
    print_r($row);
    echo '</pre>';
';