Таблица рекордов(передача данных в БД)

Обсуждение и помощь по вопросам взаимодействия с ВКонтакте API в Flash-приложениях (ActionScript)
Nick Lisogor
FL Team
FL Team
Сообщения: 119
Зарегистрирован: 12 дек 2010, 14:08

Таблица рекордов(передача данных в БД)

Сообщение Nick Lisogor »

Здравствуйте, я попробовал создать php скрипт, который передает очки пользователя в БД.

PHP код:

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

<?php$db_host="localhost";       // хост$db_user="db_user";        // имя пользователя$db_password="db_password";        // пароль$db_name = "db_name ";      // имя БД$table_name = "statictic";       // имя таблицы $app_id = '111111'; // id приложения$api_secret = '11111111111111'; // защищенный ключ приложения $auth_key  = $_POST['auth_key'];$viewer_id = (int)$_POST['viewer_id'];$last_points = (int)$_POST['last_points']; $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'");     //Получаем ID пользователя из БД и его последний рекорд    $get_id_from_db = @mysql_query("SELECT `uid` FROM `'.$table_name.'` WHERE `uid`='.$viewer_id.'");    $get_points = @mysql_query("SELECT `total_points` FROM `'.$table_name.'` WHERE `uid`='.$viewer_id.'");    $latest_points = mysql_result($get_points);     // Если такой пользователь есть в БД и он набрал новый рекорд, то обновляем таблицу    if(@mysql_num_rows($get_id_from_db)==1){      if($last_points>$latest_points){        $query = 'UPDATE `'.$table_name.'` SET `total_points` = '.$last_points.' WHERE `uid` = '.$viewer_id.';';      }    }     // В ином случае регистрируем нового пользователя и задаем ему количество набранных очков    if(@mysql_num_rows($get_id_from_db)!=1){      $query = 'NSERT INTO `'.$table_name.'` (`uid`, `total_points`) VALUES ("'.$viewer_id.'","'.$last_points.'");';    }    $sql = @mysql_query($query);    echo "OK";}?>
Код запроса в БД:

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

CREATE TABLE IF NOT EXISTS `statistic` (  `id` int(9) auto_increment,  `uid` int(9),  `last_points` int(10),  PRIMARY KEY  (`id`),  UNIQUE KEY `uid` (`uid`)) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
Код ActionScript:

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

package {    import flash.net.*;    import flash.display.*;     public class Test extends Sprite {        public function Test ():void {            var stat_loader:URLLoader = new URLLoader();            var stat_request:URLRequest=new URLRequest("http://адрес_php_кода/statistic.php");            stat_request.method=URLRequestMethod.POST;            var stat_vars:URLVariables = new URLVariables();            stat_vars['auth_key']=LoaderInfo(root.loaderInfo).parameters.auth_key;            stat_vars['viewer_id']=LoaderInfo(root.loaderInfo).parameters.viewer_id;            stat_vars['last_points']=некая_переменная_с_конечными_очками;            stat_request.data=stat_vars;            stat_loader.load(stat_request);        }    }}
Но этот код не выполняется. Я пробовал исправить эту проблему, но ничего пока не вышло. Можете посоветовать мне что-то, буду очень признателен.
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: Таблица рекордов(передача данных в БД)

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

Про else слышал? Может логично использовать?

Строка 35

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

$query = 'NSERT INTO `
INSERT.
Код не проверял, эту ошибку просто заметил. Может есть и другие.
Nick Lisogor
FL Team
FL Team
Сообщения: 119
Зарегистрирован: 12 дек 2010, 14:08

Re: Таблица рекордов(передача данных в БД)

Сообщение Nick Lisogor »

Немного изменил код, заменив второе условие на else и исправил грамматическую ошибку запроса, но это все равно не помогло.
Вот новый php код:

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

<?php$db_host="localhost";       // хост$db_user="db_user";        // имя пользователя$db_password="db_password";        // пароль$db_name = "db_name ";      // имя БД$table_name = "statictic";       // имя таблицы $app_id = '111111'; // id приложения$api_secret = '11111111111111'; // защищенный ключ приложения $auth_key  = $_POST['auth_key'];$viewer_id = (int)$_POST['viewer_id'];$last_points = (int)$_POST['last_points']; $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'");     //Получаем ID пользователя из БД и его последний рекорд    $get_id_from_db = @mysql_query("SELECT `uid` FROM `'.$table_name.'` WHERE `uid`='.$viewer_id.'");    $get_points = @mysql_query("SELECT `total_points` FROM `'.$table_name.'` WHERE `uid`='.$viewer_id.'");    $latest_points = mysql_result($get_points);     // Если такой пользователь есть в БД и он набрал новый рекорд, то обновляем таблицу    if(@mysql_num_rows($get_id_from_db)==1){      if($last_points>$latest_points){        $query = 'UPDATE `'.$table_name.'` SET `total_points` = '.$last_points.' WHERE `uid` = '.$viewer_id.';';      }    }    // В ином случае регистрируем нового пользователя и задаем ему количество набранных очков    else{      $query = 'INSERT INTO `'.$table_name.'` (`uid`, `total_points`) VALUES ("'.$viewer_id.'","'.$last_points.'");';    }    $sql = @mysql_query($query);    echo "OK";}?>
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: Таблица рекордов(передача данных в БД)

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

Замени

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

$sql = @mysql_query($query);
на

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

$sql = mysql_query($query);
И с помощью Charles посмотри, что возвращает сервер.
Nick Lisogor
FL Team
FL Team
Сообщения: 119
Зарегистрирован: 12 дек 2010, 14:08

Re: Таблица рекордов(передача данных в БД)

Сообщение Nick Lisogor »

Вот то, что вернул браузер. Видимо Charles что-то не хватает, java у меня установлена, браузер Firefox, плагин для Charles установлен.

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

Charles Error ReportFailure Invalid argument: connect The actual exception reported was: java.net.SocketException: Invalid argument: connect Charles Proxy, http://www.charlesproxy.com/ 
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: Таблица рекордов(передача данных в БД)

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

Nick Lisogor
Как это исправить не знаю. Попробуй поискать решение или какой-то другой сниффер.
Можешь выводить в приложении то что возвращает сервер. Можешь подправить php скрипт, подставив данные, чтобы увидеть что он возвращает. Без этого сложно точно сказать где может быть ошибка.
Nick Lisogor
FL Team
FL Team
Сообщения: 119
Зарегистрирован: 12 дек 2010, 14:08

Re: Таблица рекордов(передача данных в БД)

Сообщение Nick Lisogor »

Я пробовал возвратить данные из запроса SELECT `total_points` FROM `'.$table_name.'` WHERE `uid`='.$viewer_id.' , в итоге получал 0. Хотя таблица не была пустой.
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: Таблица рекордов(передача данных в БД)

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

Сделай echo сформировавшегося sql запроса и попробуй выполнить его через phpMyAdmin.
Nick Lisogor
FL Team
FL Team
Сообщения: 119
Зарегистрирован: 12 дек 2010, 14:08

Re: Таблица рекордов(передача данных в БД)

Сообщение Nick Lisogor »

Все запросы отлично работают, только вот ошибку выдавало вот сдесь:

$latest_points = mysql_result($get_points);

я заменил этот участок на

$latest_points = @mysql_result($get_points);

и ошибок больше не возникало, но код все равно не работает. Точнее он работает на половину: передает в БД очки в первый раз(INSERT INTO ...), но в следующий(UPDATE ...) раз очки он уже не передает.
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: Таблица рекордов(передача данных в БД)

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

Так ошибку то какую выдавало? Её надо исправить, а не скрыть. Символ @ - только скрывает ошибки, а не исправляет их.
Ответить