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で質問しましょう!
似たような質問が見つかりました
- MySQL MySQLのテーブル作成でハイフン - は使用できないのでしょうか? 2 2022/10/21 16:50
- MySQL テーブル作成です。どこかのスペルが間違っているか記号など スペースかな? 1 2022/10/01 05:08
- MySQL 何にかが違うから エラーなんでしょうね! 2 2022/09/18 05:28
- MySQL 参考書に従って入力したつもりでしたが、最後はエラーがでました。 1 2022/09/28 03:45
- その他(プログラミング・Web制作) mariadbでのエラー 1 2022/11/15 12:31
- 英語 英文の添削お願いします。【長文です。】 マッチングアプリで相手を言い負かしている時のやつです。 色々 1 2023/07/01 02:12
- YouTube youtubeからの著作権メールについて 2 2023/02/14 16:12
- 公的扶助・生活保護 保証人? 1 2022/05/17 22:42
- その他(SNS・コミュニケーションサービス) 自分のpcがハッキングされたようなメールが来たのですがどうすればいいですか? 4 2022/10/02 16:14
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MeCabの結果をWindows+PHPで取...
-
接続ができません
-
SQLのVARCHARとVARCHAR2の違い
-
副問合せにLIKE文を使う方法は...
-
ERROR 1045 (28000) (using pas...
-
mysqlへのインポート処理がうま...
-
MySQLカラム名は日本語と英数字...
-
ODP.NETのバージョン確認
-
DB内の日本語データがPHPで取得...
-
INT型は金額の型に使用するべき...
-
参考書に従って入力したつもり...
-
Btrieveのコンバートしたいので...
-
mysql+php リストボックスにつ...
-
ポート3306へつながらず、MySQL...
-
プライマリーキーの昇順でソー...
-
MySQLの型のサイズ指定で速度は...
-
VBAで変数内に保持された二次配...
-
like句を使って日本語を検索す...
-
RPMのmysqlとmysql-serverの違い
-
MAX()でENUMの内部番号が最大の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
クラスファイルでエラーが出て...
-
mysql_real_escape_string?
-
phpとmysqlを使っています。
-
PHPのサンプルコードが意図した...
-
ページング実装で2ページ目以...
-
Flash8のユニコードについて。...
-
OpnePNEの構築において
-
php mysqlの文字化け(レンタル...
-
php+mysqlでINSERTで文字化けし...
-
Linuxで、Pearコマンドが使えな...
-
mysqliについて
-
for($i=1; $i<hoge; $i++)
-
mySQLに詳しい兄貴来てください
-
mysql_queryでのdelimiterの設...
-
PHP でMysqlを使用して日本語を...
-
FORMからPHP処理
-
イメージデータを文字列に変換...
-
mysqlでphpinfoと実際のバージ...
-
Mysql&PHPのアップグレードに...
-
PHPからmySQLへINSERT文の実行
おすすめ情報