MySQLの結果セットに関連付けられたカーソルメモリを解放するPHPスクリプトの書き方
PHPでは、MySQLのクエリ結果(結果セット)に関連付けられたカーソルメモリを解放するために、mysql_free_result()関数を使用します。大量のレコードを扱うスクリプトでは、データ取得後にこの関数を呼び出すことで、メモリを明示的に解放し、サーバーリソースを効率的に管理できます。
サンプルスクリプト
以下の例では、「tutorials_tbl」というテーブルからレコードを取得した後、mysql_free_result()を使ってメモリを解放しています。
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
$sql = 'SELECT tutorial_id, tutorial_title, tutorial_author, submission_date
FROM tutorials_tbl';
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_NUM)) {
echo "Tutorial ID :{$row[0]} <br> ".
"Title: {$row[1]} <br> ".
"Author: {$row[2]} <br> ".
"Submission Date : {$row[3]} <br> ".
"--------------------------------<br>";
}
mysql_free_result($retval);
echo "Fetched data successfully\n";
mysql_close($conn);
?>
コードの解説
- 接続の確立: mysql_connect()でMySQLサーバーに接続し、失敗した場合はdie()でスクリプトを終了します。
- クエリの実行: mysql_query()でSELECT文を実行し、結果リソースを変数$retvalに格納します。
- データの取得: whileループ内でmysql_fetch_array()を使い、1行ずつレコードを取り出して表示します。
- メモリの解放: すべてのレコード取得が完了したら、mysql_free_result($retval)を呼び出してカーソルメモリを解放します。
- 接続の切断: 最後にmysql_close()でデータベース接続を閉じます。
注意点:mysql拡張モジュールの非推奨化
上記のようなmysql_*系関数はPHP 5.5で非推奨となり、PHP 7.0で削除されました。そのため、現行の開発環境では代わりに以下のAPIを使用することが推奨されます。
- mysqli拡張モジュール:
mysqli_free_result()関数で同様に結果セットのメモリを解放できます。 - PDO:
PDOStatement::closeCursor()メソッドでカーソルを閉じることができます。
これらの新しいAPIはプリペアドステートメントに対応しており、SQLインジェクション対策などのセキュリティ面でも優れています。新規プロジェクトでは、必ずmysqliまたはPDOを採用しましょう。
-
PHPとMySQLでブール値を扱うには?BOOL・BOOLEAN・TINYINT(1)の違いと使い方
本記事では、MySQL 8.0.12を使用して、ブール(Boolean)値の正しい取り扱い方を解説します。まず、使用しているMySQLのバージョンを確認しておきましょう。 mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.12 | +-----------+ 1 row in set (0.00 sec) MySQLにおけるブール値の基本:BOOL・BOOLEAN・TINYINT(1) MySQLでブール値を扱うには、BOOL、BOOLEAN、またはTINYINT(1)のいずれかを使用
-
MySQLで「&」を「&」に置き換える方法を解説
MySQLで「&」を「&」に置き換える方法データベースにHTMLエンティティ形式の「&」が保存されており、これを通常のアンパサンド「&」に変換したいケースはよくあります。そんなときは、MySQLのREPLACE()関数を使えば簡単に解決できます。REPLACE()関数は、文字列の中から指定した部分文字列を検索し、別の文字列に置き換えることができる便利な関数です。ここでは、サンプルテーブルを使いながら、実際の置き換え手順を順番に解説していきます。手順1:サンプルテーブルを作成するまず、以下のコマンドでテーブルを作成します。mysql> cre