LINUX.ORG.RU

Запрос INSERT, выполненный из PHP вставляет не все заданные поля, а из консоли - все.

 , , ,


0

2

Здравствуйте, товарищи. У меня тут какая-то магия.

Tl;dr:
Один и тот же SQL-запрос, выполняемый через php вставляет в таблицу не все заданные поля, тогда как ОН ЖЕ, выполненный через консольный mysql-клиент вставляет все поля.

Ситуация:
1) Есть таблица в Mysql следующей конструкции:

CREATE TABLE `af_prices_items` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `list_id` int(11) NOT NULL,
 `f_name` varchar(255) NOT NULL,
 `f_art` varchar(255) NOT NULL,
 `f_category` varchar(255) NOT NULL,
 `f_width` varchar(255) NOT NULL,
 `f_height` varchar(255) NOT NULL,
 `f_frame` varchar(255) NOT NULL,
 `s_name` varchar(255) NOT NULL,
 `s_art` varchar(255) NOT NULL, 
 `s_width` int(11) NOT NULL,
 `s_height` int(11) NOT NULL,
 `price` decimal(10,2) NOT NULL,
  PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8
2) Из скрипта php выполняю запрос:
INSERT INTO af_prices_items
(`list_id`,`f_width`,`f_height`,`f_frame`,`price`,`s_width`,`s_height`) 
VALUES 
(201,'45','140','0','1450','45','140')
3) В результате, в таблицу вставляется запись такого вида:
Array
(
    [id] => 2314
    [list_id] => 201
    [f_name] => 
    [f_art] => 
    [f_category] => 
    [f_width] => 45
    [f_height] => 140
    [f_frame] => 0
    [s_name] => 
    [s_art] => 
    [s_width] => 45
    [s_height] => 140
    [price] => 0.00
)

Проблема: Как можно заметить, в поле price записывается ноль.

При этом, если выполнить ЭТОТ ЖЕ запрос в adminer'е (аналог PhpMyAdmin), или из консольного mysql-клиента то ВСЁ РАБОТАЕТ, цена вставляется именно такая какая должна быть, а не ноль.

Что я пробовал:

1. Выполнял запрос разными способами:
Способ первый, топорный

mysql_query($sql);
Способ второй, через PDO
$pdo = new PDO("mysql:host=" . MYSQL_SERV . ";dbname=" . MYSQL_DB, MYSQL_LOGIN, MYSQL_PASS);
$pdo->exec($sql);
Результат одинаков. (При этом, запись создаётся, никаких ошибок, так как проверяю запись сразу после добавления).

В переменной $sql при этом просто указан тот самый запрос что я привёл выше.

2. Также, я пробовал делать запрос не в виде INSERT ... (fields) VALUES (values), а в виде INSERT ... field1=value1, field2=value2 и т.д., опять же без результата.

3. Я обновил систему и до максимума и перезагрузил машину, не помогло. Кстати вот конфигурация:

Система: Debian Wheezy x64
Ядро: 3.2.0-4-amd64
Mysql: mysql Ver 14.14 Distrib 5.5.46, for debian-linux-gnu (x86_64) using readline 6.2
Php: PHP 5.4.45-0+deb7u2 в виде модуля для Apache
Apache: 2.2.22

4. Ещё, пробовал менять тип данных у поля price в таблице на bigint, integer, float, varchar(255), без результата :(

5. Проверял свободное место на диске (всё окей), сообщения в dmesg (всё окей), сообщения в /var/log/mysql и /var/log/apache (всё окей).

6. Пробовал гуглить, но либо я один такой, либо просто не смог грамотно сформулировать вопрос на английском (по «PHP INSERT not inserting all the fields into database» ничего путного не нашел)

7. Да, пробовал менять движок таблицы с MyISAM на InnoDB (MyIsam там был исторически) - не помогло.

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

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

Заранее спасибо :)

у тебя цена в mysql хранится в decimal или флоат, так давай ему хотя бы целое число (а лучше 1450.00), а не строку
'1450'

kiotoze ★★★★ ()

В переменной $sql при этом просто указан тот самый запрос что я привёл выше

Ты в этом уверен, точно-точно?

no-such-file ★★★★★ ()
Ответ на: комментарий от kiotoze

давай ему хотя бы целое число (а лучше 1450.00), а не строку

'1450'

Когда выполняю этот запрос в консольном клиенте mysql, или в adminer'e - все вставляется как надо. Этот запрос работал уже пару лет. Ничего не изменилось, но работать стало вот так.
Пробовал изменить запрос, чтобы везде где числа, были именно числа, без кавычек - не помогло.

MihanEntalpo ()

Ты юзаешь PDO точно таким же топором. Просто сделай человеческий запрос (PDO умеет в человеческие запросы только через prepare)

redixin ★★★★ ()

1 .. 8

Хех, внушительный список, но вангую, что косяк где-то в коде. Проклятое поле, во все остальные данные вставляются, в него нет :) Попробуй добавить еще одно поле и вставлять это число в него.

goingUp ★★★★★ ()

возможно где-то закралась русский символ «с» или «е»
выполни

echo "price" | xxd
0000000: 7072 6963 650a                           price.

только «price» копируй с исходника

При этом, если выполнить ЭТОТ ЖЕ запрос

это ведь значит, что в коде ты сделал

mysql_query($sql);
echo $sql;

и скопировал из консоли и вставил через консоль, а не перенабирал вручную?

после чего проявилась проблема? обновление ОС, исходников?

kiotoze ★★★★ ()

очевидно что ошибка в коде а не в приведенных тобой строках,также очевидно что твой запрос сработает на пустой бд и 10-строчнике на пхп(минимальном)

как фиксить такие проблемы-сделать таблицу отдельную и начать копипастить код в простейший «10-строчник» из основного проекта и построково запускать,пока не перестанет работать

anonymous ()
Ответ на: комментарий от no-such-file

Ты в этом уверен, точно-точно?

Спасибо за наводку, вот именно этого мне и не хватало.

Как уже писали, я делал именно так:

mysql_query($sql);
echo $sql;

И на экран у меня выводился тот SQL-код который я и привёл в теме. Однако, я только сейчас вспомнил, что то, что выводит браузер, и то что там на самом деле - может несколько отличаться.
И при просмотре исходного кода я увидел следующее:

INSERT INTO af_price_items
(`list_id`,`f_width`,`f_height`,`f_frame`,`price`,`s_width`,`s_height`) 
VALUES 
(201,'45','140','0','<SPAN STYLE=\"white-space:nowrap;max-width:0px;\">1450</SPAN>','45','140')

Причина этого в том, что данные я загружаю в таблицу из HTML-файла, который генерирует 1C-ка при экспорте таблицы в HTML. При этом, похоже проблема собственно в том, что моя функция, вырезающая тэги по какой-то причине пропустила этот тэг. И так по всему столбцу `price`, несколько сотен записей, у которых все данные кроме `price` заполнилось нормально.

Когда сидишь над проблемой уже несколько часов, мышление сужается, и тогда просто необходим ускорительный пинок в нужном направлении чтобы сдвинуться с мёртвой точки :)
Всем спасибо!

MihanEntalpo ()
Ответ на: комментарий от MihanEntalpo

Когда сидишь над проблемой уже несколько часов, мышление сужается

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

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

Ай-ай-ай, данные нужно валидировать перед тем, как пихать в БД.

no-such-file ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.