phpでsqlファイルをデータベースにインポートするコードほぼなかったので自作した。
そこまで行くのにかなり苦戦した。
大体3時間ぐらいかかったかなww
phpでデータベースにテーブルなどを作成するときは
CREATE TABLE
とかを使いますがどうしてもsqlファイルをデータベースにインポートしたい。
ググると上記の記事が出てきたが最終更新日が2016年10月15日
コードを見るとphp7から削除されたmysql_関数を使用していた
このまま使用すると
Fatal error: Uncaught Error: Call to undefined function mysql_connect() in
というエラーが発生する。
このエラーはこんなものはないと言っている。
そもそもmysql_connect()はphp5.5から非推奨になりphp7から削除された
mysql_connect()の後継はmysqli_connect()なのですべてmysqli関数に変更する。
一旦php8.1からphp7.0に変更する(php8.1でもいいけどめんどくさいからphp7.0)
全てsqliに変更するとこのようなエラーが発生する
mysqli_select_db() expects parameter 1 to be mysqli, string given in
なので確認すると
mysqli_select_db($data_base,$conn);
になっていた。
これだとクエリが前でデータベース接続が後ろになっているのでエラーが発生した。
全て変更したコード
<?php
$host = "localhost";
$user = "db_user";
$pwd = "db_pwd";
$file_dir = dirname(__FILE__);
$file_name = "db.sql";
$data_base = "db_base";
$conn = mysqli_connect($host,$user,$pwd);
mysqli_select_db($conn, $data_base);
$get_sql_data = file_get_contents($file_name,$file_dir);
$explode = explode(";",$get_sql_data);
$cnt = count($explode);
for($i=0;$i<cnt ;$i++){
$sql = $explode[$i];
$result = mysqli_query($sql);
if($result){
echo "インポート成功:".$i."レコード<br>";
}
else
{
echo "インポート失敗:".mysql_error();
}
}
?>
に変更したが画面はエラーもなしで真っ白
まぁどこかのコードがダメなんだろうがめんどくさいのでこのコードの使用をやめた。
なので自作することにした。
sqlファイルからインポートする記事はほぼなかった。
わざわざsqlファイルからデータベースにインポートさせる必要はないから
もし使うとしてもphpmyadminを使ったほうが手っ取り早いから
phpにはsqlに接続するのが2つある。
mysqliとpdo
mysqliは調べると上級者向け
pdoは初心者向けという記事を発見した。
pdoとmysqliの違い
簡単に説明すると
pdoはデータベースの機能をすべて使うことはできない
mysqliはデータベースの機能をすべて使用できる
自分はなぜかmysqliを選んだww
先に悩んだのがどうやってphpにsqlファイルを読み込むか悩んだ
ググるとこのような質問があったので使用した
https://oshiete.goo.ne.jp/qa/3691902.html
2008年1月の質問なので使えるかはしんぱいだったが使えた
次はデータベースに接続
これはググるとかなり情報があったのでどうにかなった
後はクエリの実行
適当に調べると出てきたので使った
任意だがデータベースにsqlファイルをインポートできたかを画面に映すことにした。
かなり簡単
if文を使ったらいいだけ
完成したコードは
<?php
$db_host = "localhost";
$user = "";
$pwd = "";
$data_base = "";
$query = file_get_contents("db.sql");
$mysqli = new mysqli($db_host, $user, $pwd, $data_base);
$db_in = mysqli_real_query($mysqli, $query);
?>
<?php if($db_in){ ?>
<p>sqlファイルをデータベースにインポート成功しました。</p>
<?php }else{ ?>
<p>sqlファイルをデータベースにインポートに失敗しました。</p>
<?php mysqli_connect_error() ?>
<?php } ?>
<?php mysqli_close($mysqli); ?>
になった
最初に書いたコードよりも短くなりスッキリした。
データベースの処理は3行だけになりました。
php8にも対応しています。(多分)
データベースの処理
接続、クエリ処理、切断
だけになった。
最初のコードはphp5.1とかだったら動くかもしれない。
たった3行だけで3時間かかったのは最悪でしたけどちゃんと動いてよかったです。
このコードの更新はgithubにしてしています。
https://github.com/ichirugame/sql-file-import-with-php
追記 (11/29)
この後も少し苦戦した。
複数のクエリが実行されないという問題
複数ではないクエリだとちゃんと実行される。
なので調べまくるとコードに書いている
mysqli_real_query
は複数のクエリには対応していないらしい。
なので対応した関数に変更した。
修正したコード
<?php
$db_host = "localhost";
$user = "";
$pwd = "";
$data_base = "";
$query = file_get_contents("db.sql");
$mysqli = mysqli_connect($db_host, $user, $pwd, $data_base);
$db_in = mysqli_multi_query($mysqli, $query);
?>
<?php if($db_in){ ?>
<p>sqlファイルをデータベースにインポート成功しました。</p>
<?php }else{ ?>
<p>sqlファイルをデータベースにインポートに失敗しました。</p>
<?php } ?>
<?php mysqli_close($mysqli); ?>
複数のクエリを実行しない場合は最初に書いたコードでいいと思います。
データベース接続がオブジェクト指向型なので手続き型に変更しました。
mysqliで調べるとだいたいオブジェクト指向型で書かれているのが多いです。
mysqliの売りはオブジェクト指向型だと思う
mysqli関数の手続き型はmysql関数の代替え用のためにあるだけだと思う。
自分的にはオブジェクト指向型よりも手続き型のほうが見やすいし分かりやすい。
このコードもいつかpdoで書いてみようと思います。
pdoを使用したらsqliteも対応できるのでいいなとは思うがmariadbが使えるのでいらないが…
コメントを残す