2017-12-17 9 views
-1

何か変なことが起こっています。私はそれにして今のとhtmlページを持っているmysqli_multi_query配列の問題

table name: dm 
|id|receiver|sender|msg   | 
|1 |John |Emma |Hey John! | 
|2 |Emma |John |Hey!   | 
|3 |John |Emma |Whats up  | 
|4 |Emma |John |Not too much | 
|5 |John |Keira |Have you got...| 

私がしたいことはどちらか

  1. エマはジョンに送信されたメッセージを次のとおりです。 私はこのような何かを見ることができる私のデータベースを持っています=>受信= "ジョン"、送信者= "エマ" 又は
  2. ジョンはエマに= "ジョン"

がコンソールに表示される=>受信機= "エマ"、送信者に送信されます。 JQueryでconsole.log()関数を使用してこれを行うことができます。私のPHPはこのようになります

$user1 = "John"; 
$user2 = "Emma"; 
$sql = "SELECT * FROM dm WHERE receiver = '$user1' AND sender = '$user2';SELECT * FROM dm WHERE receiver = '$user2' AND sender = '$user1'"; 

// Execute multi query 
if (mysqli_multi_query($link,$sql)) 
{ 
    do 
    { 
     $i = 0; 
     $msg = array(); 

    if ($result=mysqli_store_result($link)) { 

     while ($row=mysqli_fetch_row($result)) 
     { 
     printf("%s\n",$row[0]); 
     $msg[$i] = $row[0]; 
      $i++; 
     } 
     mysqli_free_result($result); 
     } 
    } 
    while (mysqli_next_result($link)); 
} 

echo json_encode($msg); 
exit(); 
mysqli_close($link); 

あなたは、私がdatabseが私に戻って与えるか見てみたかったので、私は、そこに「printfの」を持っていることに、気づくでしょう。それは正しくIDを返す:1,3,2,4。

しかし、私は通常、JQuery ajaxを使用してリクエストを行いたいと考えています。私はそれをやる方法も知っています。そのため私はこのようなポストのすべてのIDを保持する配列を持つようにしたい:

["1","2","3","4"] 

残念ながらそれは私に戻ってどのようなコードで記述されたように私はそれを行う方法がこれです:

["2","4"] 

何が起こっているのかは、彼は最初のクエリにあったものだけを配列に配置することです。

私の質問は何ですか?

すべての1,2,3,4のIDを保持するように配列を修正したいと思います。好ましくはこの順序で同様に、このようにはならない1,3,2,4。

私は問題を明確にして助言をいただき、ありがとうと思います!

+0

jQueryの部分はどこですか?ここでは –

+0

は必要ありません。問題は、PHPのどこかにあります。私は、ボタンをクリックしてPHPページにリダイレクトされるので(それがないのでajaxリクエスト)、私に '1 2 3 2 4 ["2"、 "4"]と表示されるので、私は言うことができます。 jqueryの部分はjson_encode($ msg)ビットを処理するだけです。 –

+0

あなたは(https://www.owasp.org/index.php/SQL_Injection)[** SQLインジェクション**]に広く開いています。クエリに変数を連結するのではなく、プリペアドステートメントを使用する必要があります。「PHPでのSQLインジェクションを防ぐには?」(http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php?rq=1)を参照してください。 –

答えて

1

$i$msgを外側のループの内側にリセットします。つまり、配列内の2番目のクエリの結果のみが表示されます。ループの外に$i = 0;と行を移動します。

つまり、ここで2つのクエリを実行する理由はありません。 WHERE句にORを使用して、両方の結果を同時に取得してください。これはより速くて簡単です。

また、これは非常に重要です:あなたはSQL injectionに広く公開されています。クエリに変数を連結するのではなく、プリペアドステートメントを使用する必要があります。 How can I prevent SQL injection in PHP?を参照してください。

+0

そして私はそれをどのようにしますか?私が必要とするのは、受信者と送信者が「固定」されていることです。エマとジェームズ、ジェームスとエマのどちらかです。 –

+0

@ D.Kroldどういう意味ですか?私はあなたの答えで、問題を解決する方法を教えてきました。これらの2行のコードを 'do ... while'ループの外側に移動します。それはあなたの質問に対する答えです。あなたが何か違うものを求めていたら、この答えを受け入れてから新しい質問をするべきです。 –

+0

おやすみなさい、リラックスしてください。 –