ロリポップのレンタルサーバーを活用しています。2016年11月に初めてドメインを契約した時は、PHPのバージョンがV5でした。私はアップロードするWebアプリのSQLをmysql関数を使用してコーディングしていましたが、特に問題なく使用できました。ところが、2017年10月に別のドメインを契約し同じWebアプリを使用した所、最初のデータベース接続からできませんでした。原因を調査した所、ロリポップは新規契約からPHPのバージョンをV7に統一していることが判明しました。mysql関数がV7から非サポートとなった様で、Webアプリを更新しなくてはならなくなったのです。具体的には、約30ヶ所のSQL文をmysql関数からmysqliのオブジェクト型に更新しました。SQLインジェクション対策として今迄は無害化のためのmysql関数を使用していましたが、今回の更新を機により確実性のあるプリペアードステートメント方式にしました。折角ですから、データベースへの接続とSELECT/INSERT/UPDATE/DELETE文のPHP V7をメモしておきます。
※注意事項:書き換え事態はそんなに難しくはありませんでしたが、SQL文の更新ばかりに集中しており、周りの環境を余り考えずに作業していたため、PHPの関数内で実行していたSQL文をそのままmysqliのオブジェクト型に更新してしまい上手く動作しませんでした。SQL文自体は問題なかったため、原因に気付くのに半日も時間が掛かってしまいました。PHPの関数を止めるなり、ここは少し更新に工夫が必要となりました。要注意です。
1.mysqliのオブジェクト型(PHP V7)
(1-1)DB接続
<?php
$mysqli = new mysqli(‘host’, ‘id’, ‘password’, ‘db’);
if($mysqli->connect_error){
echo $mysqli->connect_error;
exit();
}else{
$mysqli->set_charset(‘utf8’);
}
?>
(1-2)SELECT文
<?php
if($stmt = $mysqli->prepare(‘SELECT a, b FROM table WHERE c = ?’)){
$stmt->bind_param(‘i’, $c);
$stmt->execute();
$stmt->bind_result($a, $b);
$stmt->fetch();
$stmt->close();
}else{
error_log(mysql_error());
exit;
}
?>
(1-3)INSERT文
<?php
if($stmt = $mysqli->prepare(‘INSERT INTO table VALUES(?, ?, ?)’)){
$stmt->bind_param(‘iss’, $a, $b, $c);
$stmt->execute();
$stmt->close();
}else{
error_log(mysql_error());
exit;
}
?>
(1-4)UPDATE文
<?php
if($stmt = $mysqli->prepare(‘UPDATE table SET a=?, b=? WHERE c=?’)){
$stmt->bind_param(‘ssi’, $a, $b, $c);
$stmt->execute();
$stmt->close();
}else{
error_log(mysql_error());
exit;
}
?>
(1-5)DELETE文
<?php
if($stmt = $mysqli->prepare(‘DELETE FROM table WHERE a=?’)){
$stmt->bind_param(‘i’, $a);
$stmt->execute();
$stmt->close();
}else{
error_log(mysql_error());
exit;
}
?>