sql >> データベース >  >> RDS >> Mysql

OOP PDOで準備ステートメントと実行ステートメントを作成するにはどうすればよいですか?

    説明が苦手なのですが、久しぶりに答えが出ないのがわかります。 PDOを使用して値を挿入するための基本的なクラスを作成しました。正しい方向を示してくれることを願っています。また、役立つリンクをいくつか紹介します。

    まず接続します。

    クラスですでに接続を行っていることがわかりますが、以下が適切な最良のpdo接続です。

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

    これが、適切なPDO接続を設定する方法です。 DNS データソース名の略です 上記のhttps://phpdelusions.net/pdo#dsn の参照 この男はそれをよりよく説明します。知っておくべきことすべて。

    では、どのようにしてそのつながりをクラスと一緒にまとめますか?

    さて、pdoClass.phpを収集するファイルを作成し、そのクラスから作業します。

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

    基本的に、データベースとデータベースに挿入する関数を設定するために必要なのはこれだけです。いくつかのセクションにコメントを付けようとしました。

    このクラスを使用するには、index.phpまたは好きなものを作成します。次に、クラスを含めます

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

    完了しました。ご不明な点がある場合や、説明が必要な場合は、以下にコメントしてください。できる限りサポートさせていただきます。

    編集: 結果を取得する必要がある場合は、クラスに新しい関数を作成することもできます。

    単一行:

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

    fetch();を使用していることを確認してください 1行のみをフェッチします。ほとんどの人は、結果をフェッチするときに、このfetch(PDO::FETCH_ASSOC)のように結果をフェッチします。 ただし、適切な接続を行い、接続でデフォルトのフェッチモードを定義したため、fetch()を使用できるすべてのものは必要ありません。;

    これらの結果をindex.phpファイルに表示するには、次のようにします:

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

    これにより、joeの結果が配列として表示されます。

    dbからすべての結果を取得するには

    すべての結果を表示する別の機能を実行します。

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

    fetchall()を使用するようになりました。 すべての結果が必要だからです。

     $users->insertUserValues("SELECT *  FROM test");
        $row = $users->All();
    
        echo '<pre>';
        print_r($row);
        echo '</pre>';
    
    ';


    1. パフォーマンスの質問:重複キーの更新と更新(MySQL)について

    2. MySQLでデータベースとテーブルを作成および削除する方法

    3. Innodbページサイズ設定

    4. ClusterControlを使用したMySQLおよびMariaDBのPCIコンプライアンス