2016-08-25 175 views
-3

我无法在我的服务器上输入数据 我正在使用wampp服务器,每次运行我的项目和输入数据时,我总是得到以下错误server connection failedandroid studio - 登录注册php mysql(服务器连接失败)

有人可以帮我解决这个问题吗?

下面是我的代码:

public class MainActivity extends ActionBarActivity { 

protected EditText username; 
private EditText password; 
protected String enteredUsername; 
private final String serverUrl = "url server"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    username = (EditText)findViewById(R.id.username_field); 
    password = (EditText)findViewById(R.id.password_field); 
    Button loginButton = (Button)findViewById(R.id.login); 
    Button registerButton = (Button)findViewById(R.id.register_button); 

    loginButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      enteredUsername = username.getText().toString(); 
      String enteredPassword = password.getText().toString(); 

      if(enteredUsername.equals("") || enteredPassword.equals("")){ 
       Toast.makeText(MainActivity.this, "Username or password must be filled", Toast.LENGTH_LONG).show(); 
       return; 
      } 
      if(enteredUsername.length() <= 1 || enteredPassword.length() <= 1){ 
       Toast.makeText(MainActivity.this, "Username or password length must be greater than one", Toast.LENGTH_LONG).show(); 
       return; 
      } 
      // request authentication with remote server4 
      AsyncDataClass asyncRequestObject = new AsyncDataClass(); 
      asyncRequestObject.execute(serverUrl, enteredUsername, enteredPassword); 
     } 
    }); 

    registerButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(MainActivity.this, RegisterActivity.class); 
      startActivity(intent); 
     } 
    }); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

private class AsyncDataClass extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... params) { 

     HttpParams httpParameters = new BasicHttpParams(); 
     HttpConnectionParams.setConnectionTimeout(httpParameters, 5000); 
     HttpConnectionParams.setSoTimeout(httpParameters, 5000); 

     HttpClient httpClient = new DefaultHttpClient(httpParameters); 
     HttpPost httpPost = new HttpPost(params[0]); 

     String jsonResult = ""; 
     try { 
      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
      nameValuePairs.add(new BasicNameValuePair("username", params[1])); 
      nameValuePairs.add(new BasicNameValuePair("password", params[2])); 
      httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      HttpResponse response = httpClient.execute(httpPost); 
      jsonResult = inputStreamToString(response.getEntity().getContent()).toString(); 

     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return jsonResult; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     System.out.println("Resulted Value: " + result); 
     if(result.equals("") || result == null){ 
      Toast.makeText(MainActivity.this, "Server connection failed", Toast.LENGTH_LONG).show(); 
      return; 
     } 
     int jsonResult = returnParsedJsonObject(result); 
     if(jsonResult == 0){ 
      Toast.makeText(MainActivity.this, "Invalid username or password", Toast.LENGTH_LONG).show(); 
      return; 
     } 
     if(jsonResult == 1){ 
      Intent intent = new Intent(MainActivity.this, LoginActivity.class); 
      intent.putExtra("USERNAME", enteredUsername); 
      intent.putExtra("MESSAGE", "You have been successfully login"); 
      startActivity(intent); 
     } 
    } 
    private StringBuilder inputStreamToString(InputStream is) { 
     String rLine = ""; 
     StringBuilder answer = new StringBuilder(); 
     BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
     try { 
      while ((rLine = br.readLine()) != null) { 
       answer.append(rLine); 
      } 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return answer; 
    } 
} 
private int returnParsedJsonObject(String result){ 

    JSONObject resultObject = null; 
    int returnedResult = 0; 
    try { 
     resultObject = new JSONObject(result); 
     returnedResult = resultObject.getInt("success"); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    return returnedResult; 
} 
} 

user.php的

<?php 

include_once 'db.php'; 

class User{ 

    private $db; 
    private $db_table = "users"; 

    public function __construct(){ 
     $this->db = new DbConnect(); 
    } 

    public function isLoginExist($username, $password){  

     $query = "select * from " . $this->db_table . " where username = '$username' AND password = '$password' Limit 1"; 
     $result = mysqli_query($this->db->getDb(), $query); 
     if(mysqli_num_rows($result) > 0){ 
      mysqli_close($this->db->getDb()); 
      return true; 
     }  
     mysqli_close($this->db->getDb()); 
     return false;  
    } 

    public function createNewRegisterUser($username, $password, $email){ 

     $query = "insert into users (username, password, email, created_at, updated_at) values ('$username', '$password', '$email', NOW(), NOW())"; 
     $inserted = mysqli_query($this->db->getDb(), $query); 
     if($inserted == 1){ 
      $json['success'] = 1;         
     }else{ 
      $json['success'] = 0; 
     } 
     mysqli_close($this->db->getDb()); 
     return $json; 
    } 

    public function loginUsers($username, $password){ 

     $json = array(); 
     $canUserLogin = $this->isLoginExist($username, $password); 
     if($canUserLogin){ 
      $json['success'] = 1; 
     }else{ 
      $json['success'] = 0; 
     } 
     return $json; 
    } 

} 
?> 

的index.php

<?php 

require_once 'androidlogin/user.php'; 

$username = ""; 
$password = ""; 
$email = ""; 
echo "hello"; 
if(isset($_POST['username'])){ 
    $username = $_POST['username']; 
} 
if(isset($_POST['password'])){ 
    $password = $_POST['password']; 
} 
if(isset($_POST['email'])){ 
    $email = $_POST['email']; 
} 

// Instance of a User class 
$userObject = new User(); 

// Registration of new user 
if(!empty($username) && !empty($password) && !empty($email)){ 
    $hashed_password = md5($password); 
    $json_registration = $userObject->createNewRegisterUser($username, $hashed_password, $email); 

    echo json_encode($json_registration); 
} 

// User Login 
if(!empty($username) && !empty($password) && empty($email)){ 
    $hashed_password = md5($password); 
    $json_array = $userObject->loginUsers($username, $hashed_password); 

    echo json_encode($json_array); 
} 

?> 

db.php

<?php 
include_once 'config.php'; 

class DbConnect{ 


    private $connect; 


    public function __construct(){ 

     $this->connect = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); 

     if (mysqli_connect_errno($this->connect)) 
     { 
      echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
     } 
    } 

    public function getDb(){ 

     return $this->connect; 
    } 

} 

回答

0

这很简单。您不能使用wamp服务器,因为PHP文件不会暴露给Web。从更简单的意义上讲,您编码的PHP文件只能在您的PC /笔记本电脑上使用,并且无法通过移动应用程序访问。如果您正在使用模拟器进行调试,则可能可以进行连接,但是一旦将您的应用程序安装在实际设备上,就不会连接到服务器。

我建议您选择以下在线托管服务之一并上传您在WAMP中创建的文件和数据库。您将需要明显更改从上面发布的代码连接到的IP地址。这将让您连接到服务器并成功登录。有几个免费的托管服务,其中大部分有99%的正常运行时间。所以你不会有任何连接问题。此类托管服务由awardspace,freewebhostingeu或000webhost提供。这些都可以帮助你完成工作。

改变你可以暴露你的PHP文件到网络,以便它可以从您的设备访问。如果安装了IIS,则可以将网站内容复制到C:\inetpub\www文件夹中。这会将您的网站公开(将其提供给网站)给任何知道该网址的人。您也可以使用this tutorial来帮助您。这个选项是一个更高级的选项,但如果您面临挑战,它将帮助您了解如何发布网站。

我在通过PHP返回响应时在代码中发现了一个问题。您的代码将返回org.json.JSONException。这是因为从PHP脚本返回的值不是有效的JSON格式。 (这只是返回你好)因此,在index.php文件,修改的新用户代码的注册过程是这样:

if(!empty($username) && !empty($password) && !empty($email)){ 
    $hashed_password = md5($password); 
    $json_registration = $userObject->createNewRegisterUser($username, $hashed_password, $email); 
    if ($json_registration) { 

      $response["error"] = FALSE; 
      $response["user"]["name"] = $json_registration["username"]; 
      $response["user"]["email"] = $json_registration["email"]; 

      echo json_encode($response); 
     } else { 

      $response["error"] = TRUE; 
      $response["error_msg"] = "Unknown error occurred in registration!"; 
      echo json_encode($response); 
     } 
} 

这从数据库返回应用程式返回的实际数据。

你需要做同样的登录脚本:

if(!empty($username) && !empty($password) && empty($email)){ 
    $hashed_password = md5($password); 
    $json_login = $userObject->loginUsers($username, $hashed_password); 

    if ($json_login) { 
     $response["error"] = FALSE; 
     $response["uid"] = $user["unique_id"]; 
     $response["user"]["name"] = $json_login["Username"]; 
     $response["user"]["email"] = $json_login["email"]; 
     echo json_encode($response); 
    } else { 
     $response["error"] = TRUE; 
     $response["error_msg"] = "Login credentials are wrong. Please try again!"; 
     echo json_encode($response); 
    } 

} 

我,也可以推荐一些改动你的代码风格,做一个整洁的项目。

  • 使用不同的文件名不是index.php,只是因为这是 边的默认着陆页。例如,我宁愿将它重命名为 Register.php
  • 拿走代码从index.php文件登录并将其添加到 单独的文件,称为Login.php。不要忘记,您需要在此脚本中调用 连接字符串和User.php类,以确保它连接到正确的数据库。

希望这有助于:)

+0

谢谢你回答我的问题,先生,我会尝试你的建议:) – indodev28

+0

我已经上传到主机,现在的问题每次我总是注册显示无效的用户名或密码或电子邮件。请帮我先生:( – indodev28

+0

请问您可以在这里包括你的PHP代码吗? –