地味で地道なはてなブログ

ダイアリー「地味で地道な」から引っ越しました。

よくわかるPHPの教科書 【PHP5.5対応版】残処理

278ページに説明のある(誤字あるけど)関数で、元ソースの29行目-38行目を書き直してみた。

//重複アカウントのチェック
$record = mysqli_prepare($db, 'SELECT COUNT(ID) AS CNT '
. ' FROM MEMBERS'
. ' WHERE EMAIL =?');

mysqli_stmt_bind_param($record, 's', $_POST['email']);

/* ステートメントを実行します */
mysqli_stmt_execute($record);

/* 結果変数をバインドします */
mysqli_stmt_bind_result($record, $cnt) or die(mysqli_error($db));

/* 値を取得します */
mysqli_stmt_fetch($record);
if (!empty($cnt)) {
$error['email'] = 'duplicate';
}

/* 結果セットを開放します */
mysqli_stmt_close($record);

"SELECT COUNT(*)"を使うのは意識低い人というプロジェクトにいたことがあるので、ここはキーを指定した。
"mysqli_stmt_fetch"を判定通さずに使っているけれど、これは、前のdieで捕まらない限り、必ず値がtrueになるため。
SELECT COUNT 文の場合、値はtrueが、$cntには件数(0件なら0)が返る。はず。
結果セットの開放は、PHP: mysqli_stmt::fetch - Manualのソースをまるっと持ってきたのでこれも使うことにした。