将 Android 应用程序连接到外部数据库 (phpmyadmin)
Posted
技术标签:
【中文标题】将 Android 应用程序连接到外部数据库 (phpmyadmin)【英文标题】:Connect Android app to external Database (phpmyadmin) 【发布时间】:2013-11-15 06:59:27 【问题描述】:我正在尝试将我的 android 应用程序连接到外部数据库。 我在 ftp 服务器上有一些 php 脚本,它们为我的数据库提供了一些功能。 在我的 phpmyadmin 数据库中,我有一个表“用户”。 当我尝试插入一个新用户时,我的 android 应用程序访问了我的 php 脚本,但是“mysql_query”总是返回 false,并且该用户没有出现在我在线数据库的表中。 在我的 ftp 站点中,我有一个 index.php 文件和一个文件夹“include”。在这个文件夹中,我有三个带有函数和参数的文件:config.php、db_connect.php、db_function.php。
可能错误很愚蠢,但我是 php 新手。 谢谢大家。
这是我的 java 代码: 我使用 registerUser 使用 getjsonfromurl 插入用户
private static String loginURL = "php_script_adress_on_ftp";
private static String registerURL = "php_script_adress_on_ftp";
private static String login_tag = "login";
private static String register_tag = "register";
public JSONObject registerUser(String name, String email, String password)
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("tag", register_tag));
params.add(new BasicNameValuePair("name", name));
params.add(new BasicNameValuePair("email", email));
params.add(new BasicNameValuePair("password", password));
// getting JSON Object
JSONObject json = jsonParser.getJSONFromUrl(registerURL, params);
// return json
return json;
//就是jsonfromurl函数
public JSONObject getJSONFromUrl(String url, List<NameValuePair> params)
// Making HTTP request
try
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new UrlEncodedFormEntity(params));
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
catch (UnsupportedEncodingException e)
e.printStackTrace();
catch (ClientProtocolException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
try
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
sb.append(line + "\n");
is.close();
json = sb.toString();
Log.e("JSON", json);
catch (Exception e)
Log.e("Buffer Error", "Error converting result " + e.toString());
// try parse the string to a JSON object
try
jObj = new JSONObject(json);
catch (JSONException e)
Log.e("JSON Parser", "Error parsing data " + e.toString());
// return JSON String
return jObj;
这是我从 Android 应用程序调用的 index.php 文件。 $user = $db->storeUser($name, $email, $password);在注册时返回错误号为“1”的错误
<?php
/**
* File to handle all API requests
* Accepts GET and POST
*
* Each request will be identified by TAG
* Response will be JSON data
/**
* check for POST request
*/
if (isset($_POST['tag']) && $_POST['tag'] != '')
// get tag
$tag = $_POST['tag'];
// include db handler
require_once 'include/DB_Functions.php';
$db = new DB_Functions();
// response Array
$response = array("tag" => $tag, "success" => 0, "error" => 0);
// check for tag type
if ($tag == 'login')
// Request type is check Login
$email = $_POST['email'];
$password = $_POST['password'];
// check for user
$user = $db->getUserByEmailAndPassword($email, $password);
if ($user != false)
// user found
// echo json with success = 1
$response["success"] = 1;
$response["uid"] = $user["unique_id"];
$response["user"]["name"] = $user["name"];
$response["user"]["email"] = $user["email"];
$response["user"]["created_at"] = $user["created_at"];
$response["user"]["updated_at"] = $user["updated_at"];
echo json_encode($response);
else
// user not found
// echo json with error = 1
$response["error"] = 1;
$response["error_msg"] = "Incorrect email or password!";
echo json_encode($response);
else
if ($tag == 'register')
// Request type is Register new user
$name = $_POST['name'];
$email = $_POST['email'];
$password = $_POST['password'];
// check if user is already existed
if ($db->isUserExisted($email))
// user is already existed - error response
$response["error"] = 2;
$response["error_msg"] = "User already existed";
echo json_encode($response);
else
// store user
$user = $db->storeUser($name, $email, $password);
if ($user)
// user stored successfully
$response["success"] = 1;
$response["uid"] = $user["unique_id"];
$response["user"]["name"] = $user["name"];
$response["user"]["email"] = $user["email"];
$response["user"]["created_at"] = $user["created_at"];
$response["user"]["updated_at"] = $user["updated_at"];
echo json_encode($response);
else
// user failed to store
$response["error"] = 1;
$response["error_msg"] = "Error occured in Registration";
echo json_encode($response);
else
echo "Invalid Request";
else
echo "Access Denied";
?>
这是我的 config.php。以这种方式指定主机是否正确?我也试过http
<?php
/**
* Database config variables
*/
define("DB_HOST", "sql3.freemysqlhosting.net");
define("DB_USER", "my_user");
define("DB_PASSWORD", "my_psw");
define("DB_DATABASE", "mydb_name");
?>
这里是connect_db.php
<?php
class DB_Connect
// constructor
function __construct()
// destructor
function __destruct()
// $this->close();
// Connecting to database
public function connect()
require_once 'include/config.php';
// connecting to mysql
$con = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
// selecting database
mysql_select_db(DB_DATABASE);
// return database handler
return $con;
// Closing database connection
public function close()
mysql_close();
?>
这里是 db_functions.php
<?php
class DB_Functions
private $db;
//put your code here
// constructor
function __construct()
require_once 'DB_Connect.php';
// connecting to database
$this->db = new DB_Connect();
$this->db->connect();
// destructor
function __destruct()
/**
* Storing new user
* returns user details
*/
public function storeUser($name, $email, $password)
$uuid = uniqid('', true);
$hash = $this->hashSSHA($password);
$encrypted_password = $hash["encrypted"]; // encrypted password
$salt = $hash["salt"]; // salt
$result = mysql_query("INSERT INTO users(unique_id, name, email, encrypted_password, salt, created_at) VALUES('$uuid', '$name', '$email', '$encrypted_password', '$salt', NOW())");
// check for successful store
if ($result)
// get user details
$uid = mysql_insert_id(); // last inserted id
$result = mysql_query("SELECT * FROM users WHERE uid = $uid");
// return user details
return mysql_fetch_array($result);
else
return false;
/**
* Get user by email and password
*/
public function getUserByEmailAndPassword($email, $password)
$result = mysql_query("SELECT * FROM users WHERE email = '$email'") or die(mysql_error());
// check for result
$no_of_rows = mysql_num_rows($result);
if ($no_of_rows > 0)
$result = mysql_fetch_array($result);
$salt = $result['salt'];
$encrypted_password = $result['encrypted_password'];
$hash = $this->checkhashSSHA($salt, $password);
// check for password equality
if ($encrypted_password == $hash)
// user authentication details are correct
return $result;
else
// user not found
return false;
/**
* Check user is existed or not
*/
public function isUserExisted($email)
$result = mysql_query("SELECT email from users WHERE email = '$email'");
$no_of_rows = mysql_num_rows($result);
if ($no_of_rows > 0)
// user existed
return true;
else
// user not existed
return false;
/**
* Encrypting password
* @param password
* returns salt and encrypted password
*/
public function hashSSHA($password)
$salt = sha1(rand());
$salt = substr($salt, 0, 10);
$encrypted = base64_encode(sha1($password . $salt, true) . $salt);
$hash = array("salt" => $salt, "encrypted" => $encrypted);
return $hash;
/**
* Decrypting password
* @param salt, password
* returns hash string
*/
public function checkhashSSHA($salt, $password)
$hash = base64_encode(sha1($password . $salt, true) . $salt);
return $hash;
?>
编辑:我修改了 db_function.php 以返回 mysql_error 但它什么也不返回
public function storeUser($name, $email, $password,$error)
$uuid = uniqid('', true);
$hash = $this->hashSSHA($password);
$encrypted_password = $hash["encrypted"]; // encrypted password
$salt = $hash["salt"]; // salt
$result = mysqli_query("INSERT INTO users(unique_id, name, email, encrypted_password, salt, created_at) VALUES('$uuid', '$name', '$email', '$encrypted_password', '$salt', NOW())");
// check for successful store
if (!$result)
// get user details
$uid = mysqli_insert_id(); // last inserted id
$result = mysqli_query("SELECT * FROM users WHERE uid = $uid");
// return user details
$error = mysql_error();
return mysql_fetch_array($result);
else
$error = mysql_error();
return false;
我修改了 index.php 以返回 mysql_error …… ....
$user = $db->storeUser($name, $email, $password,$error);
if ($user)
// user stored successfully
$response["success"] = 1;
$response["uid"] = $user["unique_id"];
$response["user"]["name"] = $user["name"];
$response["user"]["email"] = $user["email"];
$response["user"]["created_at"] = $user["created_at"];
$response["user"]["updated_at"] = $user["updated_at"];
echo json_encode($response);
else
// user failed to store
$response["error"] = 1;
$response["error_msg"] = $error;
echo json_encode($response);
... ...
我也使用了 mysqli_query 而不是 mysql_query 但没有任何改变。
解决方案: 我发现 altervista 对我的 HTTP POST 进行了重定向,重定向后它变成了一个没有参数的 HTTP GET。我不知道是什么原因。我有域 .com,但它将请求重定向到 .org。所以我直接向 .org 提出了请求,它开始工作了!
【问题讨论】:
php scripts on a ftp server
我不认为 FTP 服务器可以运行 PHP 文件
感谢您的回答!你确定吗?我必须把我的php文件放在哪里?如果 ftp 服务器无法运行 php 文件,为什么它会在 index.php 文件中返回“错误”字符串?
我想你是用 FTP 上传到网络服务器的?在 Web 服务器(如 Apache)上,PHP 将运行。
尝试在方法storeUser()
的末尾输出mysql_error()
。我不知道你的代码在哪里失败。也许添加一些输出,这样你就可以看到,在 if 子句等中将采用哪些分支。
顺便说一句:mysql_* 函数已弃用。切换到 mysqli_* 或 PDO
【参考方案1】:
解决方案:我发现 altervista 对我的 HTTP POST 进行了重定向,并且在重定向后它变成了没有参数的 HTTP GET。我不知道是什么原因。我有域 .com,但它将请求重定向到 .org。所以我直接向 .org 提出了请求,它开始工作了!
【讨论】:
以上是关于将 Android 应用程序连接到外部数据库 (phpmyadmin)的主要内容,如果未能解决你的问题,请参考以下文章
带有外部 GPS 的自定义定位服务通过 android things 连接到 Raspberry Pi
将外部 mysql 数据库连接到 django 应用程序并查询它