2011/06/04

[PHP]PHPのmysql系関数のまとめ

お手軽にウェブサービスを構築するなら、Apache+PHP+MySQLっていうのは定番だと思うのですが、そんなお手軽な組み合わせだからこそ、PHPからMySQLの利用がしやすいようにと専用のMySQL関数というのがあります。

そんな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 にハマる


0 件のコメント:

コメントを投稿