запрос на апдейт апдейтит пустые поля вместо значений....

Andre_K

Новичок
запрос на апдейт апдейтит пустые поля вместо значений....

Доброго времени суток.
Есть небольшой скрипт.

При изменении упрощенной информации о пользователе отрабатывается такой запрос:
PHP:
$qt = "update confusers set unick='".htmlspecialchars($_POST['unick'], ENT_QUOTES)."', upib='".htmlspecialchars($_POST['upib'], ENT_QUOTES)."', uemail='".htmlspecialchars($_POST['uemail'], ENT_QUOTES)."' where uid=".$this->input->g['uid'];

$q = mysql_query ($qt);
в поля БД unick, upib, uemail записывается пустая строка.
И вот тут начинается мистика... (иначе не скажу).
Делаю print $qt;
копипастю запрос в mysql-клиент.... и запрос проходит без проблем!

структура таблицы:
CREATE TABLE `confusers` (
`uid` int(7) NOT NULL auto_increment,
`unick` varchar(30) collate cp1251_ukrainian_ci default NULL,
`upib` varchar(255) collate cp1251_ukrainian_ci default NULL,
`uemail` varchar(255) collate cp1251_ukrainian_ci default NULL,
`uicq` int(12) default NULL,
`uworkplace` varchar(255) collate cp1251_ukrainian_ci default NULL,
`uposada` varchar(255) collate cp1251_ukrainian_ci default NULL,
`upass` varchar(50) collate cp1251_ukrainian_ci default NULL,
`banned` int(1) default NULL,
PRIMARY KEY (`uid`)
) ENGINE=MyISAM AUTO_INCREMENT=261 DEFAULT CHARSET=cp1251 COLLATE=cp1251_ukrainian_ci
версия PHP и Mysql - 4 (точнее узнать не могу - хостеротключил phpinfo(), если очень нужно, то могу связаться с суппортом и уточнить у них).

Собственно 2 вопроса аля Чернышевский:
1) У кого-то было что-нибудь похожее? (кто виноват)
2) Что с этим можно сделать?

Заранее благодарен, с уважением.
 

Фанат

oncle terrible
Команда форума
1) нет, ни у кого не было
2) отлаживать. в частности, пробовать обновлять только одно поле.
3) и кто-нибудь, ради бога, объяснит мне - откуда пошла идиотская мода делать htmlspecialchars при записи в базу?
Какой непризнанный гений появился на просторах интернета с такими советами? Дайте мне его адрес - я его придушу!
 

Trianon

Новичок
Re: запрос на апдейт апдейтит пустые поля вместо значений....

Автор оригинала: Andre_K
PHP:
$qt = "update confusers set unick='".htmlspecialchars($_POST['unick'], ENT_QUOTES)."', upib='".htmlspecialchars($_POST['upib'], ENT_QUOTES)."', uemail='".htmlspecialchars($_POST['uemail'], ENT_QUOTES)."' where uid=".$this->input->g['uid'];

$q = mysql_query ($qt);
в поля БД unick, upib, uemail записывается пустая строка.
И вот тут начинается мистика... (иначе не скажу).
Делаю print $qt;
копипастю запрос в mysql-клиент.... и запрос проходит без проблем!
...
копипастим конечно же из окна браузера, а не из страницы исходного кода.
В таком случае все эти htmlspecialchars-преобразования браузер удачно откатил назад. Поэтому скопированный запрос и проходит... ровно до того момента, пока во входных полях не появится апостроф. или бэкслэш в ненадлежащем месте. Правда, тут уже ситуация будет зависеть от того, включен ли механизм magic_quotes_gpc.

А пустоту он врядли записывает... скорее всего просто не исполняется.

htmlspecialchars применяют перед выводом в браузер. Поэтому перед print он случайно пришелся к месту. Перед обращением к БД он нужен, как корове седло.
Вместо него (при ручной сборке запроса) необходимо корректно сформировать литеральные константы. Смотрите в сторону mysql_escape_string()
 

Andre_K

Новичок
2*****:
Да отлаживал я.
Для тестового запроса использовал короткие слова латинницей.
1) $_POST переменные передаются корректно (print_r'ил сразу перед формированием запроса)
2) Проблема именно в этом запросе - при его комментировании никакого апдейта не происходит.
3) пробовал и с одним полем, обнуляет конкретно это поле.
4) Адреса не знаю, но после Вашего поста, полез в факу и попробовал с real_escape_string - те же яйца.
5) Попробовал давать в запрос вообще не экранированные переменные, все то же, все там же.
6) С мускулем связь есть и установлена - как до так и после этого апдейта все селекты отрабатывают верно.

2Трианон: Копипастил и из сорса и из браузера - разницы нет.
В том то и дело что записывает пустоту. В ячейке есть данные - после запроса они обнуляются..
 

Wicked

Новичок
Andre_K
В ячейке есть данные - после запроса они обнуляются..
т.е. ты сразу после выполнения этого запроса следующей строчкой сделал SELECT и в print_r()'е увидел пустые значения? При этом сам запрос, если его тут распечатать тут же, содержит непустые значения?
1) $_POST переменные передаются корректно (print_r'ил сразу перед формированием запроса)
Ты не на $_POST смотри, а на print $qt.
 

Фанат

oncle terrible
Команда форума
Andre_K
Здесь надо остановиться, задуматься - какого ответа ты ждешь на форуме?
Всерьёз ожидать рассказов о том, что "да, у меня тоже так было, что половина полей не апдейтится!" не приходится. Ну не бывает сказок, говорящих щук и НЛО.
Бывают только кривые скрипты. Которые при всем желании посетители форума за тебя отладить не могут.

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

А главное - не пытаться задавать посторонним людям бессмысленный вопрос "почему некоторые поля не обновляются?"
 

chira

Новичок
Andre_K

может здесь проверить ...
."' where uid=".$this->input->g['uid']
 

Фанат

oncle terrible
Команда форума
я могу предсказать следующий ответ Andre_K
он ответит только chira и только в том смысле, что сама строка-то апдейтится, а не апдейтится только пара полей.
и дискуссия встанет.
 

Andre_K

Новичок
Неа, раскопал, не апдейтится только когда в запросе присутствуют данные из $_POST. Причем маразм крепчает.
при значении $_POST['unick'] = 'ok'; //для примера
PHP:
$vara = (isset($_POST['unick'])) ? $_POST['unick'] : "failed";
print $vara." - ".$_POST['unick'];
возвращает "failed - ok"
как такое может быть я вообще не понимаю... Ушел копать дальше.
Прошу прощения за забранное у Вас время.
 

Фанат

oncle terrible
Команда форума
Того, что ты сейчас описал, не может быть.
если бы все было так, то
Делаю print $qt;
копипастю запрос в mysql-клиент.... и запрос проходит без проблем!
не выполнялось бы.
ты опять что-то напутал.
 
Сверху