За последние 24 часа нас посетили 49268 программистов и 1758 роботов. Сейчас ищут 669 программистов ...

Помогите разобраться с isset() и дублем строк

Тема в разделе "PHP для новичков", создана пользователем paqwerty, 20 сен 2012.

  1. paqwerty

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

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    Все привет!

    С php работаю посредственно, поэтому много еще не умею или не понимаю.

    У меня есть задача записать в бд данные, данная таблица имеет 2 поля - optionID и categoryID. Оба поля могут повторяться сколько угодно раз, но мне надо запретить повтор строки. Для этого я перед записью в таблицу делаю выборку строк для проверки, код ниже:

    Код (Text):
    1.  
    2. $sql_3 = mysql_query("SELECT optionID, categoryID FROM table WHERE optionID = '19' AND categoryID = '111'");
    3.     while ($sql_data_3 = mysql_fetch_array($sql_3)) {
    4.         if (isset($sql_data_3)) {
    5.             echo $sql_data_3["optionID"];
    6.             echo "good<br>";
    7.         }
    8.         else {
    9.             echo "bad<br>";
    10.         }
    11.     }
    В таблице есть строка optionID = 19 categoryID = 556, т.е. выше написанный код должен вывести "bad", но ничего не выводит, а если в запросе categoryID исправить на 556, то мне покажет "good" .

    Помогите разобраться в этом вопросе...
     
  2. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Посмотри, что приходит в $sql_data_3.

    Попробуй сделай так:

    Код (PHP):
    1. $sql_3=mysql_query("SELECT `optionID`,`categoryID` FROM `table` WHERE `optionID`='19' AND `categoryID`='111'");
    2. while($sql_data_3=mysql_fetch_assoc($sql_3)) {
    3.     var_dump($sql_data_3);
    4. } 
    Что вывидит?
     
  3. paqwerty

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

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    Your, спасибо что попогаешь!

    Я попробовал, если в запросе задать условие поиска, которое существует, то выводит массив со значениями, а если задать несуществующий параметр, то пусто, т.е. ничего не выводит...
     
  4. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    это конечно метод, но ЛУЧШЕ (безопаснее, надежнее, быстрее) наложить ограничение на таблицу чтобы повтор строки в принципе не был возможен. надо объявить уникальный индекс по двум полям. тогда "нечаяный" insert просто ничего не добавит.

    Добавлено спустя 6 минут 18 секунд:
    по сути вопроса:
    isset($sql_data_3) означает "переменная $sql_data_3 существует". т.е. в вашем контексте это условие выполняется всегда
     
  5. paqwerty

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

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    artoodetoo, правильно я понимаю, если я сделаю оба поля уникальными, то ситуация будет выглядеть так:

    Такое будет разрешено:
    Код (Text):
    1. <table>
    2.    optionID   categoryID
    3.    10            5
    4.    4              8
    5.    10            13
    6.    4              13
    Такое будет запрещено:
    Код (Text):
    1. <table>
    2.    optionID   categoryID
    3.    10            5
    4.    4              8
    5.    10            5
    6.    4              8
     
  6. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    вы всё верно поняли про уникальность.

    если цель узнать существует ли запись с определенными полями, то достаточно вот такой конструкции:
    Код (PHP):
    1. $result = mysql_query("SELECT 1 FROM table WHERE optionID = '19' AND categoryID = '111'");
    2. if (mysql_num_rows($result))
    3.     echo 'YES';
    4. else
    5.     echo 'NO';
    6.  
    mysql_num_rows() возвращает количество строк, которые вернет SELECT. т.е. вместо того, чтобы крутить цикл и прочитывать все строки достаточно просто узнать будет ли хоть одна строка, я так понимаю ваши желания )))

    если mysql_num_rows() вернет 0, то условие не выполнится (0 неявно приводится к значению FALSE)
     
  7. paqwerty

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

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    про код спасибо большое, работает, а вот про уникальность я все таки не правильно понял.

    Допустим таблица пустая и я делаю вставку:

    Код (Text):
    1. INSERT INTO table (optionID, categoryID) VALUES ('10', '5');
    Вставилось нормально. Но если я сделаю вставку такую:

    Код (Text):
    1. INSERT INTO table (optionID, categoryID) VALUES ('10', '6');
    Мне ругается на то, что optionID = '10' уже есть

    А мне надо сделать уникальную строку из двух полей, а не поля по отдельности, т.к. одному значению categoryID может соответствовать несколько значений optionID.
     
  8. uorypm

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

    С нами с:
    3 мар 2012
    Сообщения:
    98
    Симпатии:
    0
    paqwerty, покажите код создания таблицы.
    Вам же ясно написали - уникальный индекс по двум полям, а не два уникальных индекса.
    в CREATE DEFINITIONS надо указать PRIMARY KEY(и тут через запятую перечислить поля/столбцы).

    P.S. Чтобы не было лишних вопросов - CREATE DEFINITIONS, грубо говоря, место между скобками после конструкции CREATE TABLE table:
    CREATE TABLE table (!!!ТУТ!!!)
     
  9. paqwerty

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

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    ALTER TABLE sc_goup_product_options ADD UNIQUE(`optionID`,`categoryID`);

    СПАСИБО, разобрался, просто у меня была уже таблица и я через пхпмайадмин изменил поля на уникальные, а потом удалил таблицу, создал заново и запустил код

    Код (Text):
    1. ALTER TABLE table ADD UNIQUE(`optionID`,`categoryID`);
    и все заработало как надо.

    СПАСИБО ВСЕМ еще раз!!
     
  10. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    есть "он дупликейт кей - апдейт" синтаксис.