За последние 24 часа нас посетили 16554 программиста и 1553 робота. Сейчас ищут 2044 программиста ...

Проверка существования данных в MySQL.

Тема в разделе "PHP и базы данных", создана пользователем Golishev, 13 ноя 2008.

  1. Golishev

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

    С нами с:
    13 ноя 2008
    Сообщения:
    3
    Симпатии:
    0
    Адрес:
    Питерка
    Подскажите в чем ошибка, не хочет работать скрипт

    $res = mysql_query ("SELECT id FROM dostup WHERE id_acc='$id'",$db);
    if (!$res) {
    mysql_query ("INSERT INTO dostup (ip,putdate,id_acc,browsers,systems) VALUES ('$ip', NOW( ) ,

    '$id', '$browser', '$os')");
    }
    else {
    $myrow_dostup = mysql_fetch_array ($res);
    $id_str = $myrow_dostup ["id"];
    mysql_query ("UPDATE dostup SET ip='$ip', putdate=NOW(), id_acc='$id', browsers='$browser',

    systems='$os' WHERE id='$id_str'");
    }

    если в БД есть запись с необходимым id то все ок запись обновляется. Но если записи нет то новая

    запись не вносится. При этом ни каких ошибок не показывает. Если закоментировать все кроме вставки

    новой запись запись вставляется. Пробовал вызвать вывод ошибки (mysql_error()) ничего не выводит.

    Используется сборка apache2.2.10+php5.2.6+mysql5.0.67+phpmyadmin3.0.1.1
     
  2. Петр

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

    С нами с:
    20 мар 2006
    Сообщения:
    1.253
    Симпатии:
    0
    Адрес:
    Центр Вселенной
    [sql]INSERT mytable SET id = 1, name = 'name' ON DUPLICATE KEY UPDATE name = 'new_name'[/sql]
    Если id - pk
     
  3. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    мб REPLACE?
     
  4. Golishev

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

    С нами с:
    13 ноя 2008
    Сообщения:
    3
    Симпатии:
    0
    Адрес:
    Питерка
    ни фига не вьежаю в этот ON DUPLICATE KEY UPDATE
    "если производится вставка строки, которая вызывает ошибку дублирующегося первичного (PRIMARY) или уникального (UNIQUE) ключа, то вполняется UPDATE старой строки"

    не пойму как формируется последний параметр
    id_acc - поставил как уникальный


    я прописал так:
    INSERT INTO dostup SET (ip,putdate,id_acc,browsers,systems) VALUES ('$ip', NOW( ) , '$id', '$browser', '$os') ON DUPLICATE KEY UPDATE id_acc='$id'
    - не работает

    не понял что значит:
    Если id - pk и мб REPLACE?

    id у меня авто-инкремент и первичный
     
  5. decoder

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

    С нами с:
    11 фев 2006
    Сообщения:
    469
    Симпатии:
    0
    pk = PRIMARY KEY
     
  6. Петр

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

    С нами с:
    20 мар 2006
    Сообщения:
    1.253
    Симпатии:
    0
    Адрес:
    Центр Вселенной
    [sql]mysql> create table test (id int auto_increment primary key, name tinytext) engine = innodb;
    Query OK, 0 rows affected (0.32 sec)

    mysql> desc test;
    +-------+----------+------+-----+---------+----------------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+----------+------+-----+---------+----------------+
    | id | int(11) | NO | PRI | NULL | auto_increment |
    | name | tinytext | YES | | NULL | |
    +-------+----------+------+-----+---------+----------------+
    2 rows in set (0.04 sec)

    mysql> insert test set id = 1, name = 'petruha';
    Query OK, 1 row affected (0.02 sec)

    mysql> select * from test;
    +----+---------+
    | id | name |
    +----+---------+
    | 1 | petruha |
    +----+---------+
    1 row in set (0.00 sec)

    mysql> insert test set id = 1, name = 'Golishev' on duplicate key update name = 'Golishev';
    Query OK, 2 rows affected (0.04 sec)

    mysql> select * from test;
    +----+----------+
    | id | name |
    +----+----------+
    | 1 | Golishev |
    +----+----------+
    1 row in set (0.00 sec)[/sql]
     
  7. Golishev

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

    С нами с:
    13 ноя 2008
    Сообщения:
    3
    Симпатии:
    0
    Адрес:
    Питерка
    Спасибо!
    Теперь разобрался с данным спрособом запроса к базе. Но у меня фишка заключается в следуюшем:
    С использованием данного типа запроса получается, что поле id_acc (идентификатор записи из другой таблици) должен быть уникальным. Но данная таблица нужна для регистрации данных по посетителю, при этом посетитель может быть зарегистрированным на сайте, в связи с чем у него присвоен id_acc (его идентификатор) а может быть и не зарегистрированным и у него нет id_acc и данное поле должно быть пустое (нулевое) и естественно таких записей будет не одна.