phpでsqlファイルをインポートするのに苦戦した

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が使えるのでいらないが…

この記事が良かったら、シェアしてね!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です