sql >> Databasteknik >  >> RDS >> Mysql

Hur skriver man preparera och exekvera uttalanden i OOP PDO?

Jag är inte riktigt bra på förklaringar bru, men jag ser bara att det inte finns något svar efter en lång tid. Jag har skapat en grundläggande klass för dig att infoga värden med hjälp av PDO, jag hoppas att det kommer att peka dig till rätt riktning, jag kommer också att dela några användbara länkar för dig.

Anslut först.

Jag kan se att du har gjort anslutningen redan i din klass, men nedan är den bästa PDO-anslutningen.

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

det är så du ställer in korrekt PDO-anslutning. dns står för datakällans namn Referens till ovanstående https://phpdelusions.net/pdo#dsn den här killen förklarar det bättre. allt du behöver veta.

Hur sätter du ihop den kopplingen med din klass?

väl jag kommer att skapa en fil collect pdoClass.php och arbeta från den klassen.

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

?>

i princip det är allt du behöver för att ställa in databasen och funktionen att infoga i din db, jag har försökt kommentera några avsnitt.

För att använda denna klass skapa index.php eller vad du nu vill. inkludera sedan klassen

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

?>

Klart, om du har några frågor eller vill att jag ska förklara något, kommentera gärna nedan. Jag ska göra mitt bästa för att hjälpa dig.

Redigera: om du behöver hämta resultaten kan du även skapa en ny funktion i klassen,

En rad :

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

se vi använder fetch(); att bara hämta en rad. de flesta när de hämtar resultat kommer att hämta dem så här fetch(PDO::FETCH_ASSOC) men eftersom vi gjorde en ordentlig anslutning och definierade vårt standardhämtningsläge i anslutningen behöver vi inte allt som vi bara kan använda fetch();

för att visa dessa resultat på din index.php-fil så här gör du :

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

detta kommer att visa joes resultat som en array.

för att få alla resultat från vår db

vi gör en annan funktion för att visa alla resultat.

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

Du ser skillnaden nu vi använder fetchall() eftersom vi vill ha alla resultat.

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

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


  1. Hur man aktiverar arkivloggningsläge i Oracle Database 19c

  2. FEL 1215:Kan inte lägga till en främmande nyckel-begränsning när du använder ON DELETE SET NULL

  3. Hur man hanterar flera objekt med hjälp av Object Explorer Detail Windows i SSMS - SQL Server / TSQL Tutorial Del 22

  4. korstabell med två (eller fler) radnamn