【バグ修正】よくわかるPHPの教科書 「Twitter風ひとこと掲示板」の不具合

PHPの入門本として評価の高い『よくわかるPHPの教科書』ですが、サンプルアプリの「Twitter風ひとこと掲示板」にバグと思われる箇所があるのでメモしておきます。(2010/12/27現在)

ルートディレクトリに設置する、index.phpファイルをアップロードして表示しようとするとエラーになります。

エラーの内容は、以下の通りです。

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘-5, 5’ at line 1

このエラーの原因になるのは、index.phpファイルの40行目から52行目にかけてです。

修正前 index.php

// 最終ページを取得する
$sql = 'SELECT COUNT(*) AS cnt FROM posts';
$recordSet = mysql_query($sql);
$table = mysql_fetch_assoc($recordSet);
$maxPage = ceil($table['cnt'] / 5);
$page = min($page, $maxPage);

$start = ($page - 1) * 5;

$sql = sprintf('SELECT m.name, m.picture, p.* FROM members m, posts p WHERE m.id=p.member_id ORDER BY p.created DESC LIMIT %s, 5',
 $start
);
$posts = mysql_query($sql) or die(mysql_error());

 修正後 index.php

// 最終ページを取得する
$sql = 'SELECT COUNT(*) AS cnt FROM posts';
$recordSet = mysql_query($sql);
$table = mysql_fetch_assoc($recordSet);
$maxPage = ceil($table['cnt'] / 5);
$page = min($page, $maxPage);
//バグ修正のため挿入
if ($page < 1) {
 $page = 1;
}
$start = ($page - 1) * 5;

$sql = sprintf('SELECT m.name, m.picture, p.* FROM members m, posts p WHERE m.id=p.member_id ORDER BY p.created DESC LIMIT %s, 5',
 $start
);

上の赤字の部分を追加するとバグが修正されます。

バグの原因は、緑字の部分にあります。

$maxPage = ceil($table[‘cnt’] / 5);

となっていますが、データベースを作りたてで、データを一件も保存していないと、このエラーになります。

なぜかというと、データが一件も無い場合には、$table[‘cnt’] はゼロになります。ゼロを5で割って切り上げてもゼロです。

そして、次の文ですが、

$page = min($page, $maxPage);

$maxPageには、ゼロが入っているので、$pageにはゼロが入ります。
それを受ける次の文ですが、

$start = ($page – 1) * 5;

この文の結果として、$start には、-5 が入ってしまいます。
なぜなら、(0-1)*5イコール-5 だからです。

データが一件でも入っていれば、0が入るのですが、一件も入っていないので、マイナス5という当該データベースでは扱えない値がSQLにセットされてしまうのです。

その結果が、最初にあげたエラーです。

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘-5, 5′ at line 1

マイナス5というありえない値をセットしてしまっているのでエラーになるわけです。

そこで、$page がゼロ(または、1より少ない)の場合に、1に戻してあげる処理を追加してあげると上手くいきます。

if ($page < 1) {
 $page = 1;
}

上記の文を追加してあげると、マイナス5となっていたのが、ゼロとなり、正常なSQL文を構成できるようになります。

ただし、このエラーが出るのは、サンプルアプリをダウンロードしてゼロから構築した場合です。つまり、テキストの順に従って、一つずつファイルを作ったなら、その過程でデータを入れる処理があるため、エラーになりません。

カテゴリー: BOOK, PHP パーマリンク

1 Response to 【バグ修正】よくわかるPHPの教科書 「Twitter風ひとこと掲示板」の不具合

  1. ピンバック: よくわかるPHPの教科書のエラー修正 | S2

コメントを残す

メールアドレスが公開されることはありません。