如何将SQL连接传递到另一个php

如何将SQL连接传递到另一个php,php,android,mysql,Php,Android,Mysql,我正在尝试制作一个非常基本的android应用程序,可以连接到mysql服务器并进行查询。我已经做了第一页,需要主机,用户,名称和密码。然后,我使用POST方法将这些输入传递给一个php脚本(称为conn.php)。如果建立了mysql连接,将显示一个弹出窗口,显示“成功”,否则将显示错误。现在,我被困在这里。现在我想,一旦我提供了主机、用户名和密码并建立了连接,我也想在另一个php脚本中使用相同的连接,该脚本将对连接进行查询 这是我的conn.php <?php $host

我正在尝试制作一个非常基本的android应用程序,可以连接到mysql服务器并进行查询。我已经做了第一页,需要主机,用户,名称和密码。然后,我使用POST方法将这些输入传递给一个php脚本(称为conn.php)。如果建立了mysql连接,将显示一个弹出窗口,显示“成功”,否则将显示错误。现在,我被困在这里。现在我想,一旦我提供了主机、用户名和密码并建立了连接,我也想在另一个php脚本中使用相同的连接,该脚本将对连接进行查询

这是我的conn.php

<?php   
    $host=$_POST["host"];
    $user=$_POST["user"];
    $pass=$_POST["pass"];
    $sql=new mysqli($host,$user,$pass);
    if($sql->connect_error)
        echo "Failed: ".$sql->connect_error;
    else{
        echo "Success";
    }
?>

这是我的Android任务

class ConnectSqlDb extends AsyncTask<String, Void, String> {
        ProgressDialog waitDialog;
        @Override
        protected void onPreExecute() {
            waitDialog=ProgressDialog.show(MainActivity.this,"Connecting to MySQLServer","Please wait...",true,false);
        }

        @Override
        protected String doInBackground(String... params) {
            URL url=null;
            HttpURLConnection connection=null;
            OutputStream os;
            BufferedWriter writer;
            StringBuilder parameter=new StringBuilder();
            try {
                parameter.append(URLEncoder.encode("host", "UTF-8"));
                parameter.append("=");
                parameter.append(URLEncoder.encode(params[1], "UTF-8"));
                parameter.append("&");

                parameter.append(URLEncoder.encode("user", "UTF-8"));
                parameter.append("=");
                parameter.append(URLEncoder.encode(params[2], "UTF-8"));
                parameter.append("&");

                parameter.append(URLEncoder.encode("pass", "UTF-8"));
                parameter.append("=");
                parameter.append(URLEncoder.encode(params[3], "UTF-8"));
            }catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            try {
                url = new URL(params[0]);
                connection = (HttpURLConnection)url.openConnection();
                connection.setRequestMethod("POST");
                connection.setDoOutput(true);
                os=connection.getOutputStream();
                writer=new BufferedWriter(new OutputStreamWriter(os,"UTF-8"));
                writer.write(parameter.toString());
                writer.flush();
                writer.close();

                BufferedReader br=new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String message=br.readLine();
                br.close();
                return message;
            }catch (MalformedURLException e){
                e.printStackTrace();
                return null;
            }
            catch ( IOException e){
                e.printStackTrace();
                return null;
            }
        }

        @Override
        protected void onPostExecute(String message) {
            waitDialog.dismiss();
            Toast.makeText(MainActivity.this,message,Toast.LENGTH_SHORT).show();

        }
    }
public void connect(View v){
        String server=phpserver.getText().toString();
        String hostname=host.getText().toString();
        String username=user.getText().toString();
        String password=pass.getText().toString();
        new ConnectSqlDb().execute(server,hostname,username,password);

    }
类ConnectSqlDb扩展异步任务{
进展对话;
@凌驾
受保护的void onPreExecute(){
waitDialog=ProgressDialog.show(MainActivity.this,“连接到MySQLServer”,“请稍候…”,true,false);
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
URL=null;
HttpURLConnection=null;
输出流;
缓冲写作者;
StringBuilder参数=新的StringBuilder();
试一试{
parameter.append(URLEncoder.encode(“主机”,“UTF-8”);
参数。追加(“=”);
parameter.append(URLEncoder.encode(params[1],“UTF-8”);
参数。追加(&);
parameter.append(URLEncoder.encode(“用户”、“UTF-8”);
参数。追加(“=”);
parameter.append(URLEncoder.encode(params[2],“UTF-8”);
参数。追加(&);
parameter.append(URLEncoder.encode(“pass”、“UTF-8”);
参数。追加(“=”);
parameter.append(URLEncoder.encode(params[3],“UTF-8”);
}捕获(不支持的编码异常e){
e、 printStackTrace();
}
试一试{
url=新url(参数[0]);
connection=(HttpURLConnection)url.openConnection();
connection.setRequestMethod(“POST”);
connection.setDoOutput(真);
os=connection.getOutputStream();
writer=new BufferedWriter(新的OutputStreamWriter(os,“UTF-8”));
writer.write(parameter.toString());
writer.flush();
writer.close();
BufferedReader br=新的BufferedReader(新的InputStreamReader(connection.getInputStream());
字符串消息=br.readLine();
br.close();
返回消息;
}捕获(格式错误){
e、 printStackTrace();
返回null;
}
捕获(IOE异常){
e、 printStackTrace();
返回null;
}
}
@凌驾
受保护的void onPostExecute(字符串消息){
waitDialog.discouse();
Toast.makeText(MainActivity.this,message,Toast.LENGTH_SHORT).show();
}
}
公共连接(视图五){
String server=phpserver.getText().toString();
字符串hostname=host.getText().toString();
字符串username=user.getText().toString();
字符串密码=pass.getText().toString();
新建ConnectSqlDb().execute(服务器、主机名、用户名、密码);
}

如果我做错了,那么还有什么办法呢?

好的,如果您只需要一个连接,请使用singleton类(参见singleton模式)。 定义一个连接类,如下所示,
DBConnection.php

class DBConnection{
    protected static $db;
    private function __construct() {
        try {
            $host:"myhost";
            $user:"myuser";
            $pass:"mypass";
            self::$db = $sql=new mysqli($host,$user,$pass);
        }
        catch (Exception $e) {
            //..........
        }
    }
    public static function getInstance() {
        if (!self::$db) {
            new DBConnection();
        }
        return self::$db;
    }

    public function __destruct() {
        $db=NULL;
    }
}
注意:在PHP中,创建此类对象,并在创建此类对象时将从POST获得的值传递给此类。 在PHP文件中,执行类似于
conn.php

include "DBConnection.php";
//$host=$_POST["host"];
//$user=$_POST["user"];
//$pass=$_POST["pass"];
//$db = new DBConnection($host,$user,$pass);
$db = new DBConnection();
$connection = $db->getInstance();

是否要确保只有一个DB连接?我的意思是你想确保在运行多个php和多个查询时只建立一个连接???是的。一旦建立,我只想使用一个连接。我希望这个连接在另一个php文件中可用,我可以在其中进行查询,这样一旦建立连接,我就不再需要那些变量$host、$user、$pass。假设我想显示数据库列表,稍后我将创建表并使用它们。我怎样才能做到呢?好的,你们明白了,等等,你们可以在php端使这些变量保持静态。现在让我看一看类中的代码,连接凭证是静态的,现在您可以使用相同的代码将该类中的连接实例获取到任何PHP文件和列表数据库中。您可以将凭据定义为类成员变量并使用$this关键字。我可以在php类中使用POST方法从用户端获取连接凭据吗?我想从用户端得到这些凭证。不,你怎么能,你需要调用一些从android到PHP类的方法。因此,要使用post,您需要将构造函数或任何其他setter方法传递给连接类。在类中定义成员属性,并使用setter方法设置凭据,然后使用这些成员变量来获取连接。我需要考虑你的要求,根据你的要求得到更好的解决方案。