PHP7で, パーフェクトPHPのひとこと掲示板を作成する際に, mysqlをいじるコードで, いろいろはまる部分があります.
mysql_connect()がないと怒られます.
結果として, mysql_connect
が, php7では, 使えません.
代わりに, mysqli_connect
を使えばokです.
また引数の取り方がいろいろ変わっているので, コードがうまく機能しません.
詳しく話す前に,
まずは, 環境から
環境
本のバージョン
パーフェクトPHPは, 初版第7刷
OSのバージョン
windows 10
WSLで ubuntu 18.04 を動かしている
phpのバージョン
PHP 7.2.7-0ubuntu0.18.t04.2 (cli)
apache
Server version: Apache/2.4.29 (Ubuntu)
mysql_connect()は, undefined functionで怒られる
パーフェクトPHPのp182で,
//データベースに接続
$link = mysql_connect('localhost', 'root', '');
という部分があります.
しかし, これは, php7では動きません.
PHP Fatal error: Uncaught Error: Call to undefined function mysql_connect() in /var/www/study.localhost/oneline_bbs/process_word.php
というエラーが出ます.
困ったら公式ドキュメント.
(PHP 4, PHP 5)
mysql_connect — Open a connection to a MySQL Server
Warning
This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used. See also MySQL: choosing an API guide and related FAQ for more information. Alternatives to this function include:
mysqli_connect()
PDO::__construct()
と書いてあります.
php4とphp5でしか使えないです. php7では,removeされたと書いてあります.
その代替案として, mysqli_connect
を使えと書いてあります.
i
をmysql
の後ろにつけましょう.
ほかにも,
mysql_select_db
mysql_error
mysql_real_escape_string
mysq_query
もすべてphp7では, 使えません.
mysql
の部分を, mysqli
に変えましょう.
このiは, mysql improvedの略かな?
vim
なら :%s/mysql/mysqli/gc
で一気に置換すればok.
引数がちげーよって怒られる
また本の通りだと, 引数の取り方が変わっているため, 以下のエラーが起きます.
PHP Warning: mysqli_select_db() expects parameter 1 to be mysqli, string given in /var/www/study.localhost/oneline_bbs/process_word.php on line 9, referer: http://study.localhost/oneline_bbs/bbs.php
PHP Warning: mysqli_real_escape_string() expects exactly 2 parameters, 1 given in /var/www/study.localhost/oneline_bbs/process_word.php on line 40, referer: http://study.localhost/oneline_bbs/bbs.php
公式ドキュメントを見ればすぐわかります.
mysqli_select_db()
mysqli_real_escape_string()
mysqli_select_db('oneline_bbs', $link)
とパーフェクトPHPには, 書いていますが, 正しくは, mysqli_select_db($link, 'oneline_bbs')
mysql_real_escape_string($name)
とありますが, 正しくは, $mysqli_real_escape_string($name)
です.
php7では, mysqli
がつく関数は, オブジェクト指向的な書き方と, 手続き的な書き方の二つに対応していますので, どちらでもよいです(今回は手続き的な方法でやりました).
本でエラーが出たら公式ドキュメントに当たると大体解決するので重宝しています.