2016-04-20 10 views
1

私はどこに行っても徹底的にチェックし、これに対する答えを見つけるために可能な限りすべてを行ってきました。明らかに十分ではない「コードが機能しない」と言っているだけでなく、私はまだこれに近づくものを見つけていない。私はおそらく下降音を得るつもりですが、これがどのように進むのか見てみましょう。複数のMySQLi準備文

私は、ユーザー側から検索クエリの準備文を作成する方法を学習しています。複数のクエリでそれを行う必要があります。私は、これらの複数のクエリにパラメータをバインドし、それらを実行し、それらを使用し、複数の行を受け取る必要があります。これは私のコードの大部分ですが、私が現在持っているのはではなく、何かエラーが報告されていません。白い空白のページが返されます。

私はこれを単純なtest.phpファイルから実行しています。これらは私が得ている結果です。

コードのためです。

$prep1 = $test->prepare("SELECT * FROM sb__bans WHERE sb__bans.authid=? ORDER BY sb__bans.bid DESC"); 
$prep2 = $test->prepare("SELECT * FROM sb__bans AS bans INNER JOIN sb__admins AS admins ON bans.aid = admins.aid WHERE bans.authid=? ORDER BY bans.bid DESC"); 
$prep3 = $test->prepare("SELECT * FROM sb__bans AS bans INNER JOIN sb__servers AS servers ON bans.sid = servers.sid WHERE bans.authid=? ORDER BY bans.bid DESC"); 

$search = "steam"; 

$prep1->bind_param("s", $search); 
$prep2->bind_param("s", $search); 
$prep3->bind_param("s", $search); 

$prep1->execute(); 
$prep2->execute(); 
$prep3->execute(); 

while($row = $prep1->fetch() && $admin = $prep2->fetch() && $sv = $prep3->fetch()) { 
echo $row['test']; 
echo $admin['test']; 
echo $sv['test']; 
} 

$test = new mysqli("localhost", "test", "test", "test");

$search = "steam"蒸気はもちろんのポスト変数に置き換えられますが、テストの理由から、私は今のためだけのシンプルでテストしていことを削除しましたように、データベースは、この上に初期化されます変数。

ここで問題と思われるものは何ですか?

ありがとうございます。

+0

なぜ3クエリですか?あなたはただ一つにすることができます。 – rmondesilva

答えて

-1

2点:

  1. 個人的な経験に基づいて、あなたが一度に存在する1つのプリペアドステートメントを持つことができます。これは、dbには各PSにセッション固有の名前が必要であり、PHPレイヤーは各PSの固有の名前を生成するのではなく、共通のデフォルト名を渡すためです。これと比較して、PostgreSQLドライバでは各PSにオプションの名前を付けることができますが、という名前の1つだけが存在します。 PSが存在します。これは、preparebindexecutefetchのいずれかであることを意味します。次のPSの前には、PS が完全にです。

  2. あなたは誤って使用していますmysqli_stmt::fetch()fetch()は、mysqli_stmt::bind_result()で以前にバインドされていた変数を更新するために使用され、trueまたはfalseのみを返します。 $row配列に値を取得するには、まずmysqli_stmt::get_result()を呼び出してmysqli_resultを返し、次にmysqli_result::fetch_array()を呼び出す必要があります。

+0

私はそれらをソートして、一度にひとつ準備してから結果をバインドします(私はmysqlndを持たないのでget_resultを使うことができないので)、fetch_arrayを使用しますが、フェッチできる前にこのエラーが出ます配列 'PHP警告:mysqli_stmt :: bind_result():バインド変数の数がプリペアドステートメントのフィールド数と一致しません。 ' – Joel

+0

' SELECT * 'を実行している場合は、そこにある変数を' bind_result() 'する必要があります表内の列です。実際には[PDO](http://php.net/manual/en/book.pdo.php)を使ってすべてを簡単に行うことができます。 –

+0

私はそれを知らなかった。ありがとう。私はあなたのヒントを取ってPDOを使うように書き直すことにしました。私が残した唯一の問題は何らかの理由でempty()が明らかに空の配列で動作していないことです。私は別の質問のためにそれを保存します。助けてくれてありがとう。 – Joel

0

あなたが尋ねた一般的な質問については、

複数のクエリを準備することには1つの問題はありません。準備されたクエリから結果を得ることについて言及していますが、結果のバッファリングによって実際に問題が発生しています。別のクエリを実行できるようにするには、実行直後にstore_result()/ get_result()を呼び出す必要があります。

あなたが持っている特定の問題については、

  1. エラーを取得するにはyou have to ask PHP for them
  2. 3つのクエリを作成する際には全く意味がありません。1つだけ作成する必要があります。問題が発生した場合は、別の質問にmysqlタグを付けて3つの質問を連ねてください。
  3. 複数のクエリであっても、単一のループで複数のフェッチを行うのは間違っています。クエリ結果を1つずつ取得します。
  4. 1つのクエリでもmysqliの構文が不完全です。まず、チュートリアルを再読み込みし、単一のクエリで練習する必要があります。