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ご指摘あればをお願いします。

(件名or本文内でキーワード検索できます)



  • << 前のページ
  • 次のページ >>
ページトップへ