SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 06.05.2010 21:43:06

iSheeZ
Участник
Зарегистрирован: 06.05.2010
Сообщений: 3

Проблемы с ON DUPLICATE KEY UPDATE

Доброго времени суток!

Я занимаюсь разработкой софта под iPhone и до вчерашнего дня с MySQL работать не приходилось. Сейчас у меня в проекте есть программа, для которой пришлось писать часть выполняемую на сервере. Ближе к делу:

На сервер шлются запросы содержащие определенные значения, в моем случае это имя пользователя, идентификатор девайся и количество набранных очков, запрос в виде: http://....../put_score.php?secret=some_secret&udid=номер девайся&name=имя&score=количество очков

Код этого файла внизу поста, как можно увидеть, проблема в добавлении результатов. При посылке запроса в базу добавляется новая строка при любом значении, мне же необходимо что бы значение score добавлялось/менялось, при совпадении имени и номера девайса. Т.е. нужно: Если один и тот же юзер шлет несколько результатов с разным score (uuid и name одинаковые) то была бы только одна строка в базе принадлежащая ему, а ее  значение score менялось на новое.

Я пробовал много разных вариантов , но лучшее чего добился это:


    $sql = mysql_query("INSERT INTO $table (udid, name, score)
        VALUES ('$udid','$name','$score')
        ON DUPLICATE KEY UPDATE    udid='$udid', name='$name';"
);

    if($sql) {
        echo "Inserted score $score for $name";
    } else {
        echo "Unable to insert score " . mysql_error();
    }
 


Но при таком запросе все равно идет добавление новой строки в таблицу, а значит я ничего не добился.

Очень надеюсь на вашу помощь т.к. уже второй день не могу справится, проект стоит на месте sad

Код файла:

<?php
    //put_score.php
    /** MySQL database name */
    define('DB_NAME', '');
    /** MySQL database username */
    define('DB_USER', '');
    /** MySQL database password */
    define('DB_PASSWORD', '');
    /** MySQL hostname */
    define('DB_HOST', $_ENV{DATABASE_SERVER});
 
    $table = "KeySpeed";
 
    // Initialization
    $conn = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD);
    mysql_select_db(DB_NAME, $conn);
 
    // Error checking
    if(!$conn) {
        die('Could not connect ' . mysql_error());
    }
 
    if($_GET['secret'] != "some_secret") {
        die('Nothing to see here...');
    }
 
    // Localize the GET variables
    $udid   = isset($_GET['udid']) ? $_GET['udid'] : "";
    $name   = isset($_GET['name']) ? $_GET['name']  : "";
    $score  = isset($_GET['score']) ? $_GET['score'] : "";
 
    // Protect against sql injections
    $udid  = mysql_real_escape_string($udid);
    $name  = mysql_real_escape_string($name);
    $score = mysql_real_escape_string($score);
   
    // Insert the score
    $retval = mysql_query("INSERT INTO $table(
            udid,
            name,
            score
        ) VALUES (
            '$udid',
            '$name',
            '$score'
        )"
,$conn);
 
    if($retval) {
        echo "Inserted score $score for $name";
    } else {
        echo "Unable to insert score " . mysql_error();
    }

    mysql_close($conn);
?>
 

Неактивен

 

#2 06.05.2010 22:48:16

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Проблемы с ON DUPLICATE KEY UPDATE

В случае с ON DUPLICATE KEY «одинаковость» строки определяется уникальным
ключом — он у Вас есть?

Неактивен

 

#3 07.05.2010 09:34:12

iSheeZ
Участник
Зарегистрирован: 06.05.2010
Сообщений: 3

Re: Проблемы с ON DUPLICATE KEY UPDATE

Спасибо за ответ!
Если я правильно понял, то да, такой ключ есть, даже два! Это udid и name, но даже если юзер сменит имя, то udid он не изменит при всем своем желании, это аппаратная часть девайса.

Отредактированно iSheeZ (07.05.2010 09:34:52)

Неактивен

 

#4 07.05.2010 18:17:37

iSheeZ
Участник
Зарегистрирован: 06.05.2010
Сообщений: 3

Re: Проблемы с ON DUPLICATE KEY UPDATE

paulus Однако вашим вопросом Вы мне очень помогли!

Наконец-то нашел решение! Действительно, была проблема в уникальном ключе! Я не рассматривал этот вариант из-за того, что таблица создавалась совершенно другим файлом, теперь же все работает! Если у Вас есть iPod Touch/iPhone и аккаунт US App Store могу предложить, в знак моей благодарности, промо коды к моим программам или же добавить ваш девайс в список девелопера и вы сможете тестировать новую 4 прошивку smile

Неактивен

 

#5 08.05.2010 13:25:30

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Проблемы с ON DUPLICATE KEY UPDATE

К сожалению, нету, но спасибо за предложение smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson