2013-04-22 5 views
2

Я написал PHP-скрипт миграции базы данных, который обрабатывает список файлов SQL и выполняет их содержимое. Это должно помочь автоматизировать проект setupd и обновления. Теперь я получаю ошибки, как это:Как создать хранимые процедуры MySQL из PHP?

mapCoursesToSport.sql: 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 mapCoursesToSport| 
CREATE PROCEDURE mapCo' at line 1 

я получаю ту же ошибку, когда я проезжал в скрипт файл с определением вида, который также использовал DELIMITER с. Затем я нашел обходное решение только для удаления разделителей из файла SQL. И это сработало. Но теперь это не вариант, поскольку для хранимых процедур действительно нужны определения разделителей.

Итак, как я могу определить хранимые процедуры MySQL из PHP? (Или, может быть, как правило, Morre: Как это должно быть SDELIMITER handeled?)

+1

http://www.stackoverflow.com/a/5025730/2153758 Вы прокомментировали это, в приведенном ниже ответе указывается, что вы должны передавать каждую переменную один за другим в 'mysql (i) _query' вместо использования запятых. – bwoebi

+0

Спасибо за подсказку, но это не работает для меня. Мне нужны разделители в моих хранимых процедурах. Поэтому я не могу просто удалить их из кода. Если я это сделаю, процедуры не будут созданы. – automatix

+0

Вам не нужны разделители? Точки с запятой должны проходить как есть ... и не заканчивать ваш запрос одним разделителем – bwoebi

ответ

3

Вы можете использовать встроенную функцию PHP mysqli::query и mysqli::prepare в качестве альтернативы для создания хранимой процедуры:

http://php.net/manual/en/mysqli.quickstart.stored-procedures.php

Использование MySQLi :: multi_query также работает, но немного сложнее обрабатывать, поскольку вам может потребоваться подсчитать количество запросов для выполнения upfront перед их выполнением один за другим (при условии, что окончательный разделитель запроса не является обязательным, подсчет запросов может быть утомительным)

http://php.net/manual/en/mysqli.multi-query.php

<?php 
    // Using mysqli extension below in object-oriented mode 
    // after having executing queries 
    // with mysqli::multi_query 

    do { 
     $queryResult = $mysqli->use_result(); 
     unset($results); 
     while ($result = $queryResult->fetch_array(MYSQLI_ASSOC)) { 
      $results[] = $result; 
     } 
     $queryResult->close(); 

     if ($mysqli->more_results()) { 
      $mysqli->next_result(); 
     } 

     $queryCount--; 
    } while ($queryCount > 0); 

P.S .: Причина, почему я не использую mysqli:more_results ни mysqli:next_result в качестве оператора цикла в том, что некоторые запросы могут быть выполнены должным образом без возвращения какого-либо результата. В таком случае мы не хотим разорвать цикл до того, как все запросы будут выполнены.

+0

Спасибо за ваш ответ! Я не понимаю, как это должно работать ... Что вы переходите в 'multi_query'? Как вы определяете 'queryCount'? Где/как вы используете массив '$ results'? – automatix

+1

Все запросы, используемые для создания процедуры, должны быть переданы в multi_query. Количество запросов можно определить с помощью 'implode' on"; " (если он определен как разделитель запроса) вашей строки запросов, хранящейся в переменной, переданной в mysql_multi_query. Я представил массив результатов, чтобы охватить общий случай (где не хотелось бы создавать процедуру, но выполнять несколько запросов, возвращаемых результатами). Пожалуйста, обратите внимание на документацию, указанную первой ссылкой, поскольку она более проста в использовании. –

+0

Благодарим вас за подробные объяснения! – automatix

Смежные вопросы