2017-09-22 5 views
0

私はデータベースを検索するためにクエリを使用しようとしています。 LIKE検索クエリ。私が 'M'をタイプすると、Max、Matthewなどの名前が検索されます。しかし、実行されると、クエリは何も返されません。私はtry/catch関数ですべてを囲んでおり、使用できる整数をエコーし​​て正しく動作しますが、コードが実際に行ったことを実際に行ったほうがはるかに好きです。私はこれを手にしながら、MySqliを使ってPDOに移行しようとしました。Android/php:PDOを使用して「LIKE」を使用した結果セットを取得し、JSONを解析する

誰かがこれに間違っていることが分かる場合は、躊躇しないでください。

サーバー側のスクリプトは以下の通りです:

if(!empty($_POST['name'])){ 

$host = 
$db = 
$user = 
$password = 
$charset = 

$dsn = 'mysql:host=localhost;dbname=dbname'; 
$opt = [ 
    PDO::ATTR_ERRMODE   => PDO::ERRMODE_EXCEPTION, 
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 
    PDO::ATTR_EMULATE_PREPARES => false, 
]; 

$pdo = new PDO($dsn,$user,$password,$opt); 

$response = array(); 

$name = $_POST['name']; 

$query = "SELECT user_id, name, email FROM users WHERE name LIKE ?"; 

try { 
$stmt = $pdo->prepare("SELECT user_id, name, email FROM users WHERE name LIKE ?"); 
$stmt->execute([$name]); 
$result = $stmt->fetch(); 
} catch (Exception $e) { 
    echo "99"; //Statement failed 
} 



if ($result !== false) { 
    foreach($result as $row) { 
     echo json_encode($row['user_id']); 
     echo json_encode($row['name']); 
     echo json_encode($row['email']); 
} 
} else { 
    echo '2'; //Empty result 
} 


$dsn = null; 

} else { 
    echo "3"; //No search entry 
} 

AndroidStudioから関連するコードは次のとおりです。私は実際にアプリに渡されたいくつかの有用なデータを得ることができたら

@Override 
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
final String name = searchInput.getText().toString(); 

Response.Listener<String> responseListener = new Response.Listener<String>() { 
    @Override 
    public void onResponse(String response) { 
     try { 

      System.out.println(response); 
      System.out.println(name); 

      if(response != null) { 
       System.out.println("Statement executed"); 
      } else if (Integer.parseInt(response) == 2) { 
       System.out.println("Statement executed, but result invalid"); 
       Toast.makeText(getApplicationContext(), "No results found", Toast.LENGTH_SHORT).show(); 
      } else if (Integer.parseInt(response) == 3) { 
       System.out.println("Search field empty"); 
       Toast.makeText(getApplicationContext(), "No search entry", Toast.LENGTH_SHORT).show(); 
      } else if (Integer.parseInt(response) == 99) { 
       System.out.println("Failed to execute"); 
       Toast.makeText(getApplicationContext(), "Statement failure", Toast.LENGTH_SHORT).show(); 
      } else { 

       JSONArray jsonResponse = new JSONArray(response); 

      } 


     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
}; 

PopupContactRequest AddContactRequest = new PopupContactRequest(name, responseListener); 
RequestQueue queue = Volley.newRequestQueue(PopupAddContact.this); 
queue.add(AddContactRequest); 

} 

、私は」ユーザーが適切な人を選択できるように、検索提案型のリストビューにそれを設定するのが好きです。誰もがこれを行う方法を知っている場合、私はこれで得ることができるすべてのヘルプが必要なので、コメントやメッセージとして私を追加すること自由に感じる!

乾杯、 J

答えて

1

あなたは文字列の先頭と一致するデータが欲しいあなたが知っておく必要があり、機能LIKE文を持っているために、エンド

try { 
$stmt = $pdo->prepare("SELECT user_id, name, email FROM users WHERE name LIKE ?"); 
$name = $name."%"; // add this line 
$stmt->execute([$name]); 
$result = $stmt->fetch(); 
} catch (Exception $e) { 
    echo "99"; //Statement failed 
} 
+0

これはうまくいった、あなたは伝説です、ありがとう! – JSteward

2

%を追加するために持っているようでので、そのあなたはmysqlにワイルドカードとしての初回署名を追加する必要があります。

これは名前はこれは、いくつかの場所

でこれは "M" を含む名前を取得します "M"

SELECT user_id, name, email FROM users WHERE name LIKE '%M' 

で終わる名前を取得します

SELECT user_id, name, email FROM users WHERE name LIKE 'M%' 

"M" とstartigれます

SELECT user_id, name, email FROM users WHERE name LIKE '%M%'  
+0

準備ができていないにもかかわらず、準備済みのステートメントでこれを動作させることができませんでした。まだ+1の価値がある! – JSteward

関連する問題