sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo escribir declaraciones de preparación y ejecución en OOP PDO?

No soy muy bueno con las explicaciones hermano, pero veo que no hay respuesta después de mucho tiempo. Creé una clase básica para que insertes valores usando PDO, espero que te indique la dirección correcta, también compartiré algunos enlaces útiles para ti.

Primero la conexión.

Puedo ver que ya ha realizado la conexión en su clase, pero a continuación se muestra la mejor conexión pdo adecuada.

    $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);

así es como configura la conexión PDO adecuada. DNS significa nombre de la fuente de datos Referencia de lo anterior https://phpdelusions.net/pdo#dsn este chico lo explica mejor. todo lo que necesitas saber.

Ahora, ¿cómo pones esa conexión con tu clase?

bueno, crearé un archivo para recopilar pdoClass.php y trabajaré desde esa clase.

<?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();
    }
}

?>

básicamente eso es todo lo que necesita para configurar la base de datos y la función para insertar en su base de datos, he intentado comentar algunas secciones.

Ahora, para usar esta clase, cree index.php o lo que quiera. luego incluye la clase

<?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";
    }

?>

Listo, si tienes alguna pregunta o quieres que te explique algo, no dudes en comentar a continuación. Haré todo lo posible para ayudarte.

Editar: si necesita obtener los resultados, también puede crear una nueva función en la clase,

Fila única:

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

mira, usamos fetch(); para obtener solo una fila. la mayoría de las personas cuando buscan resultados los obtendrán así fetch(PDO::FETCH_ASSOC) pero debido a que hicimos una conexión adecuada y definimos nuestro modo de búsqueda predeterminado en la conexión, no necesitamos todo eso, solo podemos usar fetch();

para mostrar esos resultados en su archivo index.php, así es como lo hará:

$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>';
';

esto mostrará el resultado de joe como una matriz.

para obtener todos los resultados de nuestra base de datos

hacemos otra función para mostrar todos los resultados.

 public function All(){
          $this->run();
          return $this->stmt->fetchall();
      }

Ves la diferencia ahora que usamos fetchall() porque queremos todos los resultados.

 $users->insertUserValues("SELECT *  FROM test");
    $row = $users->All();

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