У меня огромная проблема (для меня)
Мне нужно выполнить команду MySQL DELIMITER |
от PHP, но mysql_query()
терпит неудачу с ошибкой. Я обнаружил, что mysql_query()
не поддерживает использование DELIMITER
, потому что эта команда работает только в консоли MySQL
Но когда я открываю phpMyAdmin, есть возможность изменить DELIMITER на вкладке SQL, и он работает, но я не знаю, как это сделать.
Можно ли изменить разделитель с PHP? Мне нужно это сделать, прежде чем вызывать команду CREATE TRIGGER
которая использует несколько ;
,
Вам, вероятно , не нужно менять разделитель.
В CLI необходим разделитель, чтобы указать, где заканчивается оператор SQL, потому что CLI будет продолжать читать и выполнять больше инструкций, пока вы не прекратите его (например, с exit
или Control-D). Но то, что он на самом деле читает, это просто поток персонажей; это как-то нужно выяснить, где заканчивается один из утверждений, а следующий начинается. Вот что делает разделитель.
В PHP каждый вызов функции выполняет один оператор. В одном вызове функции не может быть нескольких операторов, поэтому нет необходимости ограничивать их. Заявление представляет собой целую строку. Это относится к старой mysql_query
а также к новым mysqli_query
и PDO. Конечно, есть mysqli_multi_query
если вы действительно хотите передать несколько запросов одной функции.
В случае хранимой процедуры / триггера / функции / и т. Д. Может быть несколько операторов, но это обрабатывается самой MySQL (и всегда;, AFAIK). Что касается PHP, это еще одно утверждение.
Настройка ограничителя, которую вы видите в phpMyAdmin, вероятно, используется для разделения операторов отдельно и, вероятно, выполняется в PHP-коде. Он должен сделать это, потому что он принимает вход пользователя, состоящий из нескольких операторов, но должен передавать только один оператор для вызова функции. (Я не проверял код phpMyAdmin, чтобы полностью убедиться в этом).
Помог ли этот mysql forumpost ?
В основном, он говорит, что вы должны использовать mysqli
и multi_query
для этого.
Это зависит. Я использую multi_query()
MySQLi и оставляю ;
как это делается при выполнении фактически созданной процедуры (PHP 5.6 и MySQL 5.6). Я думаю, вам не нужен ограничитель осторожности, оставьте целевой код только тогда, возможно, сработает. Вы можете попытаться запросить SQL только как
CREATE XXXX BEGIN sth; END
Просто попробуй.
вам нужна хранимая процедура (процедура, функция), чтобы включить все необходимые запросы,
поэтому в PHP вы можете вызывать упорядоченную процедуру элегантно