PHP
MySQL
PHP7

php7で, データベースを操作するときの注意点(php5以前の本を写経するとき) mysql_connect()は, undefined function

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

というエラーが出ます.

困ったら公式ドキュメント.

mysql_connect

(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を使えと書いてあります.

imysqlの後ろにつけましょう.

ほかにも,

  • 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がつく関数は, オブジェクト指向的な書き方と, 手続き的な書き方の二つに対応していますので, どちらでもよいです(今回は手続き的な方法でやりました).

本でエラーが出たら公式ドキュメントに当たると大体解決するので重宝しています.