Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm thế nào để viết các câu lệnh chuẩn bị và thực thi trong OOP PDO?

Tôi không thực sự giỏi trong việc giải thích bầm dập, nhưng tôi chỉ thấy rằng không có câu trả lời sau một thời gian dài. Tôi đã tạo một lớp cơ bản để bạn chèn giá trị bằng PDO, tôi hy vọng nó sẽ chỉ cho bạn hướng đi chính xác, tôi cũng sẽ chia sẻ một số liên kết hữu ích cho bạn.

Đầu tiên là kết nối.

Tôi có thể thấy bạn đã thực hiện xong kết nối trong lớp học của mình, nhưng dưới đây là kết nối pdo tốt nhất thích hợp.

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

đó là cách bạn thiết lập kết nối PDO thích hợp. dns viết tắt của tên nguồn dữ liệu Tham chiếu https://phpdelusions.net/pdo#dsn ở trên anh chàng này giải thích nó tốt hơn. mọi thứ bạn cần biết.

Bây giờ bạn làm cách nào để kết nối tất cả các kết nối đó lại với nhau với lớp học của bạn?

Tôi sẽ tạo một tệp thu thập pdoClass.php và làm việc từ lớp đó.

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

?>

Về cơ bản, đó là tất cả những gì bạn cần để thiết lập cơ sở dữ liệu và chức năng để chèn vào db của mình, tôi đã thử nhận xét một số phần.

Bây giờ để sử dụng lớp này, hãy tạo index.php hoặc những gì bạn thích. sau đó bao gồm lớp

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

?>

Xong, nếu các bạn có thắc mắc hay muốn mình giải thích gì thì cứ comment bên dưới mình sẽ cố gắng hết sức để hỗ trợ các bạn.

Chỉnh sửa: nếu bạn cần tìm nạp kết quả, bạn cũng có thể tạo một hàm mới trong lớp,

Hàng đơn:

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

xem chúng tôi sử dụng fetch(); để chỉ tìm nạp một hàng. hầu hết mọi người khi họ tìm nạp kết quả sẽ tìm nạp chúng như thế này fetch(PDO::FETCH_ASSOC) nhưng bởi vì chúng tôi đã thực hiện một kết nối thích hợp và xác định chế độ tìm nạp mặc định của chúng tôi trong kết nối, chúng tôi không cần tất cả những gì mà chúng tôi có thể sử dụng fetch();

để hiển thị những kết quả đó trên tệp index.php của bạn, đây là cách bạn sẽ làm:

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

điều này sẽ hiển thị kết quả của joe dưới dạng một mảng.

để nhận tất cả kết quả từ db của chúng tôi

chúng tôi thực hiện một chức năng khác để hiển thị tất cả kết quả.

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

Bạn thấy sự khác biệt bây giờ chúng tôi sử dụng fetchall() bởi vì chúng tôi muốn tất cả các kết quả.

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

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi SQL tôi không thể tìm ra điều này

  2. Lỗi xuất hiện trong sql khi cố gắng thêm nhiều khóa ngoại

  3. Java - MySQL sang Hive Nhập trong đó MySQL đang chạy trên Windows và Hive đang chạy trên Cent OS (Horton Sandbox)

  4. Làm thế nào để phát hiện các deadlock trong Mysql / innodb?

  5. Cú pháp MySQL trong việc tạo khóa ngoại