Mysql
 sql >> Database >  >> RDS >> Mysql

Come scrivere preparare ed eseguire istruzioni in OOP PDO?

Non sono molto bravo con le spiegazioni, ma vedo solo che non c'è risposta dopo molto tempo. Ho creato una classe base per inserire valori utilizzando PDO, spero che ti indichi la direzione corretta, condividerò anche alcuni link utili per te.

Prima la connessione.

Vedo che hai già effettuato la connessione nella tua classe, ma di seguito è riportata la migliore connessione pdo corretta.

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

è così che si imposta una corretta connessione PDO. DN sta per nome origine dati Riferimento a quanto sopra https://phpdelusions.net/pdo#dsn questo ragazzo lo spiega meglio. tutto quello che devi sapere.

Ora, come metti insieme quella connessione con la tua classe?

bene creerò un file raccogliere pdoClass.php e lavorerò da quella 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();
    }
}

?>

in pratica è tutto quello che ti serve per impostare il database e la funzione da inserire nel tuo db, ho provato a commentare alcune sezioni.

Ora per usare questa classe crea index.php o quello che vuoi. quindi includi la 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";
    }

?>

Fatto, se hai qualche domanda o ti piace che ti spieghi qualcosa, sentiti libero di commentare di seguito, farò del mio meglio per aiutarti.

Modifica : se hai bisogno di recuperare i risultati, puoi anche creare una nuova funzione nella classe,

Riga singola :

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

vediamo che usiamo fetch(); per recuperare solo una riga. la maggior parte delle persone quando recupera i risultati li recupera in questo modo fetch(PDO::FETCH_ASSOC) ma poiché abbiamo eseguito una connessione corretta e definito la nostra modalità di recupero predefinita nella connessione, non abbiamo bisogno di tutto ciò che possiamo semplicemente usare fetch();

per visualizzare quei risultati sul tuo file index.php questo è come farai:

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

questo mostrerà il risultato di joe come un array.

per ottenere tutti i risultati dal nostro db

facciamo un'altra funzione per visualizzare tutti i risultati.

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

Vedi la differenza ora usiamo fetchall() perché vogliamo tutti i risultati.

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

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