将 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 应用程序并查询它

将外部数据库连接到 Rails 4 应用程序时出错

如何将 Docker 内部的 Spring Boot 应用程序连接到 PostgreSQL 外部

从后端连接到外部数据库

将android应用程序连接到mysql数据库