phpからMySQLデータベースに接続する関数としてかつて主流だったmysqliモジュールがPHP5.5移行からはdeprecated(非推奨)となっています。しばらくPHP5.4でつかい続ければ問題ないかなーと思っていたのですが、今日、お名前ドットコムの共用サーバーSDにてPHP5.4が使えなくなってしまっていました。
サポート情報を見てみると、11/5に告知されていたようなのですが、メールも届いていないですし、いつの間にかPHP5.4だったのか勝手に5.6に設定変更されてしまっていて、気づきました。
これで困ったのが、フリー・オープンソースの顧客管理システムL03が動かなくなってしまったことです。
エラー内容を見てみると、mysql_connect()等が推奨されなくなり、エラーが出るようになったことで動かなくなってしまったようです。
最初にこの顧客管理システムL03をご紹介したのは2011年だったのですが、未だに検索からの流入も有るため、それなりに使われているのだと思います。そこで今回は、php5.5移行でもこのCRMを使えるようにする修正内容をご紹介します。
mysqlとの接続関連の記述が有るのがこのapplication/library/connectionmysql.phpというファイルになりますので、コチラを修正します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
<?php /* * Copyright(c) 2009 limitlink,Inc. All Rights Reserved. * http://limitlink.jp/ * 文字コードUTF-8 */ class Connection { var $handler; function Connection() { $this->handler = mysqli_connect(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD,DB_DATABASE); if ($this->handler) { $response = mysqli_select_db($this->handler,DB_DATABASE); if (defined('DB_CHARSET') && DB_CHARSET) { if (version_compare(PHP_VERSION, '5.2.3', '>=') && function_exists('mysqli_set_charset')) { mysqli_set_charset($this->handler,'utf8'); } else { mysqli_query($this->handler,"SET NAMES utf8"); } } return $response; } return $this->handler; } function close() { if ($this->handler) { return mysqli_close($this->handler); } else { die('データベースハンドラが見つかりません。'); } } function query($query) { if ($this->handler) { return mysqli_query($this->handler,$query); } else { die('データベースハンドラが見つかりません。'); } } function fetchAll($query) { if ($this->handler) { $response = mysqli_query($this->handler,$query); $data = array(); if ($response) { while ($row = mysqli_fetch_assoc($response)) { $data[] = $row; } } return $data; } else { die('データベースハンドラが見つかりません。'); } } function fetchLimit($query, $offset = 0, $limit = 20) { $query .= sprintf(" LIMIT %d, %d", $offset, $limit); return $this->fetchAll($query); } function fetchOne($query) { if ($this->handler) { $response = mysqli_query($this->handler,$query); if ($response) { $data = mysqli_fetch_assoc($response); } if (is_array($data)) { return $data; } else { return array(); } } else { die('データベースハンドラが見つかりません。'); } } function fetchCount($table, $where = "", $field = "*") { if ($this->handler) { $query = sprintf("SELECT COUNT(%s) AS count FROM %s %s", $field, $table, $where); $response = mysqli_query($this->handler,$query); if ($response) { $row = mysqli_fetch_assoc($response); return $row["count"]; } else { return false; } } else { die('データベースハンドラが見つかりません。'); } } function insertid() { if ($this->handler) { return mysqli_insert_id($this->handler); } else { die('データベースハンドラが見つかりません。'); } } function table() { if ($this->handler) { $query = "SHOW TABLES FROM ".DB_DATABASE; $response = mysqli_query($this->handler,$query); if ($response) { while ($row = mysqli_fetch_assoc($response)) { $array[] = $row["Tables_in_".DB_DATABASE]; } return $array; } else { return false; } } else { die('データベースハンドラが見つかりません。'); } } function quote($string) { if ($this->handler) { return mysqli_real_escape_string($this->handler,$string); } else { die('データベースハンドラが見つかりません。'); } } } ?> |
mysql〜という関数をmysqli〜に置き換えるのですが、必要な引数の順番や、数が違っていたりしてややこしいので、一箇所ずつ修正するよりもこのままコピペしたほうがわかりやすいと思います。
mysql_connect(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD);
は
mysqli_connect(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD,DB_DATABASE);
になります。mysqli_connectになると4番目の引数としてデータベース名が必要になるため忘れずに追加します。
mysql_select_db(DB_DATABASE);
は
mysqli_select_db($this->handler,DB_DATABASE);
になります。こちらは、データベース名が1つ目の引数だったのが、mysqli_connect()が引数1に必要になっています。今回は$this->handlerがmysqli_connect()にあたりますのでそちらを追加します。
mysql_query(“SET NAMES utf8″, $this->handler);
は
mysqli_query($this->handler,”SET NAMES utf8”);
になります。引数の順番が入れ替わっています。
以前php4系から5系に移行した時も勝手にバージョンが変わってしまい画面が真っ白になってしまったサイトが多発してしまったので、大変だったのですが、今回もまた気づかないところでトラブルが起きなければ良いのですが・・・。ご参考下さい。