|
Запись в базу перед die
|
|||
---|---|---|---|
#18+
Такой фрагмент скрипта: ... запись в базу MySQL; if(условие) die(); ... Иногда, если условие есть, то выполняется die, но записи в базе нет. Иногда (не всегда)! Можно ли предположить, что запись в базу происходит асинхронно (на низком уровне) и dio успевает остановить выполнение до выполнения записи в базу? Как гарантированно записать в базу перед dio? В C++ в классе Application есть метод Application->ProcessMessages(); Есть ли аналог в PHP? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2019, 11:37 |
|
Запись в базу перед die
|
|||
---|---|---|---|
#18+
Pupkin, Обычно функция выполнения запроса к БД возвращает результат выполнения запроса. Результат запросов вида INSERT или UPDATE обычно булево значение TRUE или FALSE. Последний случай вполне возможен, например, при попытке сделать вставку записи с дубликатом по уникальному ключу, и об этом можно сразу же прочитать в сообщении об ошибке. Таким образом, в случае единичного запроса к СУБД не может быть речи об асинхронности на уровне PHP->MySQL. Однако, если из скрипта вызывается хранимая процедура, которая на каком-то этапе выполнения делает запись, то асинхронный вариант вполне возможен. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2019, 12:03 |
|
Запись в базу перед die
|
|||
---|---|---|---|
#18+
vkle...функция выполнения запроса возвращает TRUE или FALSE. Таким образом, в случае единичного запроса к СУБД не может быть речи об асинхронности на уровне PHP->MySQL. Однако, если из скрипта вызывается хранимая процедура..., то асинхронный вариант вполне возможен.О "хранимке" речь не идет (не обсуждаю). А возврат значения из DbCnn->query(...) теоретически не гарантирует синхронности. PHP вполне может вернуть значение после асинхронной обработки через обратный вызов. Иначе чем можно обосновать отсутствие записи в DB перед выполнением dio? Но идея хорошая (подумал спасибо). У меня везде DbCnn->query(...). Мне не нужно возвращаемое значение. Сейчас (перед dio) перепишу так: $r=DbCnn->query(...). Надеюсь "умненький PHP" сообразит, что мне нужен результат и откомпилит выполнение скрипта в синхронную реализацию. Пару дне понаблюдаю, потом отпишусь. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2019, 14:03 |
|
Запись в базу перед die
|
|||
---|---|---|---|
#18+
PupkinА возврат значения из DbCnn->query(...) теоретически не гарантирует синхронности.Вы считаете, что тот единственный случай, когда ни результат работы запроса вообще никуда не записывается и ни с чем не сравнивается, ни сообщения об ошибке не читаются, ни код ответа не проверяется - в этом случае PHP не ждет ответа от СУБД. Правильно понимаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2019, 16:32 |
|
Запись в базу перед die
|
|||
---|---|---|---|
#18+
vkleПравильно понимаю? Да. Меня Вы поняли правильно! Но так ли это на самом деле - не уверен, но предполагаю, что именно так. Предполагаю потому, что иного обоснования случающемуся (иногда, а не всегда, и в разных местах, а не в одном и том же, но всегда перед duo) не могу придумать. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2019, 20:12 |
|
Запись в базу перед die
|
|||
---|---|---|---|
#18+
Pupkin, Вполне возможно, что так. Без ковыряния в исходниках (или в документации?) это сложно подтвердить или опровергнуть. Однако, сталкивался с похожей ситуацией при вызове ХП. Картину такую наблюдал. Сама ХП состояла из десятка запросов + логики. Возвращает несколько рекордсетов. Полное время работы ХП, измеренное средствами SQL между BEGIN и END составляло порядка двух секунд. Но время, за которое отрабатывал метод query() из PDO (расширение, вроде, собрано с мускулячим драйвером ND) оказалось очень маленьким. Сейчас не вспомню точно, вроде десятков или сотни миллисекунд. Затем следовала серия вызовов fetchAll(), слегка разбавленная какой-то обработкой возвращенных данных, и к концу серии время в скрипте и в ХП как-то более-менее сошлись. Из этого я сделал вывод о некоторой асинхронности. Возможно, PHP действительно ожидает ответа или результата от драйвера MySQL только при явном его использовании в скрипте. В Вашем случае, вероятно, будет правильным проверить ошибку после выполнения запроса и, если таковая имеется, записать ее в лог-файл (или вывести в браузер) перед завершением скрипта. По крайней мере, будет понятно, что за ошибка произошла. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2019, 20:57 |
|
Запись в базу перед die
|
|||
---|---|---|---|
#18+
vkleВполне возможно, что... Без ковыряния в исходниках... Перед ковырянием надо подумать какова цена победы? Поэтому (пока только) ожидаю тупую подсказку - делать так, а не делать сяк. Однако, сталкивался с похожей ситуацией ... Вашу ситуацию обдумал и resume положил в копилку личного опыта, спасибо. Кстати об сделать возврат $r=DbCnn->query(...)Переписал у себя и спровоцировал if(условие) die(); Пока катит правильно. Это для Вашего опыта. Делайте выводы. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2019, 22:53 |
|
|
start [/forum/topic.php?fid=23&msg=39759058&tid=1460036]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 123ms |
0 / 0 |