mysqlからmysqliへの変換
PHP5をPHP7にバージョンアップすることはサーバー側で簡単にできるが、それにより一部ページが表示されなくなる事態が発生し、その原因がmysql()関数がPHP7だと削除されてしまったことであることが判明したため、解決のために調べた内容を書き留めておくことにした。
まず、エラーが分からないと対処が大変なので、php.iniファイルでdisplay_errorsをONにしておくといい。
手書き型
オヴジェクト指向に対応したのがPHP7みたいだけど、まずは接続ができないと話にならないので、手書き型を試す。
mysql命令として一番最初に記述いていたのが以下
<?php //mysql命令(set nameは非推奨みたい) mysql_connect('host_name', 'user_name', 'password') or die(mysql_error()); mysql_select_db('database_name') or die(mysql_error()); mysql_query('set names utf8'); //mysql命令(公式サイト的な書き方だと以下のように一度変数に入れている) $con = mysql_connect('host_name', 'user_name', 'password') ; if (!$con) { die('Not connected : ' . mysql_error()); } $db_selected = mysql_select_db('database_name', $con); if (!$db_selected) { die ('Can\'t use grandax_test : ' . mysql_error()); } ?>
ひとまずこれを直さないことには接続の時点で引っかかり、サイトが全く表示されない(白画面)ので、以下のように書き変える
<?php //mysqli命令 //接続のエラーをチェック $con = mysqli_connect('host_name', 'user_name', 'password', 'database_name'); if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } //命令のエラーをチェック mysqli_query($con, 'set names utf8'); if (!mysqli_query($con, "set names utf8")) { printf("Errormessage: %s\n", mysqli_error($con)); } ?>
つまり
<?php //接続 mysql_connect('host_name', 'user_name', 'password') mysql_select_db('database_name') ↓↓ mysqli_connect('host_name', 'user_name', 'password', 'database_name'); //引数の順序が逆になる命令 mysql_query('命令'); ↓↓ mysqli_query($con, '命令'); mysql_real_escape_string('$str'): ↓↓ mysqli_real_escape_string($con, $str); //そのほかは単にiをつけるだけ mysql_fetch_assoc ↓↓ mysqli_fetch_assoc ?>
オブジェクト指向型
必要に迫られるまで一旦保留
mysqli_real_escape_string()
<?php //以下のようにしたときに文字コードがutf8からASCIIになる時がある $con = mysqli_connect('host_name', 'user_name', 'password', 'database_name'); $string = mysqli_real_escape_string($con,$string); ?>
以上はフォームから受け取ったデータ($_POST)に対して関数を作ってそれをreturnで返した時に該当した。
<?php // function convstring($string) { if(get_magic_quotes_gpc()){ $string = stripslashes($string); } $string = htmlspecialchars($string,ENT_QUOTES,'utf8'); $string = str_replace(",",",",$string); $string = str_replace(array("\r\n","\n","\r"),"<br /?>",$string); $string = mysqli_real_escape_string($con,$string); return $string; } ?>
str_replaceでASCIIにされたからか、returnで返されるときにそうなったかわからないが、mysqli_real_escape_string()だけ関数の外に出して後から実行するとASCIIがUTF8に戻されて返されるのでうまく動くようにはなる。
以下を記述することが公式の警告にかかれているが、かいても変わらない。
<?php /* 文字セットを utf8 に変更します */ if (!mysqli_set_charset($con, "utf8")) { printf("Error loading character set utf8: %s\n", mysqli_error($con)); exit(); } else { printf("Current character set: %s\n", mysqli_character_set_name($con)); } ?>
文字を普通に打てば、mysqli_real_escape_stringを使用した文字でも、きちんと半角はASCII、全角はUTF8となる
<?php $con = mysqli_connect('host_name', 'user_name', 'password', 'database_name'); $aaa = "aaa"; $aaa = mysqli_real_escape_string($con,$aaa); echo(mb_detect_encoding($aaa)); //返り値はASCII $aaa = "こんにちわ"; $aaa = mysqli_real_escape_string($con,$aaa); echo(mb_detect_encoding($aaa)); //返り値はUTF8 ?>
コメントor補足情報orご指摘あればをお願いします。
- << 前のページ
- 次のページ >>