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ご指摘あればをお願いします。
- << 前のページ
- 次のページ >>
