Повторение

Программирование, которое не связано с API.
Ответить
Аватара пользователя
112
Модератор
Модератор
Сообщения: 2215
Зарегистрирован: 02 фев 2010, 21:53

Повторение

Сообщение 112 »

3 день пытаюсь разобраться,но ничего не понимаю...

Код: Выделить всё

<?php$db_host="*";       $db_user="*";       $db_password="*";       $db_name = "*";     $table_name = "online";      $name = $_POST['name'];      mysql_connect($db_host, $db_user, $db_password) or die (mysql_error());    mysql_select_db($db_name) or die (mysql_error());    mysql_query("SET NAMES 'utf8'");  $query = 'INSERT INTO `'.$table_name.'` (`name`,`last_date`) VALUES ("'.$name.'","'.time().'")';    $sql = @mysql_query($query);    echo "OK"; ?>
Вот мой код все работает,но попытался сделать чтоб если в базе уже есть такая запись ,то обновляло время.
Попробовал как тут,но что то не получилось.

Код: Выделить всё

 <?php$db_host="*";      $db_user="*";      $db_password="*";      $db_name = "*";    $table_name = "online";      $name = $_POST['name'];     mysql_connect($db_host, $db_user, $db_password) or die (mysql_error());    mysql_select_db($db_name) or die (mysql_error());    mysql_query("SET NAMES 'utf8'");  $query = 'INSERT INTO `'.$table_name.'` (`name`,`last_date`) VALUES ("'.$name.'","'.time().'") ON DUPLICATE KEY UPDATE  `visits` = (`visits`+1), `last_date`="'.time().'";'    $sql = @mysql_query($query);    echo "OK"; ?> 
Но оно тупа возвращает OK и продолжает добавлять в базу такие же записи а не обновлять старые.Может у кого нибудь найдеться решение?
Аватара пользователя
bodnar
Модератор
Модератор
Сообщения: 1399
Зарегистрирован: 03 апр 2010, 06:41

Re: Повторение

Сообщение bodnar »

У тебя ключ то установлен?
Аватара пользователя
112
Модератор
Модератор
Сообщения: 2215
Зарегистрирован: 02 фев 2010, 21:53

Re: Повторение

Сообщение 112 »

Нет не установлен
Аватара пользователя
bodnar
Модератор
Модератор
Сообщения: 1399
Зарегистрирован: 03 апр 2010, 06:41

Re: Повторение

Сообщение bodnar »

ON DUPLICATE KEY UPDATE в художественно переводе значит "если совпадает запись по ключу то не новую вставлять а обновить"
Так если у тебя ключ не задан чего ты хочешь?
Аватара пользователя
112
Модератор
Модератор
Сообщения: 2215
Зарегистрирован: 02 фев 2010, 21:53

Re: Повторение

Сообщение 112 »

Код: Выделить всё

 <?php$db_host="*";      $db_user="*";      $db_password="*";      $db_name = "*";    $table_name = "online";      $name = $_POST['name'];     mysql_connect($db_host, $db_user, $db_password) or die (mysql_error());    mysql_select_db($db_name) or die (mysql_error());    mysql_query("SET NAMES 'utf8'");  $query = 'INSERT INTO `'.$table_name.'` (`name`,`last_date`) VALUES ("'.$name.'","'.time().'") ON DUPLICATE .$name. UPDATE  `visits` = (`visits`+1), `last_date`="'.time().'";'    $sql = @mysql_query($query);    echo "OK"; ?> 
Так тоже кстати не работает(Куча способов перепробывал=(

Код: Выделить всё

 <?php$db_host="*";      $db_user="*";      $db_password="*";      $db_name = "*";    $table_name = "online";      $name = $_POST['name'];     mysql_connect($db_host, $db_user, $db_password) or die (mysql_error());    mysql_select_db($db_name) or die (mysql_error());    mysql_query("SET NAMES 'utf8'");  $query = 'INSERT INTO `'.$table_name.'` (`name`,`last_date`) VALUES ("'.$name.'","'.time().'") ON DUPLICATE `name` UPDATE  `visits` = (`visits`+1), `last_date`="'.time().'";'    $sql = @mysql_query($query);    echo "OK"; ?> 
Аватара пользователя
bodnar
Модератор
Модератор
Сообщения: 1399
Зарегистрирован: 03 апр 2010, 06:41

Re: Повторение

Сообщение bodnar »

у тебя в таблице какому нибудь полю должен быть задан уникальный ключ
ON DUPLICATE KEY UPDATE это цельная комманда которая для удобства чтения пишется через пробел, ты же не пишешь вместо trace traнепонятныебуквыce?
Аватара пользователя
112
Модератор
Модератор
Сообщения: 2215
Зарегистрирован: 02 фев 2010, 21:53

Re: Повторение

Сообщение 112 »

Код: Выделить всё

CREATE TABLE IF NOT EXISTS `online` (  `id` int(9) auto_increment,  `uid` int(9),   `TEXT` TEXT NOT NULL,  `last_date` int(10),  `visits` int(9) default '1',  PRIMARY KEY  (`id`),  UNIQUE KEY `uid` (`uid`)) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
Тут вроде KEY использую

Код: Выделить всё

<?php// данные доступа Рє базе данных$db_host="localhost";       // обычно РЅРµ нужно изменять$db_user="1";        // РёРјСЏ пользователя БД$db_password="1";        // пароль БД$db_name = "1";      // РёРјСЏ БД      // РёРјСЏ БД$table_name = "online";       // РёРјСЏ таблицы статистики. Если РІС‹ РЅРµ меняли его РІ запросе, создающем БД, то Рё здесь менять его РЅРµ надо$name = $_POST['name'];     mysql_connect($db_host, $db_user, $db_password) or die (mysql_error());    mysql_select_db($db_name) or die (mysql_error());    mysql_query("SET NAMES 'utf8'");     // Выполняем запрос: если пользователя с таким id ещё нет в БД, то добавляем, если есть, то обновляем запись, прибавляя одно посещение (`visits` = (`visits`+1))    $query = 'INSERT INTO `'.$table_name.'` (`text`, `last_date`) VALUES ("'.$name.'","'.time().'") ON DUPLICATE KEY UPDATE  `visits` = (`visits`+1), `last_date`="'.time().'";';    $sql = mysql_query($query);    echo "OK";?> 
Но все равно дублируется(
В принципе я понял в чем ошибка.У меня stat.php передается в переменной NAME текст,и в бд NAME добавляется как TEXT,а надо чтоб оно добавлялось как UID ,а как UID оно не будет добавляться т.к UID не задан как TEXT NOT NULL,а задать его как TEXT NOT NULL не получается потому что выдает ошибку.Теперь ломаю голову над тем как задать ТЕХТ TEXT NOT NULL и чтоб оно осталось UNIQUE KEY.
Делаю так

Код: Выделить всё

CREATE TABLE IF NOT EXISTS `online` (  `id` int(9) auto_increment,  `uid`TEXT NOT NULL ,  `last_date` int(10),  `visits` int(9) default '1',  PRIMARY KEY  (`id`),  UNIQUE KEY `uid` (`uid`)) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
Аватара пользователя
112
Модератор
Модератор
Сообщения: 2215
Зарегистрирован: 02 фев 2010, 21:53

Re: Повторение

Сообщение 112 »

Все что описано сверху у меня получилось проделать=)
Теперь малость по другому пытаюсь сделать и опять ...
Хотел сделать чтоб выводилось фраза DUBL если такая запись уже есть в базе

Код: Выделить всё

<?php// данные доступа к базе данных$db_host="localhost";       // обычно не нужно изменять$db_user="user";        // имя пользователя БД$db_password="pass";        // пароль БД$db_name = "name";      // имя БД$table_name = "stat";       // имя таблицы статистики. Если вы не меняли его в запросе, создающем БД, то и здесь менять его не надо // данные приложения$app_id = '743131'; // id приложения$api_secret = 'qwertyuiopasdfghjklzxcvbnm'; // защищенный ключ приложения  $auth_key  = $_POST['auth_key'];$viewer_id = $_POST['viewer_id']; $real_key = md5($app_id."_".$viewer_id."_".$api_secret);if ($auth_key == $real_key){    // соединение с БД    mysql_connect($db_host, $db_user, $db_password) or die (mysql_error());    mysql_select_db($db_name) or die (mysql_error());    mysql_query("SET NAMES 'utf8'");     $query = 'INSERT INTO `'.$table_name.'` (`uid`, `last_date`) VALUES ("'.$viewer_id.'","'.time().'") ON DUPLICATE KEY echo"dubl";';    $sql = mysql_query($query);    echo "OK";}else{echo"anti"}?>
Но все время выводиться ОК и никакие записи не добавляются,что делать?(
P.s посоветуйте пжл книги по пхп или вот справочники вроде такого ,но для пхп
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: Повторение

Сообщение Александр »

112
Может быть поможет функция mysql_info() или mysql_affected_rows()...
Можешь просто разделить запрос на 2 мелких, первым выбирай значение из базы, и в зависимости от этого либо выполняй запрос на добавление, либо выводи DUBL.
Аватара пользователя
112
Модератор
Модератор
Сообщения: 2215
Зарегистрирован: 02 фев 2010, 21:53

Re: Повторение

Сообщение 112 »

:geek: Решил проблему с помощью mysql_error( ) 8-)
Ответить