プロが教えるわが家の防犯対策術!

PHP5.2.4、mysql5.1.33を使用しています。

MySQLにおいてdelimiterを変えようと思ったのですが、
コマンドプロンプトからは「delimiter //」で「//」に変えることができたのですが、
PHPでmysql_queryで

$rs = mysql_query("delimiter //", $dbname);
if (!$rs) {
print mysql_errno($dbname).":".mysql_error()."<br>\n";
exit();
}

として実行すると、
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 //' at line 1
というエラーが出てしまいます・・・

おそらくですが設定したと同時にデミリタの「;」が「//」に変わってて
デミリタが発見できずにこのようなエラーが出てるのだと推測するのですが、
実際にはどのような現象なのでしょうか?また解決方法もお願いします。

A 回答 (3件)

CREATE TRIGGERからEND までのsql文だけで発行してください。


最後のデリミッターは入れないこと。入れなくても、送信文の終端で一文終了処理が行われます。
つまり、デリミッターの役割を、mysqli::multi_query が担ってるということです。
コマンドラインでは、まだ入力が続くのか、入力終了して発行したいのかを知るすべは、デリミッターしかありませんが、phpからの発行は、入力完了した文を発行しているという前提で作られています。
逆に言うと、一文にしたいものを2回に分けて発行はできないということです。
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。
なるほど、そういうことでしたか。
試してみたところできました。ありがとうございます。

お礼日時:2009/11/16 16:34

>トリガーを作成


MySQL5以上のversion なら、mysqli 拡張モジュールを使って、
mysqli::multi_query() であれば、セミコロンを含むsql文を発行できます。
引数の記述順が変更になってるので注意は必要ですけど。
借り物サーバーで、mysqli拡張モジュールが有効になってないなら、トリガー内にセミコロンを含めるのは無理かもしれません。

参考URL:http://www.php.net/manual/ja/book.mysqli.php

この回答への補足

すいません、ここでもdelimiterを使っていました・・・
ただそうであるとすると、コマンドラインクライアント側のdelimiterに相当するものは
PHP側だとどういう命令になるのでしょうか?

補足日時:2009/11/13 22:53
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。
本題とはずれるかもしれないので申し訳ないのですが、確認なのですが、
トリガーの作成について、プロシージャを各行で使うので
delimiterを変更(この例では // に)する必要があるという自分の
認識は合っているのでしょうか?
mysqliを使用することができたので試してみたのですが、
どうしても同じようなエラーが出てしまいます・・・

$query = "delimiter //";
$query .= "CREATE TRIGGER delete_cascade1 AFTER DELETE ON user FOR EACH ROW BEGIN DELETE FROM tbl_a WHERE user_id = old.id; END //";
$query .= "delimiter ;";
$rs = $mysqli->multi_query($query);

Errormessage: 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 //CREATE TRIGGER delete_cascade1 AFTER DELETE ON user FOR EACH ROW BEG' at line 1

やはりPHP側でトリガーを設定するのはできないのでしょうか?

お礼日時:2009/11/13 17:21

delimiterは、コマンドラインクライアント(mysql) 専用のコマンドなので、mysqldサーバー側では解釈できません。


phpからは、php用のmysqlクライアント経由でmysqldサーバーへ接続しますので、delimiterは使えないということになります。
あと、mysql_query() は単文用なので、delimiterに用は無いともいえます。
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。
なるほど、そういうことだったんですね。
delimiterを変えて、トリガー文を通そうと思ったのですが、
そういうことならコマンドラインクライアントでないとトリガーを作成することはできないのでしょうか?
(そもそもphp側でそのようなことをやるべきではないかもしれませんが、、)

お礼日時:2009/11/13 00:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!