PHP 7 以降で MySQL 関数を使用 (代用) する

このページは、MySQL 関数 (mysql_connect() など) を使用しているプログラムをPHP 7 以降で動作させるための代用例をまとめる予定のページです。

注意

  • MySQL 関数と同じ関数を定義して、内部でMySQLi 関数を動作させる仕組みになっています。
  • MySQL 関数のすべての関数や機能は網羅していません。
  • コードのライセンスは、CC0 (クレジット表示不要、改変可、商用可) です。

このページで定義している代用関数

  • mysql_connect()
  • mysql_select_db()
  • mysql_set_charset()
  • mysql_error()
  • mysql_errno()
  • mysql_query()
  • mysql_escape_string()
  • mysql_real_escape_string()
  • mysql_num_fields()
  • mysql_num_rows()
  • mysql_affected_rows()
  • mysql_fetch_row()
  • mysql_fetch_array()
  • mysql_fetch_assoc()
  • mysql_free_result()
  • mysql_close()
  • mysql_insert_id()

代用関数の例

/**
 * カラムは、フィールド名を添字とする配列形式で返されます。
 * @var int
 */
define('MYSQL_ASSOC', MYSQLI_ASSOC);
/**
 * カラムは、数値の添字とフィールド名の添字のどちらでもアクセスできる 配列形式で返されます。
 * @var int
 */
define('MYSQL_BOTH', MYSQLI_BOTH);
/**
 * カラムは、数値の添字を持つ配列形式で返されます。添字は 0 からはじまり、 結果の最初のフィールドです。
 * @var int
 */
define('MYSQL_NUM', MYSQLI_NUM);

/**
 * mysql_connect() の代用関数です。($new_link, $client_flags には現状対応していません)
 * @param string $server サーバーのホスト名 (ini 設定、ソケット、ポート指定には対応していません)
 * @param string $username ユーザー名 (ini 設定には対応していません)
 * @param string $password パスワード (ini 設定には対応していません)
 * @return mysqli|false mysqli のインスタンス
 */
function mysql_connect($server, $username, $password) {
    global $__mysql_connect;
    $__mysql_connect = mysqli_connect($server, $username, $password);
    return $__mysql_connect;
}

/**
 * mysql_select_db() の代用関数です。
 * @param string $database_name データベース名
 * @param mysqli $link_identifier MySQL 接続。指定されない場合、mysql_connect() の代用関数により直近にオープンされたインスタンスが使用されます。
 * @return bool 成功した場合に TRUE を、失敗した場合に FALSE を返します。
 */
function mysql_select_db($database_name, $link_identifier = null) {
    global $__mysql_connect;
    return mysqli_select_db($link_identifier ?? $__mysql_connect, $database_name);
}

/**
 * mysql_set_charset() の代用関数です。
 * @param string $charset 文字セット (文字コード) 名
 * @param mysqli $link_identifier MySQL 接続。指定されない場合、mysql_connect() の代用関数により直近にオープンされたインスタンスが使用されます。
 * @return bool 成功した場合に TRUE を、失敗した場合に FALSE を返します。
 */
function mysql_set_charset($charset, $link_identifier = null) {
    global $__mysql_connect;
    return mysqli_set_charset($link_identifier ?? $__mysql_connect, $charset);
}

/**
 * mysql_error() の代用関数です。
 * @param mysqli $link_identifier MySQL 接続。指定されない場合、mysql_connect() の代用関数により直近にオープンされたインスタンスが使用されます。
 * @return string 直近の MySQL 関数からのエラー文字列を返します。エラーが発生していない 場合には、'' (空文字列) を返します。
 */
function mysql_error($link_identifier = null) {
    global $__mysql_connect;
    return mysqli_error($link_identifier ?? $__mysql_connect);
}

/**
 * mysql_errno() の代用関数です。
 * @param mysqli $link_identifier MySQL 接続。指定されない場合、mysql_connect() の代用関数により直近にオープンされたインスタンスが使用されます。
 * @return int 直近の MySQL 関数からのエラー番号を返します。エラーが発生していない 場合は、0 (ゼロ)を返します。
 */
function mysql_errno($link_identifier = null) {
    global $__mysql_connect;
    return mysqli_errno($link_identifier ?? $__mysql_connect);
}

/**
 * mysql_query() の代用関数です。
 * @param string $query SQL クエリ
 * @param mysqli $link_identifier MySQL 接続。指定されない場合、mysql_connect() の代用関数により直近にオープンされたインスタンスが使用されます。
 * @return mysql_result|bool 結果
 */
function mysql_query($query, $link_identifier = null) {
    global $__mysql_connect;
    return mysqli_query($link_identifier ?? $__mysql_connect, $query);
}

/**
 * mysql_escape_string() の代用関数です。
 *
 * @param string $unescaped_string エスケープされる文字列
 * @return string エスケープされた文字列を返します。
 */
function mysql_escape_string($unescaped_string) {
    global $__mysql_connect;
    return mysqli_escape_string($__mysql_connect, $unescaped_string);
}

/**
 * mysql_real_escape_string() の代用関数です。
 *
 * @param string $unescaped_string エスケープされる文字列
 * @return string エスケープされた文字列を返します。
 */
function mysql_real_escape_string($unescaped_string, $link_identifier = null) {
    global $__mysql_connect;
    return mysqli_real_escape_string($__mysql_connect, $unescaped_string);
}

/**
 * mysql_num_fields() の代用関数です。
 * @param mysql_result $result クエリ結果
 * @return int|false 成功した場合に結果セット resource のフィールド数、 失敗した場合に FALSE を返します。
 */
function mysql_num_fields($result) { return mysqli_num_fields($result); }

/**
 * mysql_num_rows() の代用関数です。
 * @param mysql_result $result クエリ結果
 * @return int 行数
 */
function mysql_num_rows($result) { return mysqli_num_rows($result); }

/**
 * mysql_affected_rows() の代用関数です。
 * @param mysqli $link_identifier MySQL 接続。指定されない場合、mysql_connect() の代用関数により直近にオープンされたインスタンスが使用されます。
 * @return int 成功した場合に変更された行の数を、直近のクエリが失敗した場合に -1 を返します。
 */
function mysql_affected_rows($link_identifier = null) {
    global $__mysql_connect;
    return mysqli_affected_rows($link_identifier ?? $__mysql_connect);
}

/**
 * mysql_fetch_row() の代用関数です。
 * @param mysql_result $result クエリ結果
 * @return array|false 取得された行に対応する文字列の配列を返します。もう行がない場合は、 FALSE を返します。(mysqli_fetch_row() では null)
 */
function mysql_fetch_row($result) { return mysqli_fetch_row($result) ?? false; }

/**
 * mysql_fetch_array() の代用関数です。($result_type は現状対応していません)
 * @param mysql_result $result クエリ結果
 * @return array|false 取得された行に対応する文字列の配列を返します。もう行がない場合は、 FALSE を返します。(mysqli_fetch_array() では null)
 */
function mysql_fetch_array($result) { return mysqli_fetch_array($result) ?? false; }

/**
 * mysql_fetch_assoc() の代用関数です。
 * @param mysql_result $result クエリ結果
 * @return array|false 取得した行に対応する文字列の連想配列を返します。行がもうない場合には FALSE を返します。
 */
function mysql_fetch_assoc($result) { return mysqli_fetch_assoc($result) ?? false; }

/**
 * mysql_free_result() の代用関数です。
 * @param mysql_result $result クエリ結果
 * @return bool 常に true (mysqli_free_result() が値を返さないため)
 */
function mysql_free_result($result) { mysqli_free_result($result); return true; }

/**
 * mysql_close() の代用関数です。
 * @param mysqli $link_identifier MySQL 接続。指定されない場合、mysql_connect() の代用関数により直近にオープンされたインスタンスが使用されます。
 * @return bool 成功した場合に TRUE を、失敗した場合に FALSE を返します。
 */
function mysql_close($link_identifier = null) {
    global $__mysql_connect;
    return mysqli_close($link_identifier ?? $__mysql_connect);
}

/**
 * mysql_insert_id() の代用関数です。
 * @param mysqli $link_identifier MySQL 接続。指定されない場合、mysql_connect() の代用関数により直近にオープンされたインスタンスが使用されます。
 * @return int 直近のクエリにより AUTO_INCREMENT カラム用に生成された ID を返します。直近のクエリが AUTO_INCREMENT な値を生成しなかった 場合に 0 を返します。
 */
function mysql_insert_id($link_identifier = null) {
    global $__mysql_connect;
    return mysqli_insert_id($link_identifier ?? $__mysql_connect);
}

使用例

$link = mysql_connect('localhost', 'root', 'root');
if (!$link) {
    die('接続に失敗しました');
}
mysql_set_charset('utf8');

if (!mysql_select_db('test')) {
    die(mysql_errno() . ': ' . mysql_error());
}

$result = mysql_query('SELECT * FROM test');

var_dump([
    'mysql_escape_string' => mysql_escape_string('!"#$%&\'()=~|'),
    'mysql_real_escape_string' => mysql_real_escape_string('!"#$%&\'()=~|'),
    'mysql_num_fields' => mysql_num_fields($result),
    'mysql_num_rows' => mysql_num_rows($result),
]);

if ($row = mysql_fetch_row($result)) {
    var_dump([ 'mysql_fetch_row' => $row ]);
}
if ($row = mysql_fetch_assoc($result)) {
    var_dump([ 'mysql_fetch_assoc' => $row ]);
}

mysql_query('INSERT INTO test (name) VALUES (\'abc\')');
var_dump([
    'mysql_affected_rows' => mysql_affected_rows($link),
    'mysql_insert_id' => mysql_insert_id($link),
]);

mysql_free_result($result);
mysql_close($link);

更新履歴

  • 2020/03/11
    • mysql_connect()$link_identifier が任意引数になっていなかったため修正しました
    • mysql_escape_string() で使用している mysqli_escape_string() の引数の順番が違っていたため修正しました
    • mysql_real_escape_string() mysql_fetch_assoc() mysql_num_fields() mysql_affected_rows() mysql_insert_id() を追加しました
  • 2020/02/15 初版