お手軽にウェブサービスを構築するなら、Apache+PHP+MySQLっていうのは定番だと思うのですが、そんなお手軽な組み合わせだからこそ、PHPからMySQLの利用がしやすいようにと専用のMySQL関数というのがあります。
そんなMySQL関数の中でも、コード量が減らせそうな小技が効いたMySQL関数を紹介します。
MySQL関数で一番、というか必ず利用するのは、以下の関数群でしょう。
とりあえずこれだけの関数があれば、なんとなく事足りそうな気はしますね。いや、事実これだけで完結することもできるでしょう。
でも、さっきINSERTした行を特定する(例えば id)に、先ほどの関数だけで行うには、mysql_query()とmysql_fetch_array()などでシーケンシャルなカラムを取得する必要があります。コードが冗長になり、更にはコード量が増えた結果、コーディングミスの可能性まで上がります。
そういう時はこれ一発。
これで「$id」には直前にINSERTした行のidカラムが代入されます。意外にさっきINSERTした行のidがほしい時ってのはあるもんで、重宝します。
他には、直前のUPDATE、DELETE、INSERT、REPLACEで変更された行数を返してくれる、mysql_affected_rows()という関数があります。この関数は、
と、UPDATEの有無によって処理を分岐させたりするのに使えます。
SELECT結果の件数が知りたい場合は、mysql_num_rows()という関数もあります。これは直前に行われたSELECTが対象で、フェッチする必要がないので、単純に行数が知りたい時はこちらの方がスッキリしますね。
更に、クエリが正常に行われたかチェックするには、mysql_query()の戻り値を見るのもいいですが、mysql_errno()という関数もあります。この関数のいい所は、エラーが出ていればエラー番号、エラーがないなら「0(ゼロ)」を返す、常に戻り値がint型という簡潔さ。ついでにmysql_error()でエラーメッセージも表示すれば、デバッグ効率は大きく向上するでしょう。
ちなみに僕は、mysql_errno()が0以外の場合は、エラー番号とエラーメッセージと問題のあるクエリをログファイルに書きこむ(それだけではないですが)自作のログ収集クラスも用意しています。こういうのは、本番稼働中でエラーメッセージが表示できない場合でも有効に情報収集できるので重宝します。ロジックの不具合はPHPのエラーログだけで解決しない事の方が多いでしょう。
PHPのMySQL関数は、以下のPHPマニュアルページにもまとめられています。今回紹介しなかった関数もありますので、一度目を通してみると何か発見できるかも知れません。
PHP: MySQL - Manual
see also:
php-mcryptがyumでインストールできないときに幸せになる方法
そろそろ真面目に自動テストしよう
PHPerが一瞬でC言語をマスターする方法
さくらインターネットの .mailfilter にハマる
そんなMySQL関数の中でも、コード量が減らせそうな小技が効いたMySQL関数を紹介します。
MySQL関数で一番、というか必ず利用するのは、以下の関数群でしょう。
mysql_connect() mysql_select_db() mysql_query() mysql_fetch_array() mysql_fetch_assoc() mysql_fetch_num() mysql_close()
とりあえずこれだけの関数があれば、なんとなく事足りそうな気はしますね。いや、事実これだけで完結することもできるでしょう。
でも、さっきINSERTした行を特定する(例えば id)に、先ほどの関数だけで行うには、mysql_query()とmysql_fetch_array()などでシーケンシャルなカラムを取得する必要があります。コードが冗長になり、更にはコード量が増えた結果、コーディングミスの可能性まで上がります。
そういう時はこれ一発。
$id = mysql_insert_id();
これで「$id」には直前にINSERTした行のidカラムが代入されます。意外にさっきINSERTした行のidがほしい時ってのはあるもんで、重宝します。
他には、直前のUPDATE、DELETE、INSERT、REPLACEで変更された行数を返してくれる、mysql_affected_rows()という関数があります。この関数は、
mysql_query("UPDATE `hoge_tbl` SET `name` = 'huga' WHERE `flg`='1'"); if ($num = mysql_affected_rows()){ echo $num. "行UPDATEされました"; } else { echo "1行も更新されませんでした"; }
と、UPDATEの有無によって処理を分岐させたりするのに使えます。
SELECT結果の件数が知りたい場合は、mysql_num_rows()という関数もあります。これは直前に行われたSELECTが対象で、フェッチする必要がないので、単純に行数が知りたい時はこちらの方がスッキリしますね。
更に、クエリが正常に行われたかチェックするには、mysql_query()の戻り値を見るのもいいですが、mysql_errno()という関数もあります。この関数のいい所は、エラーが出ていればエラー番号、エラーがないなら「0(ゼロ)」を返す、常に戻り値がint型という簡潔さ。ついでにmysql_error()でエラーメッセージも表示すれば、デバッグ効率は大きく向上するでしょう。
ちなみに僕は、mysql_errno()が0以外の場合は、エラー番号とエラーメッセージと問題のあるクエリをログファイルに書きこむ(それだけではないですが)自作のログ収集クラスも用意しています。こういうのは、本番稼働中でエラーメッセージが表示できない場合でも有効に情報収集できるので重宝します。ロジックの不具合はPHPのエラーログだけで解決しない事の方が多いでしょう。
PHPのMySQL関数は、以下のPHPマニュアルページにもまとめられています。今回紹介しなかった関数もありますので、一度目を通してみると何か発見できるかも知れません。
PHP: MySQL - Manual
see also:
php-mcryptがyumでインストールできないときに幸せになる方法
そろそろ真面目に自動テストしよう
PHPerが一瞬でC言語をマスターする方法
さくらインターネットの .mailfilter にハマる
コメント
コメントを投稿