За последние 24 часа нас посетили 34100 программистов и 1314 роботов. Сейчас ищут 992 программиста ...

UPDATE выполняется при любом WHERE

Тема в разделе "MySQL", создана пользователем Epsilon, 18 янв 2013.

  1. Epsilon

    Epsilon Активный пользователь

    С нами с:
    9 ноя 2012
    Сообщения:
    11
    Симпатии:
    0
    Столкнулся с проблемой. В следующем коде UPDATE в mysql_query при любых значениях $n и $p возвращает TRUE.
    Код (Text):
    1.  
    2. <?php
    3.     //БД создаётся и заполняется нормально
    4.     $Connection = mysql_connect("localhost", "root");
    5.     mysql_query("DROP DATABASE `bd`", $Connection);
    6.     mysql_query("CREATE DATABASE `bd`", $Connection);
    7.     mysql_select_db("bd", $Connection);
    8.     mysql_query("CREATE TABLE `table` (`name` TINYBLOB, `password` TINYBLOB, `key` TINYBLOB)");
    9.     mysql_query("INSERT INTO `table` VALUES ('Tester', 'Test', 'TestAccessKey')", $Connection);
    10.  
    11.     $n = "n"; $p = "p";
    12.  
    13.     //А вот тут UPDATE всегда выдаёт TRUE
    14.     if (mysql_query("UPDATE `table` SET `key` = '10' WHERE `name`= '$n' AND `password` = '$p'", $Connection) ){
    15.         print ":)";
    16.     } else {
    17.         print ":(";
    18.     }
    19. ?>
    Если убрать одинарные прямые кавычки (') вокруг $n и $p, то всегда выдаёт FALSE. Даже в таком случае:
    Код (Text):
    1. mysql_query("UPDATE table SET key = 10 WHERE name= Tester AND password = Test", $Connection)
    В чём проблема? Почему результат не зависит от значений $n и $p?
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    FALSE говорит о синтаксических ошибках, конечно кавычки здесь нужны ))))
    TRUE говорит о правильности синтаксиса, но как вы убедились, не значит, что подходящие записи найдены и изменены. Для этого нужно использовать mysql_affected_rows

    Добавлено спустя 4 минуты 8 секунд:
    А зачем вам всякий раз делать DROP и CREATE DATABASE ??? жестоко просто жуть!
    Хотите удалить данные в таблице - используйте truncate table, вся структура сохранится, только таблицы будут пустыми.
     
  3. Epsilon

    Epsilon Активный пользователь

    С нами с:
    9 ноя 2012
    Сообщения:
    11
    Симпатии:
    0
    Нет, проблема в другом: результат UPDATE не зависит от значений аргументов ($n и $p) вообще!

    Добавлено спустя 2 минуты 37 секунд:
    Это чтобы показать, что база данных создаётся с нуля, и что проблема в коде никак с ней не связана.
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    результат update это состояние данных в таблице, а не true или false в php-срипте. вы делаете неправильные выводы из собственных ошибок.

    Добавлено спустя 1 минуту 58 секунд:
    ну чтобы "показать", сделайте реально печать данных из таблицы, это будет настоящий РЕЗУЛЬТАТ
     
  5. Epsilon

    Epsilon Активный пользователь

    С нами с:
    9 ноя 2012
    Сообщения:
    11
    Симпатии:
    0
    Всё, допёр. Спасибо.
    Надо было не
    Код (Text):
    1. if (mysql_query("UPDATE `table` SET `key` = '10' WHERE `name`= '$n' AND `password` = '$p'", $Connection) ){
    а
    Код (Text):
    1. if (mysql_query("UPDATE `table` SET `key` = '10' WHERE `name`= '$n' AND `password` = '$p'", $Connection) && mysql_affected_rows($Connection) ){
    (при условии, что key будет каждый раз не совпадать с заменяемым значеним)

    P.S.: Просто не хотелось обходить таблицу 2 раза (вначале искать игрока с такими именем и паролем, а потом уже менять ему код доступа на свежесгенерированный), а сделать всё за раз (мол, если игрок с таким именем и паролем обновится, то выдать ему новый код, иначе - такой игрок не найден).

    Добавлено спустя 8 минут 22 секунды:
    Ладно, вот более точная формулировка проблемы:
    "Нет, проблема в другом: результат возвращемый mysql_query после выполнения запроса UPDATE не зависит от значений аргументов ($n и $p) вообще!"

    Напечатать единственную тестовую запись? Мне кажется и так всё видно.