0x01:PDOが正常にインストールされているかどうかをテストします
次のコードを実行します。パラメーターが間違っている場合、PDOがインストールされていることを意味します。オブジェクトが存在しない場合は、PHP構成ファイルphp.iniを変更し、以前のphp_pdo_yourssqlserverhere.extisのコメントをキャンセルします。
コードコピーは次のとおりです。
$ test = new PDO();
0x02:データベースに接続します
Apacheサーバーを実行し、サーバーが実行され、PDOのインストールが成功していることを確認します。次に、データベースに接続しましょう。
コードコピーは次のとおりです。
$ dsn = 'mysql:dbname = demo; host = localhost; port = 3306';
$ username = 'root';
$ password = 'password_here';
試す {
$ db = new pdo($ dsn、$ username、$ password);
} catch(pdoexception $ e){
die( 'データベースに接続できませんでした:
'。 $ e);
}
0x03:基本クエリ
PDOでクエリとexecを使用すると、クエリのデータベースは非常に簡単になります。クエリ結果の行数を取得したい場合は、選択したクエリステートメントに非常に役立ちます。
コードコピーは次のとおりです。
$ステートメント= <<< sql
select *
「食べ物」から
ここで「健康」= 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は、最初の結果のみを返すだけのフェッチ方法もサポートしています。
0x06:ユーザーが入力した特殊文字を逃がします
PDOは、特殊文字が入力文字列に引用符を付けて場所から逃げることができるQuoteと呼ばれるメソッドを提供します。
コードコピーは次のとおりです。
$ input =これは「a」 ''かなり危険なstr'ingです
引用方法を使用して転送した後:
コードコピーは次のとおりです。
$ db-> quote($ input): 'this is/' s/'a/'/'/' pretty danger/'rous str/' ing '
0x07:exec()
PDOは、exec()メソッドを使用して、操作の更新、削除、挿入を実装できます。実行後、影響を受ける行の数を返します。
コードコピーは次のとおりです。
$ステートメント= <<< sql
「Foods」から削除します
ここで「健康」= 1;
SQL;
echo $ db-> exec($ statement);
0x08:前処理ステートメント
Execの方法とクエリはまだ広く使用され、PHPでサポートされていますが、PHPの公式Webサイトでは、すべての人が事前処理ステートメントを使用してそれらを置き換えることを要求しています。なぜ?主に:それはより安全です。前処理ステートメントでは、パラメーターを実際のクエリに直接挿入することはありません。これにより、多くの潜在的なSQL注入が回避されます。
ただし、何らかの理由で、PDOは実際には実際にはプレ前処理を使用していません。前処理方法をシミュレートし、パラメーターデータをステートメントに挿入してから、ステートメントをSQLサーバーに渡すため、一部のシステムはSQLインジェクションの影響を受けやすくなります。
SQL Serverが事前抑制を実際にサポートしていない場合、次のようにPDO初期化中にパラメーターを渡すことでこの問題を簡単に修正できます。
コードコピーは次のとおりです。
$ db-> setattribute(pdo :: attr_emulate_prepares、false);
これが私たちの最初の前処理ステートメントです:
コードコピーは次のとおりです。
$ statement = $ db-> prepare( 'select * from from where `name` =?and` healthy` =?');
$ statement2 = $ db-> prepare( 'select * from from from where `name` =:name and` healthy` =:Healthy)';
上記のコードに示すように、パラメーター、名前と匿名を作成する2つの方法があります(同時に1つのステートメントに表示することはできません)。次に、BindValueを使用して入力を入力できます。
コードコピーは次のとおりです。
$ statement-> bindValue(1、 'cake');
$ステートメント - > bindValue(2、true);
$ statement2-> bindValue( ':name'、 'pie');
$ Statement2-> bindValue( ':Healthy'、false);
指定されたパラメーターを使用する場合、コロン(:)を含める必要があることに注意してください。 PDOにはBindParamメソッドもあります。これは、参照によって数値をバインドできることです。つまり、ステートメントが実行されたときに対応する数値値を探すだけです。
今やるべきことは、私たちの声明を実行することです。
コードコピーは次のとおりです。
$ statement-> execute();
$ statement2-> execute();
//結果を取得します:
$ cake = $ statement-> fetch();
$ pie = $ Statement2-> fetch();
BindValue Code Fragmentsのみを使用しないようにするには、配列を使用して、次のようなパラメーターとして実行メソッドを提供できます。
コードコピーは次のとおりです。
$ statement-> execute(array(1 => 'cake'、2 => true));
$ statement2-> execute(array( ':name' => 'pie'、 ':healthy' => false));
0x09:トランザクション
トランザクションは、一連のクエリを実行することですが、データベースへの影響を節約しません。これの利点は、4つの相互依存の挿入ステートメントを実行すると、失敗した場合、ロールバックして他のデータをデータベースに挿入できないようにして、相互依存フィールドを正しく挿入できるようにすることです。サポートトランザクションを使用しているデータベースエンジンを確認する必要があります。
0x10:トランザクションを開始します
BeginTransaction()メソッドを使用して、トランザクションを開始できます。
コードコピーは次のとおりです。
$ db-> begintransaction();
$ db-> intransaction(); // 真実!
その後、データベース操作ステートメントを引き続き実行し、最後にトランザクションを送信できます。
コードコピーは次のとおりです。
$ db-> commive();
MySQLIと同様のロールバック()メソッドもありますが、すべてのタイプ(たとえば、MySQLでドロップテーブルを使用する)はロールバックしません。この方法は本当に信頼できません。この方法に依存しないようにすることをお勧めします。
0x11:その他の便利なオプション
使用することを検討できるオプションがいくつかあります。これらは、オブジェクトが初期化されたときに4番目のパラメーターとして入力できます。
コードコピーは次のとおりです。
$ options = array($ option1 => $ value1、$ option [..]);
$ db = new PDO($ dsn、$ username、$ password、$ options);
pdo :: attr_default_fetch_mode
pdo :: fetch_assocなど、$ result ['column_name']を使用できるようにするpdo :: fetch_assocなど、pdoが返される場合、PDOが返されるものを選択できます。
このように、個々のクエリごとに読み取りモードを設定することにより、結果を特定のクラス(モデル)に配置することもできます。
コードコピーは次のとおりです。
$ 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 :: attr_errModeが変更されない限り、デフォルトのE_WARNING例外がスローされることに注意してください。