Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...

как найти ошибку


kegel
 Поделиться

Рекомендованные сообщения

Подскажите как найти ошибку 1064. Интересует алгоритм поиска этой ошибки. Спасибо.

2013-05-19 13:56:37 - PHP Notice:  Error: 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 ' 552, 546, 514, 511, 507, 506, 503, 500) and pd.language_id = '1' AND p.status =' at line 1<br />Error No: 1064<br />SELECT p.product_id, (SELECT AVG(rating) AS total FROM review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM product p LEFT JOIN product_description pd ON (p.product_id = pd.product_id) LEFT JOIN product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN product_to_category p2c ON (p.product_id = p2c.product_id) WHERE p.product_id in ( 554, 552=, 552, 546, 514, 511, 507, 506, 503, 500) and pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' AND p2c.category_id = '24' GROUP BY p.product_id LIMIT 0,10 in /home/.../.../.../public_html/system/database/mysql.php on line 49

2013-05-20 5:23:03 - PHP Notice:  Error: 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 '1??) and pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() A' at line 1<br />Error No: 1064<br />SELECT p.product_id, (SELECT AVG(rating) AS total FROM review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM product p LEFT JOIN product_description pd ON (p.product_id = pd.product_id) LEFT JOIN product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN product_to_category p2c ON (p.product_id = p2c.product_id) WHERE p.product_id in ( 484, 217 1??) and pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' AND p2c.category_id = '25' GROUP BY p.product_id LIMIT 0,2 in /home/.../.../.../public_html/system/database/mysql.php on line 49

 

Ссылка на комментарий
Поделиться на других сайтах


Интересует алгоритм поиска этой ошибки. Спасибо.

Алгоритм такой:

1. Читаете сообщение об ошибке. Там написано, что в SQL азпросе синтаксическая ошибка и приведён кусок, в корестностях которой ошибку можно увидеть.

2. Смотрите запрос, ищете часть с синтаксической ошибкой.

3. Находите приведенный кусок (выделено синим) и смотрите, что там рядом и где ошибка (выделено красным):

убрал код, т.к. раскраска испарилась, а перекрашивать снова некогда. Если словами непонятно, спросите ещё раз, может скриншотом сделаю.

Просто найдите приведенный кусок из сообщения об ошибке (... near 'вот эта часть вам нужна') и потом в запросе (он чуть дальше тоже процитирован в сообщении) посмотрите, что там за фигня написана. На ней MySQL и ломается:

1. ... WHERE p.product_id in ( 554, 552=, 552, 546, ...

2. ... WHERE p.product_id in ( 484, 217 1??) and pd.language_id = '1' ...

Ссылка на комментарий
Поделиться на других сайтах


Интересует алгоритм поиска этой ошибки.

 

обязательное условие - знание синтаксиса mysql.

Ссылка на комментарий
Поделиться на других сайтах

trance Спасибо! Нашел в этом файле запрос на который указывает ошибка.

rb2 Спасибо, это я понимаю, не понятно как узнать в каком файле находится запрос с ошибкой 

 

 

Фигню эту я вижу но откуда она берется не понятно. Запрос находится в функции public function getProducts и в нем синтаксических ошибок нет, так как он не изменялся и находится в изначальном виде. В этом файле изменялся один единственный запрос в функции public function getBestSellerProducts.

Был:

$query = $this->db->query("SELECT op.product_id, COUNT(*) AS total FROM " . DB_PREFIX . "order_product op LEFT JOIN `" . DB_PREFIX . "order` o ON (op.order_id = o.order_id) LEFT JOIN `" . DB_PREFIX . "product` p ON (op.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE o.order_status_id > '0' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' GROUP BY op.product_id ORDER BY total DESC LIMIT " . (int)$limit);

Стал:

$query = $this->db->query("SELECT op.product_id, SUM(op.total) AS total FROM " . DB_PREFIX . "order_product op LEFT JOIN `" . DB_PREFIX . "order` o ON (op.order_id = o.order_id) LEFT JOIN `" . DB_PREFIX . "product` p ON (op.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE o.order_status_id > '0' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' GROUP BY op.product_id ORDER BY total DESC LIMIT " . (int)$limit);

Ссылка на комментарий
Поделиться на других сайтах


Я ищу так:

1.нотепадом ++ ищу вхождение строки (если не понимаю где это) , например,
"SELECT p.product_id, (SELECT AVG(rating) AS total" - (беру чистый фрагмент,без подстановки переменных, без таких вариантов: LEFT JOIN " . DB_PREFIX . "product_to_store)
http://joxi.ru/kBGbUdg5CbAnZBK9xiY

2. Нашел, в данном случае это function getProducts.
Далее в большинстве случаев проходит такой вариант:
проверяю данные, пришедшие в запрос - перед текстом запроса ставлю
 

$buf=print_r($data,true);$this->log->write($buf);

 

где $data массив- параметр пришедший в функцию public function getProducts($data = array()).
В итоге в журнале ошибок у меня будет виден этот массив.

Так же я могу получить текст запроса:
если код имеет вид "$this->db->query("SELECT op.product_id..................",
то выношу текст запроса в переменную - $sql = "SELECT op.product_id.................";
Следующей строкой пишу запись в журнал ошибок текста запроса $this->log->write( $sql);
И следующей выполнение запроса 
$this->db->query( $sql);

С полученным текстом запроса уже играюсь в phpMyAdmin.

Можно и сразу скопировать ошибку и в phpMyAdmin.

В вашем случае надо смотреть что приходит в массиве  и подставляется в WHERE p.product_id in (.


 

  • +1 1
Ссылка на комментарий
Поделиться на других сайтах


sergiosinicin

Спасибо за подробное разъяснение. Плюсую.+

В вашем случае надо смотреть что приходит в массиве  и подставляется в WHERE p.product_id in (.


В самом запросе я не вижу этого условия WHERE p.product_id in. Ткните пожалуйста носом на него.

Ссылка на комментарий
Поделиться на других сайтах


sergiosinicin

Спасибо за подробное разъяснение. Плюсую.+

В вашем случае надо смотреть что приходит в массиве  и подставляется в WHERE p.product_id in (.

В самом запросе я не вижу этого условия WHERE p.product_id in. Ткните пожалуйста носом на него.

без файла проблематично.

скайп: sergiosinicin

условие может быть ниже

Ссылка на комментарий
Поделиться на других сайтах


  • 4 года спустя...
В 5/21/2013 в 12:40, sergiosinicin сказал:

без файла проблематично.

скайп: sergiosinicin

условие может быть ниже

Та же проблема, не экспортируются товары . 
И тот же код ошибки, помогите пожалуйста.

@sergiosinicin

product.php

Ссылка на комментарий
Поделиться на других сайтах


В 5/21/2013 в 12:40, sergiosinicin сказал:

без файла проблематично.

скайп: sergiosinicin

условие может быть ниже

Та же проблема, не экспортируются товары . 
И тот же код ошибки, помогите пожалуйста.

@sergiosinicin

Ссылка на комментарий
Поделиться на других сайтах


Та же проблема, не экспортируются товары . 
И тот же код ошибки, помогите пожалуйста.
[mention=7649]sergiosinicin[/mention]
?
Ссылка на комментарий
Поделиться на других сайтах


Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

  • Сейчас на странице   0 пользователей

    • Нет пользователей, просматривающих эту страницу.
×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.