PHP PDO操作のまとめ_JavaScriptスキル

WBOY
リリース: 2016-05-16 16:31:13
オリジナル
1520 人が閲覧しました

0x01: PDO が正常にインストールされているかどうかをテストします

次のコードを実行します。パラメーター エラーが表示された場合は、PDO がインストールされています。オブジェクトが存在しない場合は、PHP 構成ファイル php.ini を変更し、php_pdo_yourssqlserverhere.extis の前のコメントをキャンセルします。

コードをコピーします コードは次のとおりです:

$test=新しい PDO();

0x02: データベース

に接続します

Apache サーバーを実行し、サーバーが実行されていて PDO が正常にインストールされていることを確認してから、データベースに接続しましょう。

コードをコピーします コードは次のとおりです:

$dsn = 'mysql:dbname=demo;host=localhost;port=3306';
$username = 'root';
$password = 'password_here';
{
を試してください $db = 新しい PDO($dsn, $username, $password); } catch(PDOException $e) {
Die('データベースに接続できませんでした:
' . $e);
}

0x03: 基本クエリ

PDO で query メソッドと exec メソッドを使用すると、データベース クエリが非常に簡単になります。クエリ結果の行数を取得する場合、exec は非常に使いやすいため、SELECT クエリ ステートメントに非常に役立ちます。

コードをコピーします コードは次のとおりです:
$statement = << 選択 *
`食べ物`から
WHERE `健康` = 0
SQL;

$foods = $db->query($statement);

上記のクエリが正しい場合、$foods は PDO ステートメント オブジェクトになり、このオブジェクトから必要な結果とクエリした結果セットの合計数を取得できます。

0x04: 行数を取得

Mysql データベースを使用している場合、次のコードに示すように、PDO ステートメントには結果セット内の行数を取得する rowCount メソッドが含まれています。


コードをコピー コードは次のとおりです:
echo $foods->rowCount;

0x05: 結果セットを走査します

PDO ステートメントは、次のコードに示すように、forech ステートメントを使用して走査できます。


foreach($foods->FetchAll() as $food) {
echo $food['name'] '
';
}


PDO は、最初の結果のみを返す Fetch メソッドもサポートしています。

0x06: ユーザーが入力した特殊文字をエスケープします

PDO は、入力文字列内の引用符のある場所で特殊文字をエスケープできる、quote と呼ばれるメソッドを提供します。

コードをコピーします コードは次のとおりです:
$input= これは「かなり危険な」ストリングです


見積もり方法を使用して転送した後:


$db->quote($input): 「これは」「かなり危険な「危険な文字列」です


0x07: exec()

PDO は、exec() メソッドを使用して UPDATE、DELETE、INSERT 操作を実装できます。実行後、影響を受ける行の数が返されます。

コードをコピーします コードは次のとおりです:
$statement = << 「食品」から削除
WHERE `健康` = 1;
SQL;
echo $db->e​​xec($statement);

0x08: 準備されたステートメント

実行メソッドとクエリは依然として PHP で広く使用されサポートされていますが、PHP 公式 Web サイトでは、代わりに準備されたステートメントを使用することが依然として求められています。なぜ?主な理由は、そのほうが安全だからです。準備されたステートメントは実際のクエリにパラメーターを直接挿入しないため、潜在的な SQL インジェクションの多くが回避されます。

ただし、何らかの理由で、PDO は実際には前処理を使用せず、SQL サーバーに渡す前に前処理をシミュレートしてステートメントにパラメータ データを挿入します。これにより、システムが SQL インジェクションに対して脆弱になります。

SQL サーバーが実際には前処理をサポートしていない場合は、次のように PDO の初期化中にパラメータを渡すことで、この問題を簡単に解決できます。

コードをコピー コードは次のとおりです:

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

これが最初に準備されたステートメントです:

コードをコピーします コードは次のとおりです:

$statement = $db->prepare('SELECT * FROM food WHERE `name`=? AND `healthy`=?');
$statement2 = $db->prepare('SELECT * FROM food WHERE `name`=:name AND `healthy`=:healthy)';

上記のコードに示されているように、パラメーターを作成するには、名前付きと匿名の 2 つの方法があります (1 つのステートメントに同時に使用することはできません)。次に、bindValue を使用して入力を入力できます:

コードをコピー コードは次のとおりです:

$statement->bindValue(1, 'Cake');
$statement->bindValue(2, true);

$statement2->bindValue(':name', 'Pie');
$statement2->bindValue(':healthy', false);

名前付きパラメータを使用する場合は、コロン (:) を含める必要があることに注意してください。 PDO には、参照によって値をバインドできる bindingParam メソッドもあります。これは、ステートメントの実行時に対応する値のみを検索することを意味します。

あとはステートメントを実行するだけです:

コードをコピーします コードは次のとおりです:

$statement->execute();
$statement2->execute();

// 結果を取得します:
$cake = $statement->Fetch();
$pie = $statement2->Fetch();

bindValue のみを使用することによって引き起こされるコードの断片化を避けるために、次のように配列を実行メソッドのパラメータとして使用できます。

コードをコピーします コードは次のとおりです:

$statement->execute(array(1 => 'Cake', 2 => true));
$statement2->execute(array(':name' => 'Pie', ':healthy' => false));

0x09: トランザクション

トランザクションは一連のクエリを実行しますが、その結果はデー​​タベースに保存されません。この利点は、4 つの相互依存する挿入ステートメントを実行する場合、1 つが失敗したときにロールバックして、他のデータをデータベースに挿入できないようにして、相互依存するフィールドを正しく挿入できることです。使用するデータベース エンジンがトランザクションをサポートしていることを確認する必要があります。

0x10: トランザクションの開始

beginTransaction() メソッドを使用するだけでトランザクションを開始できます。

コードをコピー コードは次のとおりです:

$db->beginTransaction();
$db->inTransaction() // true!

その後、データベース操作ステートメントの実行を続行し、最後にトランザクションをコミットできます。

コードをコピー コードは次のとおりです:

$db->commit();

MySQLi にも rollBack() に似たメソッドがありますが、すべてのタイプをロールバックするわけではありません (MySQL での DROP TABLE の使用など)。このメソッドはあまり信頼できません。方法。

0x11: その他の便利なオプション

検討できるオプションはいくつかあります。これらは、オブジェクトを初期化するときに 4 番目のパラメーターとして入力できます。

コードをコピーします コードは次のとおりです:

$options = array($option1 => $value1, $option[..]);
$db = 新しい PDO($dsn, $username, $password, $options);

PDO::ATTR_DEFAULT_FETCH_MODE

$result['column_name'] を使用できる PDO::FETCH_ASSOC や、匿名オブジェクトを返す PDO::FETCH_OBJ など、PDO が返す結果セットのタイプを選択できます。 $result->column_name

を使用するには

次のように、個々のクエリごとに読み取りモードを設定することで、結果を特定のクラス (モデル) に入れることもできます。

コードをコピー コードは次のとおりです:

$query = $db->query('SELECT * FROM `foods`');
$foods = $query->fetchAll(PDO::FETCH_CLASS, 'Food');

PDO::ATTR_ERRMODE

これについては上ですでに説明しましたが、TryCatch が好きな人は PDO::ERRMODE_EXCEPTION を使用する必要があります。何らかの理由で PHP 警告をスローしたい場合は、PDO::ERRMODE_WARNING を使用します。

PDO::ATTR_TIMEOUT

読み込み時間が心配な場合は、この属性を使用してクエリのタイムアウトを秒単位で指定できます。設定した時間を超えると、PDO:: を除き、デフォルトで E_WARNING 例外がスローされることに注意してください。 ATTR_ERRMODE が変更されました。

関連ラベル:
php
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート