Страница 1 из 2

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

Добавлено: 19 дек 2010, 15:41
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);        }    }}
Но этот код не выполняется. Я пробовал исправить эту проблему, но ничего пока не вышло. Можете посоветовать мне что-то, буду очень признателен.

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

Добавлено: 19 дек 2010, 16:09
Александр
Про else слышал? Может логично использовать?

Строка 35

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

$query = 'NSERT INTO `
INSERT.
Код не проверял, эту ошибку просто заметил. Может есть и другие.

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

Добавлено: 19 дек 2010, 16:19
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";}?>

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

Добавлено: 19 дек 2010, 16:30
Александр
Замени

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

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

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

$sql = mysql_query($query);
И с помощью Charles посмотри, что возвращает сервер.

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

Добавлено: 19 дек 2010, 16:57
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/ 

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

Добавлено: 19 дек 2010, 17:41
Александр
Nick Lisogor
Как это исправить не знаю. Попробуй поискать решение или какой-то другой сниффер.
Можешь выводить в приложении то что возвращает сервер. Можешь подправить php скрипт, подставив данные, чтобы увидеть что он возвращает. Без этого сложно точно сказать где может быть ошибка.

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

Добавлено: 19 дек 2010, 17:47
Nick Lisogor
Я пробовал возвратить данные из запроса SELECT `total_points` FROM `'.$table_name.'` WHERE `uid`='.$viewer_id.' , в итоге получал 0. Хотя таблица не была пустой.

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

Добавлено: 19 дек 2010, 17:58
Александр
Сделай echo сформировавшегося sql запроса и попробуй выполнить его через phpMyAdmin.

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

Добавлено: 19 дек 2010, 18:20
Nick Lisogor
Все запросы отлично работают, только вот ошибку выдавало вот сдесь:

$latest_points = mysql_result($get_points);

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

$latest_points = @mysql_result($get_points);

и ошибок больше не возникало, но код все равно не работает. Точнее он работает на половину: передает в БД очки в первый раз(INSERT INTO ...), но в следующий(UPDATE ...) раз очки он уже не передает.

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

Добавлено: 19 дек 2010, 18:26
Александр
Так ошибку то какую выдавало? Её надо исправить, а не скрыть. Символ @ - только скрывает ошибки, а не исправляет их.