お久しぶりです。
最近、家の周りで工事が大量にされており騒音がひどくちょっとイライラしております。
ではでは、PHPをもっと知ろうのコーナーです!
PHPってmysqlなどのデータベースを操作できますよねー
その仕組みとは?ということで、
PDO = PHP Data Odjects
について知ろうと思います!!!
先ほども申した通り、PHPでデータベースを扱うためには、
PDO(= PHP Data Odjects)というオブジェクトを使います。
これにより
▶︎データベースに接続
▶︎データベース操作(SQLの実行)
を行うことができます。
▶︎データベース接続 …PDOクラスを使う
https://php.net によると
例1 ドライバ呼び出しにより PDO インスタンスを生成する
/* ドライバ呼び出しを使用して MySQL データベースに接続する */ $dsn = 'mysql:dbname=testdb;host=127.0.0.1'; $user = 'dbuser'; $password = 'dbpass'; try { $dbh = new PDO($dsn, $user, $password); } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage(); }
ドライバとは?ってなったんで私の中で落としこんだ意味が
ドライバ…データベースを扱うためするためのモジュール(プログラム)
つまりMysqlやPostgreSQL,SQLiteのことですね
//第一引数でデータベースドライバの種類:データベース名;host名の指定 $dsn = 'mysql:dbname=testdb;host=127.0.0.1';
//第二引数でデータベースユーザ名を指定 $user = 'dbuser';
//第三引数でデータベースユーザパスを指定 $password = 'dbpass';
▶︎SQLの実行 …PDOクラス or PDOStatementクラスを使う
ここで疑問を感じたのが、
\PDOStatement::executeとPDO::exec何が違うん?/
ってことです。
では、PDOクラスと PDOStatementクラスについて。
https://php.net によると
PDO::exec — SQL ステートメントを実行し、作用した行数を返す
PDO::exec() は SELECT 文からは結果を返しません。 プログラム中で一度だけ発行が必要になる SELECT 文に対しては、 PDO::query() の発行を検討してください。 複数回発行が必要な文については、PDO::prepare() による PDOStatement オブジェクトの準備と PDOStatement::execute() による文の発行を行ってください。
PDO::exec()は実行結果を返すんじゃなくて、行数しか返さないらしい。
そして、プレースホルダーとか使えんぽい。
やってみよう。
テーブルusers
|id|name|score|
|1|taro|0|
$db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD); $sql ='SELECT * FROM users'; //return 0 ...SELECT 文からは結果を返しません。 print_r($db->exec($sql));
//プレースホルダーを使ってみる 使いようがなかった。。 //プレースホルダーではないが、、、こうすることはできる(当たり前) $db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD); $whereVal = 1; $sql ='SELECT * FROM users WHERE id ='. $whereVal; //return 0 ...SELECT 文からは結果を返しません。 print_r($db->exec($sql));
PDOStatement::execute — プリペアドステートメントを実行する
返り値
成功した場合に
TRUE
を、失敗した場合にFALSE
を返します。
プリペアドステートメント….直訳で準備陳述。
これも実行するするだけ。成功したか失敗したかを返す。
一方、PDOStatement::executeは
PDOStatement::prepareでSQLステートメントをセットして、プレースホルダーとか使えるぽい。
$db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD); $sql ='SELECT * FROM users'; $stmt = $db->prepare($sql); //return 1(=true) ...成功! print_r($stmt->execute());
//プレースホルダーを使ってみる $db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD); $sql ='SELECT * FROM users WHERE id = :id'; $stmt = $db->prepare($sql); //さっきと同じ return 1(=true) ...成功! print_r($stmt->execute(array(':id' => 1)));
結果が欲しいのに!ってときはこれ。
PDO::query
PDO::query — SQL ステートメントを実行し、結果セットを PDOStatement オブジェクトとして返す
$db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD); $sql ='SELECT * FROM users'; foreach ($db->query($sql) as $row) { print('id: ' . $row['id'] . '<br>'); print('name: ' . $row['name'].'<br>'); print('score: ' . $row['score'].'<br>'); }
<まとめ>
・PDOをサクッと直接的にsql実行できる。
・PDOStatementはプレースホルダーとか使って計画的にsql実行できる。
・ 結果が欲しいときはPDO::query