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

No.3ベストアンサー
- 回答日時:
CREATE TRIGGERからEND までのsql文だけで発行してください。
最後のデリミッターは入れないこと。入れなくても、送信文の終端で一文終了処理が行われます。
つまり、デリミッターの役割を、mysqli::multi_query が担ってるということです。
コマンドラインでは、まだ入力が続くのか、入力終了して発行したいのかを知るすべは、デリミッターしかありませんが、phpからの発行は、入力完了した文を発行しているという前提で作られています。
逆に言うと、一文にしたいものを2回に分けて発行はできないということです。

No.2
- 回答日時:
>トリガーを作成
MySQL5以上のversion なら、mysqli 拡張モジュールを使って、
mysqli::multi_query() であれば、セミコロンを含むsql文を発行できます。
引数の記述順が変更になってるので注意は必要ですけど。
借り物サーバーで、mysqli拡張モジュールが有効になってないなら、トリガー内にセミコロンを含めるのは無理かもしれません。
参考URL:http://www.php.net/manual/ja/book.mysqli.php
この回答への補足
すいません、ここでもdelimiterを使っていました・・・
ただそうであるとすると、コマンドラインクライアント側のdelimiterに相当するものは
PHP側だとどういう命令になるのでしょうか?
ご返答ありがとうございます。
本題とはずれるかもしれないので申し訳ないのですが、確認なのですが、
トリガーの作成について、プロシージャを各行で使うので
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側でトリガーを設定するのはできないのでしょうか?

No.1
- 回答日時:
delimiterは、コマンドラインクライアント(mysql) 専用のコマンドなので、mysqldサーバー側では解釈できません。
phpからは、php用のmysqlクライアント経由でmysqldサーバーへ接続しますので、delimiterは使えないということになります。
あと、mysql_query() は単文用なので、delimiterに用は無いともいえます。
ご返答ありがとうございます。
なるほど、そういうことだったんですね。
delimiterを変えて、トリガー文を通そうと思ったのですが、
そういうことならコマンドラインクライアントでないとトリガーを作成することはできないのでしょうか?
(そもそもphp側でそのようなことをやるべきではないかもしれませんが、、)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
phpのheader("Location:#pos")...
-
フォームで戻った際に入力済み...
-
SplFileObject を利用したとき...
-
csvファイルについて教えて下さ...
-
PHP8でWarning:Undefined varia...
-
PHPSpreadsheetによる書き出し...
-
PHPの変わった閉じタグの必要性...
-
セッション関数を使わずにファ...
-
composerをインストールしたい...
-
phpの問い合わせフォームを作っ...
-
marginの値でマイナス値を設定...
-
submitで思うようにページが遷...
-
HTML PHP ラジオボタンのイベント
-
php でqiitaのサイトにあったフ...
-
PHPの勉強してます。 配列のと...
-
BASIC認証のフォームをデザイン...
-
アップロードファイルを表示す...
-
複数のパソコンの中の1つのパソ...
-
返信機能のツリー構造の深さを...
-
PHPについて。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
クラスファイルでエラーが出て...
-
mysql_queryでのdelimiterの設...
-
mysql_real_escape_stringについて
-
php mysqlの文字化け(レンタル...
-
PHPからmySQLへINSERT文の実行
-
mysqlがインストールされている...
-
MySQLカラム名は日本語と英数字...
-
ODP.NETのバージョン確認
-
副問合せにLIKE文を使う方法は...
-
SQLのVARCHARとVARCHAR2の違い
-
エクセルで連勤チェックをした...
-
ERROR 1045 (28000) (using pas...
-
旧filemakerで和暦(令和など)...
-
列数が多いと結果が行単位に改...
-
Usage: \\.<filename> | sourc...
-
VBAで変数内に保持された二次配...
-
INT型は金額の型に使用するべき...
-
like句を使って日本語を検索す...
-
mysqlへのインポート処理がうま...
-
テーブル作成でエラーが出てき...
おすすめ情報