php7 から mysql_connect が非サポートになりました。
いまどきPDO使ってないとかありえないんですけど。まぁmysql_connect を使ってるプログラムが動いてることも多いわけです。
今回はこの対応をしたので、誰かの役に立てばいいのでメモっておきます。
mysql_connect は使えなくなりました。(←正しくは
php_mysql の拡張機能が標準バンドルされなくなった。なので標準インストールでは使えない。 だったら、追加インストールすればいいんじゃね?まぁそういうことです。
でも、それは最終手段に確保がベターな予感ある。php 本体のアップデートの都度に拡張機能をアップデートするのは結構大変で、php_magick をビルドインストしてたときは1ヶ月に1度くらいphpアップデートに併せてビルドしてた記憶有るし。なので、php_mysql のビルドインストはやめたほうが良いだろうっって判断しました。
mysqli への切り替え
php7 のmysql_connect の対応は、複数の選択肢があります
最初のが一番簡単なので、まず考えるのは 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()