2017-07-12 7 views
0

私は、この問題に関して遭遇したコードのほとんどすべてを試しました。android(PHP)を使用してMySQLデータベースに接続するにはどうしたらいいですか?

私は以下のサンプルコードを残します。

//select.php 
     <?php 
$host='127.0.0.1'; 
$uname='root'; 
$pwd=''; 
$db="android"; 
$id=$_REQUEST['id']; 
$con = mysql_connect($host,$uname,$pwd) or die("connection failed"); 
$sqlString = "select * from sample where id='$id' "; 
$rs = mysql_query($sqlString); 
if($rs){ 
while($objRs = mysql_fetch_assoc($rs)){ 
$output[] = $objRs; } 
echo json_encode($output); } 
mysql_close($con); 
?> 

//主な活動

 @Override 
     public void onClick(View v) { 

     id=e_id.getText().toString(); 
     select(); 
     } 
     }); 
     } 

     public void select() { 
     ArrayList<NameValuePair> nameValuePairs = new 
     ArrayList<NameValuePair>(); 
     nameValuePairs.add(new BasicNameValuePair("id",id)); 

     try 
     { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("http://10.0.2.2/select.php"); 
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
     HttpResponse response = httpclient.execute(httppost); 
     HttpEntity entity = response.getEntity(); 
     is = entity.getContent(); 
     Log.e("pass 1", "connection success "); 
     } 
     catch(Exception e) 
     { 
     Log.e("Fail 1", e.toString()); 
     Toast.makeText(getApplicationContext(), "Invalid IP Address", 
     Toast.LENGTH_LONG).show(); 
     } 

     try 
     { 
     BufferedReader reader = new BufferedReader 
     (new InputStreamReader(is,"iso-8859-1"),8); 
     StringBuilder sb = new StringBuilder(); 
     while ((line = reader.readLine()) != null) 
     { 
     sb.append(line + "\n"); 
     } 
     is.close(); 
     result = sb.toString(); 
     Log.e("pass 2", "connection success "); 
     } 
     catch(Exception e) 
     { 
     Log.e("Fail 2", e.toString()); 
     } 

     try 
     { 
     JSONObject json_data = new JSONObject(result); 
     name=(json_data.getString("name")); 
     Toast.makeText(getBaseContext(), "Name : "+name, 
     Toast.LENGTH_SHORT).show(); 
     } 
     catch(Exception e) 
     { 
     Log.e("Fail 3", e.toString()); 
     }  }} 

私がこれを書きました。

<uses-permission android:name="android.permission.INTERNET"/> 

// logcat

E/Fail 1: android.os.NetworkOnMainThreadException 
E/Fail 2: java.lang.NullPointerException: lock == null 
E/Fail 3: java.lang.NullPointerException 

私はINVALID IP ADDRESSエラーを取得するアプリケーションを実行しようとします。 私はいくつかの提案が必要です。 android(PHP)を使用してMySQLデータベースに接続するにはどうすればよいですか?

+0

AsyncTaskを使用して、ネットワーク呼び出しを作成します。 –

+0

mysqlを使用しないでください。廃止予定です。あなたはmysqliを使うべきです - http://be2.php.net/manual/en/book.mysqli.php – user2508811

答えて

0

メインスレッドでネットワーク操作を呼び出していることが明白に示されているため、それが機能していません。ネットワーク操作に非同期タスクを使用すると、動作します。メインスレッド上のAPIレベル11アンドロイド制限ネットワーク操作から、これを行うとメインスレッド例外でエラーネットワークがスローされます。そしてあなたは同じ例外を得ています。

0

@Developer_vaibhavあなたが言ったようにしてみましたが、もう一度エラーが発生しました。 user2508811 @
mainactivity.class

public static final String USER_NAME = "USERNAME"; 

String username; 
String password; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    editTextUserName = (EditText) findViewById(R.id.editTextUserName); 
    editTextPassword = (EditText) findViewById(R.id.editTextPassword); 

} 
public void invokeLogin(View view){ 
    username = editTextUserName.getText().toString(); 
    password = editTextPassword.getText().toString(); 

    login(username,password); 

} 

private void login(final String username, String password) { 

    class LoginAsync extends AsyncTask<String, Void, String>{ 

     private Dialog loadingDialog; 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      loadingDialog = ProgressDialog.show(MainActivity.this, "Please wait", "Loading..."); 
     } 

     @Override 
     protected String doInBackground(String... params) { 
      String uname = params[0]; 
      String pass = params[1]; 

      InputStream is = null; 
      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
      nameValuePairs.add(new BasicNameValuePair("username", uname)); 
      nameValuePairs.add(new BasicNameValuePair("password", pass)); 
      String result = null; 

      try{ 
       HttpClient httpClient = new DefaultHttpClient(); 
       HttpPost httpPost = new HttpPost(
         "http://10.0.2.2/login.php"); 
       httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

       HttpResponse response = httpClient.execute(httpPost); 

       HttpEntity entity = response.getEntity(); 

       is = entity.getContent(); 

       BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), 8); 
       StringBuilder sb = new StringBuilder(); 

       String line = null; 
       while ((line = reader.readLine()) != null) 
       { 
        sb.append(line + "\n"); 
       } 
       result = sb.toString(); 
      } catch (ClientProtocolException e) { 
       e.printStackTrace(); 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return result; 
     } 

     @Override 
     protected void onPostExecute(String result){ 
      String s = result.trim(); 
      loadingDialog.dismiss(); 
      if(s.equalsIgnoreCase("success")){ 
       Intent intent = new Intent(MainActivity.this, Main2Activity.class); 
       intent.putExtra(USER_NAME, username); 
       finish(); 
       startActivity(intent); 
      }else { 
       Toast.makeText(getApplicationContext(), "Invalid User Name or Password", Toast.LENGTH_LONG).show(); 
      } 
     } 
    } 

    LoginAsync la = new LoginAsync(); 
    la.execute(username, password); 

} 


@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); 
} 

私はmysqliのを使用。 //login.php

<?php 
    define('HOST','localhost'); 
    define('USER','root'); 
    define('PASS','root1234'); 
    define('DB','database'); 

    $con = mysqli_connect(HOST,USER,PASS,DB); 

    $username = $_POST['username']; 
    $password = $_POST['password']; 

    $sql = "select * from users where username='$username' and 
    password='$password'"; 

    $res = mysqli_query($con,$sql); 

    $check = mysqli_fetch_array($res); 

    if(isset($check)){ 
    echo 'success'; 
    }else{ 
    echo 'failure'; 
    } 

    mysqli_close($con); 
    ?> 

// logcat

FATAL EXCEPTION: main 

java.lang.NullPointerException 
MainActivity$1LoginAsync.onPostExecute(MainActivity.java:118) 
MainActivity$1LoginAsync.onPostExecute(MainActivity.java:64) 
at android.os.AsyncTask.finish(AsyncTask.java:631) 
at android.os.AsyncTask.access$600(AsyncTask.java:177) 
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:176) 
at android.app.ActivityThread.main(ActivityThread.java:5319) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
at dalvik.system.NativeStart.main(Native Method) 

私はエミュレータ上でアプリケーションを実行すると、私はボタンをクリックしたときに、私は、アプリケーションを停止し、エラーを取得します。

0

クラス内メソッドですか?ああ、神様。分離された.javaファイルでasynctaskを作成し、 "new LoginAsync()。execute();"

+0

これは質問に対する答えを賞賛するものではなく、コメントでなければなりません。 [コメントはいつですか](https://stackoverflow.com/help/privileges/comment)をご覧ください。 十分な[評判](https://stackoverflow.com/help/whats-reputation)があれば、投稿に[comment](https://stackoverflow.com/help/privileges/comment)することができます。代わりに、[質問者からの明確化を必要としない回答を提供する](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- i-do-代わりに)。 – Dwhitz

+0

@ axmed2004 私は不在の間違いをしました。気づいてくれてありがとう。 –

関連する問題