Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > PHP: Базы Данных > Update в таблице InnoDB |
Автор: Nitronka 21.4.2009, 21:54 | ||||||
База данных bank создана с помощью phpMyAdmin 2.6.1. MySQL 5.0.45 Apache/2.2.4 В базе таблица users имеет тип InnoDB. При первоначальном внесении новой записи выполняется следующий запрос:
где:
Значение 0 в запросе имеет тот смысл, что пока пользователь не активирует свой аккаунт через отправленное ему письмо, содержащее $uniq_id, значение поля status в таблице users сохраняется равным нулю.После активации необходимо изменить это значение на 1. Делается это следующим образом:
Несмотря на то, что после работы сценария выдаётся: Ваша учетная запись активирована. Обновление в таблице не происходит, как был ноль в status, так он и остаётся. Более того, при попытке намеренно заново активировать аккаунт,где status я сделал =1 через этот же запрос Update только средствами phpMyAdmin, всеравно выводится: Ваша учетная запись активирована. а по логике должно быть: Ваша учетная запись уже активирована. Не понимаю,что происходит,где что не так сделал????! |
Автор: Kirsan 21.4.2009, 22:25 |
Попробуйте в консоли выполнить UPDATE-запрос. Вероятно, вернётся какая-либо ошибка или что-то в этом роде. Тогда более понятны станут причины странного поведения скрипта. p.s. в таком виде этот скрипт позволит злоумышленникам удалить всю таблицу с пользавателями в считанные минуты. НИКОГДА нельзя данные из массивов $_GET и $_POST направлять сразу в запрос. В них может храниться что угодно, в том числе и SQL-инъекции. |
Автор: Nitronka 21.4.2009, 22:57 |
У меня стоит Denwer, поэтому я не совсем понимаю как вызвать консоль MySQL Спасибо за совет! В принципе я не передаю данные напрямую, просто здесь я привёл упрощённый вариант скрипта, опустив проверку посредством регул-выражений. честно говоря,над защитой я пока основательно не думал - надо решить вопрос с регистрацией. есть предположение,что это связано с типом таблицы InnoDB (мне необходима поддержка транзакций), и вследствии этого не сохраняются изменения. |
Автор: Kirsan 21.4.2009, 23:08 | ||
Консоль доступна и в phpMyAdmin (см. скриншот). В скрипте закомментируйте строку
а то, что напечатает var_dump($sql), скопируйте в phpMyAdmin туда, где указано на скриншоте. Там же выполните запрос и посмотрите, что вернётся. |
Автор: Nitronka 21.4.2009, 23:41 | ||
Вот что напечатал var_dump($sql):
а вот что вернул запрос в phpMyAdmin: Затронутые ряды: 0 (Запрос занял 0.0009 сек) SQL-запрос: UPDATE users SET `status` =1 WHERE ( uniq_id = '68042cfef052c4c1f5cf348764a65e51' AND STATUS =0 ) без изменений... |
Автор: Kirsan 22.4.2009, 00:03 | ||
Затронутые ряды: 0 Значит не обновилась ни одна строка. Попробуйте там же выполнить запрос
Если ничего не вернёт, то значит что-то с WHERE частью запроса. Сверяйте то, что запрашивается с тем, что в базе. |
Автор: Nitronka 22.4.2009, 09:32 |
Вот с этого мне и следовало начинать!!!!! ![]() uniq_id в таблице имело тип varchar(10), а генерируемый и затем используемый везде uniq_id имеет гораздо большую длину! Поэтому при первом внесении данных в базу "отрезался" хвост строки, поэтому и select ничего не выдал. Поменял длину на varchar(50) - сразу всё заработало! Спасибо за помощь! ![]() |