2013-10-01 3 views
0

У меня есть процесс выставления счетов, который создает 5 таблиц и заполняется соответствующими данными, а затем строит 6-ю финальную таблицу из этих 5. Это около 14 запросов, я имею в виду использование PHP для их обработки из-за какой-то переменной даты необходимо изменить.PHP обрабатывает вопросы по процессу MYSQL

Если я поместил все 14 последовательно и запустил его, он работает безупречно. Хотели бы вы просто иметь всю последовательность в одном утверждении в php? Пример ниже:

$TheWholeShow = whole sql sequence 
$date=$_POST["date"] 
mysqli_query($connect,$TheWholeShow) 

Или вы хотите разбить его?

$part1 = build table x 
$part2 = build table y 
$part... the rest 
$date=$_POST["date"] 
mysqli_query($connect,$part1,$part2,$part3,$part4..and so on) 

Я чувствую, что этот трудный вопрос задавать, не набирая книгу. Кроме того, я новый кодер, и я не уверен в правильной практике для таких.

Мне сказали, что сценарий bash может быть лучшим вариантом?

+0

Вам придется разбить его. Базовые драйверы mysql в PHP не позволяют выполнять несколько запросов в одном вызове query(). –

+0

Чтобы сохранить целостность, используйте 'BEGIN;' и 'COMMIT;'/'ROLLBACK;'. Таким образом, вы можете разделить запросы (так как вы вынуждены выполнять базовые драйверы, которые не допускают множественные запросы, как указано в @Marc B) – TheWolf

+0

Если вы хотите, вы можете создать хранимую процедуру для этого - в зависимости от в вашей версии MySQL. – halfer

ответ

2

Это действительно сложный вопрос.

Во-первых, обычно это плохая идея выполнять длительные процессы в контексте веб-запроса. Большинство серверов накладывают тайм-аут на скрипт - это значение конфигурации, и ваш пробег будет отличаться. По мере того, как ваши данные растут, вы можете попасть в этот таймаут, и ваш процесс завершится неудачно.

Во-вторых, вам нужно убедиться, что только один экземпляр PHP-скрипта может запускаться за один раз, особенно если это длинный сценарий. Нет очевидного способа сделать это «из коробки», о котором я знаю, поэтому вам, возможно, придется создать собственный механизм, позволяющий запускать только один экземпляр; это, вероятно, сложнее, чем кажется.

Что касается вашего вопроса, как пишет TheWolf, рассмотрите возможность использования транзакций в этом - не все установки MySQL позволяют это. Использование транзакции означает, что вся ваша база данных показывает, что она успешна или не работает как единое целое - так что «мы до сих пор не получили», а затем ее забили, и теперь у нас есть некоторые данные, но не другие биты, и мы должны написать индивидуальную очистку сценарий "сумасшествие.

Поскольку драйверы не позволяют вам выставлять более одного заявления за раз, вам придется разделить его - но не так, как вы предлагаете.

$date=$_POST["date"] 
mysqli_begin_transaction($connect) 

$part1 = build table x 
mysqli_query($connect,$part1) 

$part2 = build table y 
mysqli_query($connect,$part2) 
$part... the rest 
mysqli_query($connect,$part...) 

mysqli_commit($connection) 

Вы должны создать свой собственный откате логики - то есть в основном зависит от логики приложения, и как вы хотите обрабатывать сбои в сценарии - manual имеет некоторые дополнительные объяснения.

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