Использование php для передачи данных с Android в mysql

#php #android #mysql #database

#php #Android #mysql #База данных

Вопрос:

Я пытался отправить данные gps из моего приложения для Android в базу данных mysql, используя php, но я не уверен, что все настроено правильно, потому что я вижу через logcat, что данные отправляются с Android, но их просто не засасывает база данных.

Помимо некоторых рекомендаций, есть ли в каком-либо органе какие-либо руководства, которые конкретно показывали бы код php для сервера.

Также возможно ли просто отправить данные прямо в базу данных без чего-то вроде php? Я так не думаю, но я должен был спросить.

вот php, который я использую с адресами и прочим, удаленным по понятным причинам.

 <html>
<head>
<title>Send and Rec data to Android Device</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">


</head>


<body>


<?php
//include("dbinfo.php");



///the stuff pointing to my db has been removed for obvious ///reasons ;)


mysql_connect($hostname,$username,$password) or die ("<html><script           
language='JavaScript'>alert('Unable to connect to database! Please try again later.'),history.go(-                
1)     </script></html>");


mysql_select_db($dbname);


// variables coming from Android  app on phone
$id = $_POST["id"];


$lat = $_POST["lat"]; // If data is in DB line 1 (public key), but the publicly displayed PHP is     
not showing data then we know that we aren't really talking to line 1

$lng = $_POST["lng"];


$alt = $_POST["alt"];


$spd = $_POST["spd"];


$acc = $_POST["acc"];


$last_gps = $_POST["lastgps"];


//filler will contain reference to graphic or audio upload directory
$filler = $_POST["filler"];


$lastid = mysql_query("select MAX(id) as maxid from samplemarks");
$row = mysql_fetch_array($lastid);


$nextid = $row[maxid]   1;


echo "Inserting at next id = ".$nextid."<br />";


if ($lat == "") 

{
 echo "Invalid entry, latitude cannot be blank";

}

  else {
  $query2 = mysql_query("INSERT INTO samplemarks VALUES($nextid,'$lat',     
  $lng,'$alt','$spd','$acc','$last_gps','$filler')");

  mysql_query($query2);


mysql_close();


}
?>


</body>


</html>
  

Комментарии:

1. все, что вам нужно для работы вашей базы данных devzone.zend.com/node/view/id/641

2. Моя база данных уже работает и в ней хранятся данные, но по какой-то причине я не могу опубликовать в ней новые данные

Ответ №1:

У вас возникнут проблемы с запуском вашего кода или исправленного кода, потому что вы передаете результат из первого mysql_query() в качестве параметра второму mysql_query(), который не будет работать. Для выполнения SQL достаточно первого mysql_query, взгляните наhttp://php.net/mysql_query вот несколько хороших примеров кода. Вам также не нужен параметр $ conn, если вы имеете дело только с одним соединением mysql_connect(), поскольку PHP предположит, что вы хотите использовать самое последнее открытое соединение, если вы его не укажете.

Кроме того, убедитесь, что вы провели хорошее исследование атак с использованием SQL-инъекций в PHP, особенно статью на сайте PHP по адресуhttp://php.net/manual/en/security.database.sql-injection.php — очень важно защитить ваши SQL-запросы, когда они зависят от пользовательского ввода.

Если у вас возникли проблемы, верните его к основам. Используйте print_r ($ _POST), чтобы увидеть, чем заполняется текст вашего POST, и попробуйте несколько простых инструкций mysql_query(), чтобы проверить, что ваше подключение к базе данных работает правильно.

Комментарии:

1. В будущем я планирую добавить различные формы безопасности, но пока я просто пытаюсь свести все воедино 🙂 Я не был уверен, нужен ли мне второй mysql_query, но между мной и другими ребятами, работающими над нашим проектом, был консенсус в том, что это было необходимо …… но, возможно, это не так: p Я попробую это с out и переорганизую свой код, который я обновлю через некоторое время. Я дам всем здесь знать, как это получается

2. Дело не столько в том, нужно это или нет, просто это не сработает; mysql_query() возвращает либо ресурс PHP, либо логическое значение, ни одно из которых mysql_query() не принимает в качестве параметра для своего запроса. Ваш первый mysql_query() вернет либо true, либо false, поскольку это оператор INSERT, который будет соответствовать строке «1» или «», когда вы передадите его в качестве параметра запроса второму mysql_query()

3. Я просмотрел код, который я разместил здесь с моим приятелем, и мы действительно обнаружили небольшую синтаксическую ошибку в одном из наших объявлений: p Код на самом деле работает так, как есть, даже если это не самый чистый или наилучший метод. Я, наконец, получил данные для публикации в таблице на сервере. Однако я обязательно рассмотрю ваши предложения с другими программистами, с которыми я работаю, и удостоверюсь, что то, что у нас есть, будет работать абсолютно гладко во время запуска продукта 🙂

4. Первый запрос не нужен, если поле настроено как автоматическое увеличение, как я указал в тексте моего ответа.

5. Если в этом нет особой необходимости (и если это просто для того, чтобы получить самый высокий идентификатор и добавить тот, который не является веской причиной), вы просто тратите процессор / время. Позвольте серверу базы данных обрабатывать это за вас автоматически. [извините за двойной комментарий, он научит меня ходить за кофе]

Ответ №2:

В вашем mysql_query отсутствует параметр connection. Когда вы выполняете подключение, сохраните его в переменной, например

 $conn =  mysql_connect($hostname,$username,$password) or die('Blah');

if ($conn) {

    mysql_select_db("mydatabasename", $conn);

   // extract your data
   if (isset($_POST["id"]) amp;amp; isset($_POST['lat']) amp;amp; isset($_POST['lng']) {

           $id = $_POST['id'];
           $lat = $_POST['lat'];
           $lng = $_POST['lng'];

           // add the rest of the POST fields so the query below works
           // unless you need a specific $nextid make the field auto increment in the
           // database and user '' instead of $nextid.  

   $query2 = "INSERT INTO samplemarks VALUES($nextid,'$lat',     
     '$lng','$alt','$spd','$acc','$last_gps','$filler')";

    if (mysql_query($query2, $conn))
        echo "data inserted';
    else
        echo "Oh dear ".  mysql_error() ;


       // etc
  }  // end the isset tests
}
  

Также $ lng не указан в вашем коде.

Я понимаю, что вы отправляете данные из своего приложения Android на свой сервер php / db, но вы всегда должны проверять данные из post на работоспособность, иначе вы облегчаете кому-либо использование sql-инъекционных атак для компрометации вашей базы данных. Подумайте о защите вашего php с помощью ssl и имени пользователя / пароля

Комментарии:

1. Привет, спасибо за помощь, нечеткий. Где у вас есть //extract ваши данные в примере кода, вы имеете в виду извлечение данных из потока, который я только что отправил, или вы говорите об извлечении их из существующего значения в моей базе данных? Просто немного запутался, так как это мой первый раз, когда я действительно подключаю Android к php к базе данных 🙂

2. Да, я просто вырезал это, потому что я ленивый 😉 — вероятно, вам также следует использовать isset, чтобы вы не получали ошибок, когда данные не передаются. например, if (isset($_POST[‘id’]) $id = $_POST[‘id’]; — не забудьте инициализировать и другие ваши переменные. Отредактирую ответ, чтобы уточнить.

3. Эй, большое спасибо, чувак, когда я вернусь к своему компьютеру, я обязательно добавлю материал, который ты показал мне в своем примере, на мою страницу php. При использовании isset проверяет ли он данные по существующим данным в таблице или что-то в этом роде?

4. Если я сделаю: isset($myvariable) Я проверяю, имеет ли $ myvariable значение (установлено), поэтому для того, что вы хотите, это способ проверить, опубликовало ли ваше приложение для Android (например, $ _POST [‘lat’]) значение с именем ‘lat’.

5. Отрицательный отзыв, этот код небезопасен , и вводимые пользователем данные не экранируются . Также параметр connection не имеет ничего общего с тем, что исходный код не работает, PHP всегда использует последнее соединение. Исходный код не работал, поскольку OP пытался опубликовать ресурс mysql_query в запросе.