#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 в запросе.