/** * PHP 8.3 互換用:Services_JSON クラスの代替 * 内部で json_encode / json_decode を使用するようにネイティブ実装 */ if (!class_exists('Services_JSON')) { class Services_JSON { public function encode($v) { return json_encode($v, JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE); } public function decode($v) { return json_decode($v, true); } } } $Json = new Services_JSON(); /** * PHP 8.3 互換用:Memcacheクラスの修正版 */ if (!class_exists('Memcache') && class_exists('Memcached')) { class Memcache extends Memcached { // connect は親にないのでそのままでOK public function connect($host, $port = 11211, $timeout = 1) { return $this->addServer($host, $port); } public function pconnect($host, $port = 11211, $timeout = 1) { return $this->addServer($host, $port); } // 親クラス Memcached::get とシグネチャを合わせる public function get(string $key, ?callable $cache_cb = null, int $get_flags = 0): mixed { // 第2引数が参照渡し(&$flags)だった古いMemcacheの挙動を再現するのは難しいため // 通常の取得処理として親のメソッドを呼び出す return parent::get($key, $cache_cb, $get_flags); } // set も型を合わせておくのが安全です public function set($key, $value, $flag = 0, $expire = 0): bool { // Memcached::set(string $key, mixed $value, int $expiration = 0): bool return parent::set((string)$key, $value, $expire); } } } if (!function_exists('mysql_connect')) { function mysql_connect($host, $user, $pass) { global $mysql_link; $mysql_link = mysqli_connect($host, $user, $pass); return $mysql_link; } function mysql_select_db($db, $link = null) { global $mysql_link; return mysqli_select_db($link ?: $mysql_link, $db); } function mysql_query($query, $link = null) { global $mysql_link; return mysqli_query($link ?: $mysql_link, $query); } function mysql_fetch_assoc($res) { return mysqli_fetch_assoc($res); } function mysql_error($link = null) { global $mysql_link; return mysqli_error($link ?: $mysql_link); } // 必要に応じて mysql_num_rows, mysql_real_escape_string なども追加 } if (!function_exists('mysql_fetch_array')) { /** * mysql_fetch_array の互換関数 * PHP 8.3 の mysqli_fetch_array を使用します */ function mysql_fetch_array($result, $result_type = MYSQLI_BOTH) { if (!$result) { return false; } return mysqli_fetch_array($result, $result_type); } } // ついでによくセットで使われるこれらも追加しておくと安心です if (!function_exists('mysql_num_rows')) { function mysql_num_rows($result) { return mysqli_num_rows($result); } } if (!function_exists('mysql_free_result')) { function mysql_free_result($result) { return mysqli_free_result($result); } } // PHP 8.3 に存在しない古い定数を、新しい定数で定義し直す if (!defined('MYSQL_ASSOC')) define('MYSQL_ASSOC', MYSQLI_ASSOC); if (!defined('MYSQL_NUM')) define('MYSQL_NUM', MYSQLI_NUM); if (!defined('MYSQL_BOTH')) define('MYSQL_BOTH', MYSQLI_BOTH); // PHP 8.3 には存在しない、圧縮フラグ用の定数を定義する if (!defined('MEMCACHE_COMPRESSED')) { define('MEMCACHE_COMPRESSED', 1); // 1は古いMemcacheでの値です } if (!function_exists('mysql_real_escape_string')) { /** * mysql_real_escape_string の互換関数 */ function mysql_real_escape_string($string, $link = null) { global $mysql_link; // mysql_connect 時に保存したリンクを使用 // 接続がまだない場合は、とりあえず通常の文字エスケープで対応 $target_link = $link ?: $mysql_link; if ($target_link) { return mysqli_real_escape_string($target_link, $string); } else { // 万が一接続がない場合のフォールバック(気休めですがエラーは防げます) return addslashes($string); } } } if (!function_exists('mysql_result')) { /** * mysql_result の互換関数 * @param mysqli_result $result 結果セット * @param int $row 行番号 * @param mixed $field フィールド名またはオフセット */ function mysql_result($result, $row, $field = 0) { if (!$result || mysqli_num_rows($result) <= $row) { return false; } // 指定した行まで移動 mysqli_data_seek($result, $row); // データの取得 if (is_numeric($field)) { // 数字指定(0番目の列など) $data = mysqli_fetch_row($result); return $data[$field] ?? false; } else { // 名前指定("id"列など) $data = mysqli_fetch_assoc($result); return $data[$field] ?? false; } } } if (!function_exists('mysql_fetch_object')) { /** * mysql_fetch_object の互換関数 */ function mysql_fetch_object($result, $class_name = "stdClass", $params = null) { if (!$result) { return false; } if ($params !== null) { return mysqli_fetch_object($result, $class_name, $params); } else { return mysqli_fetch_object($result, $class_name); } } } if (!function_exists('mysql_affected_rows')) { /** * mysql_affected_rows の互換関数 */ function mysql_affected_rows($link = null) { global $mysql_link; // リンクが指定されていない場合は、最後に使用したリンク(グローバル)を使用 $target_link = $link ?: $mysql_link; if ($target_link) { return mysqli_affected_rows($target_link); } return -1; // 接続がない場合は古い関数の仕様に準じて -1 を返す } } if (!function_exists('mysql_insert_id')) { /** * mysql_insert_id の互換関数 */ function mysql_insert_id($link = null) { global $mysql_link; // 指定がない場合は、グローバルに保存された接続を使用 $target_link = $link ?: $mysql_link; if ($target_link) { return mysqli_insert_id($target_link); } return 0; } } if (!function_exists('get_magic_quotes_runtime')) { /** * get_magic_quotes_runtime の互換関数 * PHP 8.0 以降で削除されたため、常に false を返すようにします。 */ function get_magic_quotes_runtime() { return false; } } if (!function_exists('set_magic_quotes_runtime')) { /** * set_magic_quotes_runtime の互換関数 */ function set_magic_quotes_runtime($new_setting) { return false; } }
自動的に切り替わらない場合はこちらをクリック