2016-05-12 12 views
0

SQL(デリミタの変更、ドロップ/作成テーブル、テーブルの変更などを含むドロップ/作成テーブルとストアドプロシージャ)のファイルがあります。私は次のようにこのファイルを実行しよう:PHPでファイルから複雑なSQLを実行するmysqli

$sql = file_get_contents("sql/filename.sql"); 
if (!$mysqli->multi_query($sql)) { 
    echo("Multi query failed: (" . $mysqli->errno . ") " . $mysqli->error); 
    exit(); 
} 
do { 
    if ($res = $mysqli->store_result()) { 
     $res->free(); 
    } 
} while ($mysqli->more_results() && $mysqli->next_result()); 

いくつかのファイルが正常に処理されますが、区切り文字の変更と他のファイルとストアドプロシージャの作成に私がエラー受信:私はこれの内容をコピーする場合

Multi query failed: (1064) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER $$ 

DROP PROCEDURE IF EXISTS alter_members_table $$ 
CREATE PROCEDUR' at line 1 

SQLファイルを開き、phpMyAdminで実行してください。すべて正常に動作しますので、SQLが正しいと確信しています。

何が問題なのですが、これをどのように修正できますか?

UPDATE ... SQLファイルの 一つは、このエラーを生成:

DELIMITER $$ 

DROP PROCEDURE IF EXISTS procedure_name $$ 
CREATE PROCEDURE procedure_name() 
BEGIN 
    IF NOT EXISTS ((
     SELECT * FROM information_schema.COLUMNS 
     WHERE TABLE_SCHEMA = DATABASE() 
      AND COLUMN_NAME = 'column_name' 
      AND TABLE_NAME = 'table_name' 
    )) 
    THEN 
     ALTER TABLE `table_name` 
     ADD COLUMN `column_name` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' 
     AFTER `other_column_name`; 
    END IF; 
END $$ 

CALL procedure_name() $$ 

DELIMITER ; 

私はここにストアドプロシージャを使用する理由、これはプラグインのインストールスクリプトの一部であり、それは準備するために、いくつかのSQLファイルを実行する必要がありますDB。私は解決策のためにサーフィンしましたが、それでもまだ存在しない場合にのみ新しい列を作成する方法はあります。私は手順上の解決策しか見つけられませんでした。

+0

http://stackoverflow.com/questions/345637/php-multiple-sql-queries-in-one-mysql-query-statement/345712#345712 –

+0

私はあなたに私たちに失敗したクエリの例実際のコードではなく、同じコードスタイルと構文を外しても – RiggsFolly

+0

また、multi_queryで多数のクエリを実行する場合は、それぞれが一意のクエリとして実行されます。そのため、おそらくDROP PROCEDURE IF EXISTS alter_members_table; ' – RiggsFolly

答えて

0

バッチ区切り文字を変更する文は、MySQLクライアントによってのみ認識されると思います。他のインタフェース経由で実行する場合、有効なSQL文ではありません。

したがって、達成したいことができるかどうかはわかりません。

なぜストアドプロシージャを作成および削除するにはPHPスクリプトが必要ですか?プロシージャがDBに永久に存在しないのはなぜですか?

+0

これは良いコメントとして役立ちますが、答えはできません。 –

+0

答えは、私はそれが可能であるとは思わないということです。確かに答えがない質問への答えは答えがないということです。 – UberDoodles

関連する問題