Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Update в таблице InnoDB, обновление записи в MySQL через PHP 
V
    Опции темы
Nitronka
Дата 21.4.2009, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 16.4.2008
Где: Казань

Репутация: нет
Всего: нет



База данных bank создана с помощью phpMyAdmin 2.6.1. MySQL 5.0.45 Apache/2.2.4
В базе таблица users имеет тип InnoDB.
При первоначальном внесении новой записи выполняется следующий запрос:
Код

$r = @mysql_query("INSERT INTO users VALUES(NULL,'".$first_name."','".$last_name."','".strtolower($login)."','".md5($pass)."','".$email."','".$uniq_id."',0,'".date("dmY")."','".date("dmY")."')");

где:
Код

$first_name=$_POST['first_name'];
$last_name=$_POST['last_name'];
$login = $_POST['login'];
$pass = $_POST['pass'];
$email = $_POST['email'];
$uniq_id = md5($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'].mktime());

Значение 0 в запросе имеет тот смысл, что пока пользователь не активирует свой аккаунт через отправленное ему письмо, содержащее $uniq_id, 
значение поля status в таблице users сохраняется равным нулю.После активации необходимо изменить это значение на 1.
Делается это следующим образом:
Код

<?
    //Активация пользователя
    if($_GET['activation'] AND $_GET['activation']!='')
    {
    $uniq_id = $_GET['activation'];
    $r = mysql_query("SELECT * FROM `users` WHERE `uniq_id`='".$uniq_id."' AND `status`=1 ");
    if(mysql_num_rows($r)!=0) {
    echo '<h3>Ваша запись уже активирована.</h3>';
    }
    else
    {
    //Создаем запрос
    $sql="UPDATE users SET `status`=1 WHERE (uniq_id='".$uniq_id."' AND status=0)";
    $result = mysql_query($sql,$con);
    var_dump($sql);
    if($result)
    { echo '<h3>Ваша учетная запись активирована.</h3>'; }
    }
    }
    ?>

Несмотря на то, что после работы сценария выдаётся:
Ваша учетная запись активирована.
Обновление в таблице не происходит, как был ноль в status, так он и остаётся.
Более того, при попытке намеренно заново активировать аккаунт,где status я сделал =1 через этот же запрос Update только средствами phpMyAdmin, всеравно выводится:
Ваша учетная запись активирована.
а по логике должно быть:
Ваша учетная запись уже активирована.
Не понимаю,что происходит,где что не так сделал????!

PM MAIL   Вверх
Kirsan
Дата 21.4.2009, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 4.11.2008
Где: г.Волжский, Волго градская обл.

Репутация: нет
Всего: 1



Попробуйте в консоли выполнить UPDATE-запрос. Вероятно, вернётся какая-либо ошибка или что-то в этом роде. Тогда более понятны станут причины странного поведения скрипта.
p.s. в таком виде этот скрипт позволит злоумышленникам удалить всю таблицу с пользавателями в считанные минуты. НИКОГДА нельзя данные из массивов $_GET и $_POST направлять сразу в запрос. В них может храниться что угодно, в том числе и SQL-инъекции.
PM ICQ   Вверх
Nitronka
Дата 21.4.2009, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 16.4.2008
Где: Казань

Репутация: нет
Всего: нет



Цитата(Kirsan @  21.4.2009,  22:25 Найти цитируемый пост)
Попробуйте в консоли выполнить UPDATE-запрос

У меня стоит Denwer, поэтому я не совсем понимаю как вызвать консоль MySQL
Спасибо за совет! В принципе я не передаю данные напрямую, просто здесь я привёл упрощённый вариант скрипта, опустив проверку посредством регул-выражений.
честно говоря,над защитой я пока основательно не думал - надо решить вопрос с регистрацией.
есть предположение,что это связано с типом таблицы InnoDB (мне необходима поддержка транзакций), и вследствии этого не сохраняются изменения.
PM MAIL   Вверх
Kirsan
Дата 21.4.2009, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 4.11.2008
Где: г.Волжский, Волго градская обл.

Репутация: нет
Всего: 1



Консоль доступна и в phpMyAdmin (см. скриншот).
В скрипте закомментируйте строку
Код

$result = mysql_query($sql,$con);

а то, что напечатает var_dump($sql), скопируйте в phpMyAdmin туда, где указано на скриншоте. Там же выполните запрос и посмотрите, что вернётся.


Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  pma.JPG 31,79 Kb
PM ICQ   Вверх
Nitronka
Дата 21.4.2009, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 16.4.2008
Где: Казань

Репутация: нет
Всего: нет



Вот что напечатал var_dump($sql):
Код

 string(91) "UPDATE users SET `status`=1 WHERE (uniq_id='68042cfef052c4c1f5cf348764a65e51' AND status=0)

а вот что вернул запрос в phpMyAdmin:

Затронутые ряды: 0 (Запрос занял 0.0009 сек) 
SQL-запрос: 
UPDATE users SET `status` =1 WHERE (
uniq_id = '68042cfef052c4c1f5cf348764a65e51' AND STATUS =0
)

без изменений...
PM MAIL   Вверх
Kirsan
Дата 22.4.2009, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 4.11.2008
Где: г.Волжский, Волго градская обл.

Репутация: нет
Всего: 1



Затронутые ряды: 0 
Значит не обновилась ни одна строка.
Попробуйте там же выполнить запрос 
Код

SELECT * FROM users WHERE (uniq_id='68042cfef052c4c1f5cf348764a65e51' AND status=0)

Если ничего не вернёт, то значит что-то с WHERE частью запроса. Сверяйте то, что запрашивается с тем, что в базе.


Это сообщение отредактировал(а) Kirsan - 22.4.2009, 00:05
PM ICQ   Вверх
Nitronka
Дата 22.4.2009, 09:32 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 16.4.2008
Где: Казань

Репутация: нет
Всего: нет



Цитата(Kirsan @  22.4.2009,  00:03 Найти цитируемый пост)
Сверяйте то, что запрашивается с тем, что в базе.

Вот с этого мне и следовало начинать!!!!! smile 
uniq_id в таблице имело тип varchar(10), а генерируемый и затем используемый везде uniq_id имеет гораздо большую длину!
Поэтому при первом внесении данных в базу "отрезался" хвост строки, поэтому и select ничего не выдал. Поменял длину на varchar(50) - сразу всё заработало!
Спасибо за помощь! smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0742 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.