Как найти строку с ошибкой запроса в базу

D
На сайте с 28.06.2008
Offline
996
232

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

Чаще всего по этой части можно понять где косяк, но сейчас у меня вылезло


Duplicate entry '3017' for key 'PRIMARY'

Ошибку я понимаю, но как найти именно тот запрос ибо индекс праймери у меня в каждой таблице?

edogs software
На сайте с 15.12.2005
Online
739
#1

Если у Вас скрипт вываливается в консоль, то значит есть функция прекращения работы.

В чем проблема в ней же выводить текст последнего запроса?

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход.
D
На сайте с 28.06.2008
Offline
996
#2

edogs, нет такой функции - весь скрипт это говнокод из запросов в базу, нескольких циклов да куча ИФ/ЕЛСЕ

S
На сайте с 30.09.2016
Offline
469
#3

Надо искать INSERT. И по таблицам посмотреть, возможно, там как раз 3к строк в какой-то таблице.

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
D
На сайте с 28.06.2008
Offline
996
#4

Sitealert, проще пути нет? В скрипте 20 инсертов в разные таблицы и в каждой более 3000 строк.

---------- Добавлено 29.04.2020 в 20:09 ----------

ошибку нашел методом тыка, но сам факт странный - при ошибках в местах запросов в базу не указывается строка. Кто придумал сей бред?

edogs software
На сайте с 15.12.2005
Online
739
#5
Dram:
Sitealert, проще пути нет? В скрипте 20 инсертов в разные таблицы и в каждой более 3000 строк.

---------- Добавлено 29.04.2020 в 20:09 ----------

ошибку нашел методом тыка, но сам факт странный - при ошибках в местах запросов в базу не указывается строка. Кто придумал сей бред?

Если запросы не напрямую mysqli_query, а через прослойку, то либо в прослойке есть настройки логов, либо в эту прослойку их туда несложно добавить (сразу после выполнения запроса - если ошибка в запросе - вывести полный запрос).

Если напрямую, то опять же решается заменой на прослойку, просто тупо реплейсом вызовов mysqli_query на кастюмную функцию, которая сделает запрос и перед возвратом не забудет проверить на ошибки при выполнении.

LEOnidUKG
На сайте с 25.11.2006
Offline
1588
#6
Кто придумал сей бред?

Это у тебя какой-то бред.

mysqli_error отлично показывает ВЕСЬ запрос в котором есть ошибка.

✅ Трастовых площадок под размещение статей и ссылок. Опыт 12 лет! ( https://searchengines.guru/ru/forum/675690 ) ⭐ Купить вечные трастовые ссылки для сайта ( https://getmanylinks.ru/?srh ) ⭐ Ускорение ваших сайтов (WP, Opencart и др.) + Настройка сервера ( https://searchengines.guru/ru/forum/997205 )
D
На сайте с 28.06.2008
Offline
996
#7

LEOnidUKG, правильно я понимаю, чтобы все работало каждый запрос нужно продублировать функцией mysqli_error на случай сбоя, чтобы все показывало?

И сразу второй вопрос, а она не устаревшая функция, у меня пхп 7,4

LEOnidUKG
На сайте с 25.11.2006
Offline
1588
#8
Dram:
LEOnidUKG, правильно я понимаю, чтобы все работало каждый запрос нужно продублировать функцией mysqli_error на случай сбоя, чтобы все показывало?

И сразу второй вопрос, а она не устаревшая функция, у меня пхп 7,4

Нет, не устаревшая. Не путай с mysql и mysqli

Можешь свою функцию написать:

function checksql ($sql,$link)

{

return mysqli_query($link,$sql) or die (mysqli_error($link));

}

а заменить все вызовы на эту.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий