PHPはPDO、mysqli拡張を使用してデータベースとの相互作用の詳細を実現する

5293 ワード

この例では、PDO、mysqli拡張機能を使用したPHPのデータベースとの相互作用について説明します.皆さんの参考にしてください.具体的には以下の通りです.
データベース#データベース#
phpを開発するとき、phpデータベースの接続インタラクションを学習している人もいれば、学習の準備をしている人もいるかもしれません.現在、phpのトレンドに従ってmysqlの拡張は開発を停止しており、mysql->query()やmysql->connect()など、後で使用できない可能性があります.PDOとmysqli拡張をできるだけ使用します.
PDO
基本的な操作は次のとおりです.

getMessge();
}
$statement = $pdo->query("SELECT some_field FROM some_table");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['some_field']);
// PDO + SQLite
$pdo = new PDO('sqlite:/path/db/foo.sqlite');
$statement = $pdo->query("SELECT some_field FROM some_table");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['some_field']);
//    
$pdo=null;


PDOはSQLリクエストを変換したり、存在しない機能特性をシミュレーションしたりしません.単純に同じAPIを使用して異なる種類のデータベースに接続するだけです.
さらに重要なのは、PDOがSQL注入の問題を心配することなく、外部入力(例えばID)をSQLリクエストに安全に挿入できることです.これはPDO文と限定パラメータを用いて実現できる.
PHPスクリプトが要求パラメータとしてデジタルIDを受信すると仮定する.このIDは、データベースからユーザレコードを取り出すために使用されるべきである.次は誤った方法です.

query("SELECT name FROM users WHERE id = " . $_GET['id']); //  
 

これは悪いコードです.元のリクエストパラメータをSQLリクエストに挿入しています.これにより、ハッカーが[SQL注入]方式で簡単に攻撃できるようになります.ハッカーが構造のidパラメータを画像に通すとhttp://domain.com/?id=1%3BDELETE+FROM+usersのようなURLが入ります.これにより$GET['id']変数の値は1に設定されます.DELETE FROM usersが実行され、すべてのuserレコードが削除されます!したがって、PDO制限パラメータを使用してID入力をフィルタする必要があります.

prepare('SELECT name FROM users WHERE id = :id');
$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT); // bindParam(':id', $id, PDO::PARAM_INT); // execute();


これは正しいコードです.PDO文で制限パラメータを使用します.これにより、潜在的なSQL注入攻撃を防止するために、外部ID入力がデータベースに送信される前にエスケープされる.
INSERTやUPDATEなどの書き込み操作では、データのフィルタリングやその他のコンテンツのクリーンアップ(HTMLラベルの削除、Javascriptなど)が特に重要です.PDOはSQLのクリーンアップのみを行い、アプリケーションの処理は行われません.
mysqli拡張
mysqliの基本的な操作は次のとおりです.

connect_error) {
  die("    : " . $conn->connect_error);
} 
echo "    ";
?>


注上記のオブジェクト向けインスタンスでは$connect_ErrorはPHP 5.2.9と5.3.0に追加されています.以前のバージョンと互換性が必要な場合は、次のコードで置き換えます.

//     
if (mysqli_connect_error()) {
  die("       : " . mysqli_connect_error());
}


データベースのインタラクション

query('SELECT * FROM table') as $row) {
echo "
  • ".$row['field1']."- ".$row['field1']."
  • ";
    }
    ?>
    これは多くの面から間違ったやり方であり、主に読みにくく、テストとデバッグが難しいためです.また、制限を加えないと、非常に多くのフィールドが出力されます.
    この作業を完了するには、オブジェクト向けプログラミング(OOP)に傾いているか、関数式プログラミングに傾いているかによって異なりますが、いくつかの分離要素が必要です.
    最も基本的な方法を見てみましょう.
    
    query('SELECT * FROM table');
    }
    foreach (getAllFoos($db) as $row) {
      echo "
  • ".$row['field1']."- ".$row['field1']."
  • ";
    }
    これはいい冒頭です.この2つの要素を2つの異なるファイルに入れてきれいに分離しました.上の関数を配置するためにクラスを作成すると、「Model」が得られます.簡単な.phpファイルを作成して表現ロジックを保存すると、「View」が得られます..これはMVCに近いです.ほとんどのフレームワークでよく使われるオブジェクト向けのアーキテクチャです.
    //foo.php
    
    getAllFoos();
    //     
    include 'views/foo-list.php';
    
    

    //models/FooModel.php
    
    db = $db;
      }
      public function getAllFoos() {
        return $this->db->query('SELECT * FROM table');
      }
    }
    
    

    //views/foo-list.php
    
    
      = $row['field1'] ?> - = $row['field1'] ?>
    
    
    

    多くのフレームワークは独自のデータベース抽象層を提供しています.その中のいくつかはPDOの上層部に設計されています.これらの抽象層は通常、あなたの要求をPHPメソッドにパッケージし、シミュレーションによってあなたのデータベースに以前サポートされていなかった機能を持たせます.この抽象は、PDOが提供したデータベース接続抽象だけでなく、本当のデータベース抽象です.クラス抽象は確かにパフォーマンスオーバーヘッドをある程度増加させますが、設計中のアプリケーションがMySQL、PostgreSQL、SQLiteを同時に使用する必要がある場合、わずかな追加のパフォーマンスオーバーヘッドはコードの清潔性の向上に価値があります.
    PHPに関する詳細について興味のある読者は、「PHPはpdoに基づいてデータベースを操作するテクニックの総括」、「php+mysqliデータベースプログラム設計テクニックの総括」、「phpオブジェクト向けプログラム設計入門チュートリアル」、「php文字列(string)用法の総括」、「php+mysqlデータベース操作入門チュートリアル」および「phpよくあるデータベース操作テクニックの総括」を参照してください.
    ここで述べたことが皆さんのPHPプログラム設計に役立つことを願っています.