それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

php7 で非推奨になったmysql_connect関連のmysql関数を対応する(mysqli

php7 から mysql_connect が非サポートになりました。

いまどきPDO使ってないとかありえないんですけど。まぁmysql_connect を使ってるプログラムが動いてることも多いわけです。

今回はこの対応をしたので、誰かの役に立てばいいのでメモっておきます。

mysql_connect は使えなくなりました。(←正しくは

php_mysql拡張機能が標準バンドルされなくなった。なので標準インストールでは使えない。 だったら、追加インストールすればいいんじゃね?まぁそういうことです。

でも、それは最終手段に確保がベターな予感ある。php 本体のアップデートの都度に拡張機能をアップデートするのは結構大変で、php_magick をビルドインストしてたときは1ヶ月に1度くらいphpアップデートに併せてビルドしてた記憶有るし。なので、php_mysql のビルドインストはやめたほうが良いだろうっって判断しました。

mysqli への切り替え

php7 のmysql_connect の対応は、複数の選択肢があります

  • mysqli_connect へ
  • new mysqli へ
  • new pdo へ
  • php_mysql をインストール(←前述の理由で見送り

最初のが一番簡単なので、まず考えるのは mysqli_connect → mysqli_connect の書き換えではないでしょうか。2つは、同じ関数とリソース型を扱う設計で引数も「似ています」(同じではない)

二つ目はクラスです。mysqli は基本的にオブジェクトで作られているので new でインスタンスを生成し、それを使うようになっています。

三つ目はPDOです。インタフェースが異なるので移行とはすなわち書き直しとなります。

mysqli への書き換え1

connect だけは mysql も mysqliもほとんど同じです。

mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db");
mysql_connect('localhost', 'mysql_user', 'mysql_password');

引数同じなのでほとんど変える必要がない。楽ちん

escape 関連

escape をしてる場合は、選択肢が2つ有る。

mysql_real_escape_string
mysqli::real_escape_string 
mysqli_real_escape_string

前者がクラス・メソッドで後者が インスタンスを必要とする。結局はインスタンスが必要になるので、手間はあんまり変わらない。

<?php
//
mysql_real_escape_string($str);
//
$mysqli_instance->real_escape_string( $str );
mysqli_real_escape_string( $mysqli_resouce , $str )

query 関連

クエリ発行の部分もmysqli ではインスタンス(リソース)が必要になるので、少し書き直しが必要。

mysql_query(  $str )

mysqli_query( $resouce, $str)

クエリ発行後は殆ど変わらなかった。

connect 数の上限

mysqli と mysql の書き換えを行ったとに、実験していると気付いたのですが。

mysql と mysqli にはインタフェースは似ていてもコネクションの管理や再利用が全然違っていて、そのままのロジックだと、コネクション数オーバーしてしまった。編集前では 全然問題なかった。

mysql_connect で接続つくって潰し、作って潰しで2000接続くらい作れてたのに、mysqli_connect だと全然動かないの。上限に達しちゃう。もしかしたら接続を再利用してくれないと思う。

なので接続をきっちり管理してやる必要があった。そこはハマった。

なので関数を書き換えたら問題なく動くって思わないほうが良い。

mysql 関数群と mysqli 関数群は似ているけど全然別物!ってことを念頭に起きながら、書き換える必要がありました。

最終的に次のような関数を書く羽目になったので、コネクション数の管理は別物だと思うことにしました。

<?php
function MyConnect  (){
    global $con;
    if ( !$con){ return $con;}
    return $con = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db");
}

MyConnect()