PHPはPDO、mysqli拡張を使用してデータベースとの相互作用の詳細を実現する
5293 ワード
この例では、PDO、mysqli拡張機能を使用したPHPのデータベースとの相互作用について説明します.皆さんの参考にしてください.具体的には以下の通りです.
データベース#データベース#
phpを開発するとき、phpデータベースの接続インタラクションを学習している人もいれば、学習の準備をしている人もいるかもしれません.現在、phpのトレンドに従ってmysqlの拡張は開発を停止しており、mysql->query()やmysql->connect()など、後で使用できない可能性があります.PDOとmysqli拡張をできるだけ使用します.
PDO
基本的な操作は次のとおりです.
PDOはSQLリクエストを変換したり、存在しない機能特性をシミュレーションしたりしません.単純に同じAPIを使用して異なる種類のデータベースに接続するだけです.
さらに重要なのは、PDOがSQL注入の問題を心配することなく、外部入力(例えばID)をSQLリクエストに安全に挿入できることです.これはPDO文と限定パラメータを用いて実現できる.
PHPスクリプトが要求パラメータとしてデジタルIDを受信すると仮定する.このIDは、データベースからユーザレコードを取り出すために使用されるべきである.次は誤った方法です.
これは悪いコードです.元のリクエストパラメータをSQLリクエストに挿入しています.これにより、ハッカーが[SQL注入]方式で簡単に攻撃できるようになります.ハッカーが構造のidパラメータを画像に通すとhttp://domain.com/?id=1%3BDELETE+FROM+usersのようなURLが入ります.これにより$GET['id']変数の値は1に設定されます.DELETE FROM usersが実行され、すべてのuserレコードが削除されます!したがって、PDO制限パラメータを使用してID入力をフィルタする必要があります.
これは正しいコードです.PDO文で制限パラメータを使用します.これにより、潜在的なSQL注入攻撃を防止するために、外部ID入力がデータベースに送信される前にエスケープされる.
INSERTやUPDATEなどの書き込み操作では、データのフィルタリングやその他のコンテンツのクリーンアップ(HTMLラベルの削除、Javascriptなど)が特に重要です.PDOはSQLのクリーンアップのみを行い、アプリケーションの処理は行われません.
mysqli拡張
mysqliの基本的な操作は次のとおりです.
注上記のオブジェクト向けインスタンスでは$connect_ErrorはPHP 5.2.9と5.3.0に追加されています.以前のバージョンと互換性が必要な場合は、次のコードで置き換えます.
データベースのインタラクション
echo " ".$row['field1']."- ".$row['field1']." ";
}
?>
これは多くの面から間違ったやり方であり、主に読みにくく、テストとデバッグが難しいためです.また、制限を加えないと、非常に多くのフィールドが出力されます.
この作業を完了するには、オブジェクト向けプログラミング(OOP)に傾いているか、関数式プログラミングに傾いているかによって異なりますが、いくつかの分離要素が必要です.
最も基本的な方法を見てみましょう. ".$row['field1']."- ".$row['field1']." ";
}
これはいい冒頭です.この2つの要素を2つの異なるファイルに入れてきれいに分離しました.上の関数を配置するためにクラスを作成すると、「Model」が得られます.簡単な.phpファイルを作成して表現ロジックを保存すると、「View」が得られます..これはMVCに近いです.ほとんどのフレームワークでよく使われるオブジェクト向けのアーキテクチャです.
//foo.php
//models/FooModel.php
//views/foo-list.php
多くのフレームワークは独自のデータベース抽象層を提供しています.その中のいくつかはPDOの上層部に設計されています.これらの抽象層は通常、あなたの要求をPHPメソッドにパッケージし、シミュレーションによってあなたのデータベースに以前サポートされていなかった機能を持たせます.この抽象は、PDOが提供したデータベース接続抽象だけでなく、本当のデータベース抽象です.クラス抽象は確かにパフォーマンスオーバーヘッドをある程度増加させますが、設計中のアプリケーションがMySQL、PostgreSQL、SQLiteを同時に使用する必要がある場合、わずかな追加のパフォーマンスオーバーヘッドはコードの清潔性の向上に価値があります.
PHPに関する詳細について興味のある読者は、「PHPはpdoに基づいてデータベースを操作するテクニックの総括」、「php+mysqliデータベースプログラム設計テクニックの総括」、「phpオブジェクト向けプログラム設計入門チュートリアル」、「php文字列(string)用法の総括」、「php+mysqlデータベース操作入門チュートリアル」および「phpよくあるデータベース操作テクニックの総括」を参照してください.
ここで述べたことが皆さんの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 "
}
?>
これは多くの面から間違ったやり方であり、主に読みにくく、テストとデバッグが難しいためです.また、制限を加えないと、非常に多くのフィールドが出力されます.
この作業を完了するには、オブジェクト向けプログラミング(OOP)に傾いているか、関数式プログラミングに傾いているかによって異なりますが、いくつかの分離要素が必要です.
最も基本的な方法を見てみましょう.
query('SELECT * FROM table');
}
foreach (getAllFoos($db) as $row) {
echo "
}
これはいい冒頭です.この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プログラム設計に役立つことを願っています.