カテゴリー別アーカイブ: デバッグ

デバッグ手法(PHP入門編)

今回はデバッグ手法について取り上げます。

ただし、PHPはサーバーサイドのプログラミング言語で、
JavaScript 以上にデバッグが難しい・デバッグ用のツール設定が難しいので、
何度かに分けて、取り上げたいと思います。

大きく分けて、
1. var_dump を使う
2. 統合開発環境を使う
3. ロギングライブラリを使う
となる予定です。(2と3は入れ替わるかもしれません)

なお、昨日の授業でのサポートをした感じだと、
SQL 周りのエラーでプログラムが動作していないことが多い気がしました。
後半、そちらについて記述しています。

何はともあれ、var_dump()

一番お手軽なデバッグ方法が、var_dump関数を使うことです。

<?php
$hoge = array("チーズアカデミー");
var_dump($hoge);
?>

と記述することで、

array (size=1)
  0 => string 'チーズアカデミー' (length=24)

と表示されます。

var_dump の引数に、変数を入れてあげれば、その中身が表示されます。

SQL の内容を確認したい

現在、授業で扱っている PHP とデータベースの接続に、
PDO(PHP Data Objects)を使っています。
これは、データベースを隠蔽してくれるものです。
しかし、データベースを隠匿しているがゆえに、
実際に実行されているSQL がわからなくなっています。

index.php から

<?php
$pdo = new PDO('mysql:dbname=gs_db;host=localhost', 'root', '');
$stmt = $pdo->query('SET NAMES utf8');
$stmt = $pdo->prepare("SELECT * FROM gs_cms_user");
$stmt->execute();
var_dump($stmt);
?>

一覧ページの SQLを実行済みの変数 $stmt を var_dump してみました。

object(PDOStatement)[3]
  public 'queryString' => string 'SELECT * FROM gs_cms_user' (length=25)

この場合は、実行されているのと同じSQL ‘SELECT * FROM gs_cms_user’ が表示されています。
では、次に登録処理を見てみましょう。

regist_execute.php から

<?php
$pdo = new PDO('mysql:dbname=gs_db;host=localhost', 'root', '');
$stmt = $pdo->query('SET NAMES utf8');
$stmt = $pdo->prepare("INSERT INTO gs_cms_user(
		id, name, email, age, info, update_date, create_date) VALUES (
		NULL, :name, :email, :age, :info, sysdate(), sysdate())");

$stmt->bindValue(':name', $name);
$stmt->bindValue(':email', $mail);
$stmt->bindValue(':age', $age);
$stmt->bindValue(':info', $info);
$flag = $stmt->execute();
var_dump($stmt);
?>
object(PDOStatement)[3]
  public 'queryString' => string 'INSERT INTO gs_cms_user(
		id, name, email, age, info, update_date, create_date) VALUES (
		NULL, :name, :email, :age, :info, sysdate(), sysdate())' (length=149)

太字の部分が実行されている SQL です。
ただし、プリペアードステートメントと呼ばれる形になっており、
実際のSQL とは異なる形になっていて、少しわかりにくくなっています。
この SQL が正しかを検証するには、bindValue している箇所に、
実際に値を代入して、 phpMyAdmin などから SQL を実行することで、
SQL に誤りがあるかを確認することが可能です。

例えばこうゆう形です。

INSERT INTO gs_cms_user(
		id, name, email, age, info, update_date, create_date) VALUES (
		NULL, 'あずま', 'example@example.com', '30', 'コメントコメント', sysdate(), sysdate())

なお、実行されているSQL は MySQL のログから確認可能です。
上のSQL はそこから取得したものですが、
デフォルトのXAMPP ではこのログの出力がオフになっているようです。

若干設定に注意が必要なので、授業時 or チュータリング時に、個別に説明できればと思います。
次回は前回の授業で気になった点を取り上げたいと思います。

広告