2016-09-23 20 views
0

したがって、私はPHPで作業しており、準備された文はMySQLデータベースに送られます。私はかなりデバッグできない問題に遭遇しました。拳文はそれがライン$preparedStmt->bind_param("s", $resultUUID);でだ、正常に動作準備PHP - Prepared Statementクエリが2回目で動作しません。

 // Check if the input username is in the database 
 
\t \t $stmtQuery = "SELECT * FROM updatedplayers WHERE Player=?;"; 
 
\t \t $preparedStmt = $dbc->prepare($stmtQuery); 
 
\t \t $preparedStmt->bind_param("s", $setUsername); 
 

 
\t \t $preparedStmt->execute(); 
 
\t \t $preparedStmt->bind_result($resultUUID, $resultUsername); 
 
\t \t $preparedStmt->fetch(); 
 

 
\t \t // If it's not, kill the page. 
 
\t \t if ($resultUUID == null) { 
 

 
\t \t \t incorrect(); 
 
\t \t } 
 
\t \t 
 
\t \t $stmtQuery = "SELECT Password, Salt FROM logins WHERE UUID=?;"; 
 
\t \t echo 'flag1 '; 
 
\t \t $preparedStmt = $dbc->prepare($stmtQuery); 
 
\t \t echo 'flag2 '; 
 
\t \t $preparedStmt->bind_param("s", $resultUUID); 
 
\t \t echo 'flag3 ';

:ここに私のコードです。これらの前にいくつか準備された声明もいくつかあります。私はこれを正しくやっていることを知っていますが、最後の声明についてはあまりよく分かりません。

コードはecho 'flag2 ';の後に実行を停止するように見えますが、特定の行を見つけるためにそこに配置します。エラーメッセージは表示されません。印刷されないのはflag3です。
$resultUUIDを静的な文字列に置き換えようとしましたが、同じ結果が得られました。また、私は自分のSQLステートメントが正しくフォーマットされていることを知っている、私は手動でコンソール内でテストしました。

これはかなりのことですが、私はPHPに慣れていないので、いくつかの批評を聞きたいと思います。また、自分自身でエラーを突き止めるのではなく、エラーについてもっと良いアイデアを得る方法はありますか?ありがとう!

+0

'mysqli'ドライバには、エラー報告関数http://php.net/manual/en/mysqli.error.phpがあります。各DBの対話でそれを使用してみてください。 mysqliエラー報告オプションの詳細については、http://stackoverflow.com/questions/22662488/how-to-get-mysqli-error-in-different-environmentsを参照してください。 – chris85

+0

エラーが報告されました。 – chris85

+0

@ chris85私は現在それを記入する時間がありません。私は明日の翌日に時間があります。そして私はあなたに戻ってきます。 :) – Kaelinator

答えて

1

ので、@ user2182349によって提案ini_set('display_error', 1);を、追加して、私にもう少し洞察力を与えた、私は「致命的なエラー:ブールのメンバ関数bind_param()の呼び出し」だ

some researchした後、私は「クエリ/準備文で使用なしインデックス」を投げていない終わった、mysqli_report(MYSQLI_REPORT_ALL);を追加してみました。

私はそれが問題ではないことを認識するためにそれを行いました。MySQLIは不必要なエラーを報告しています(です)。より良い、より洞察的なスタックトレースを得るために、私はmysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);を使用しました。

これは投げた"コマンドが同期していないので、今すぐこのコマンドを実行することはできません"。再び、more researchは、別の準備されたステートメントを実行できるように、$preparedStmt->store_result();を使用するよう教えてくれました。

すべてのy'allsの助けに大きな感謝、これも誰かを助けることを願っています。

-1

私はあなたがPDOの使用を開始することをお勧めします... mysqliで数年前に準備された問題が発生しました。それ以来、PDOは一度に複数のクエリになると頭がおかしくなりません。

PDO .. :-)を試してください。より効率的です。

http://php.net/manual/en/intro.pdo.php http://php.net/manual/en/class.pdostatement.php

またはあなたが行うことができ、私はあなたが別のクエリに変数を使用する前に準備された文を閉じるために必要があると思う「あなたは代替ソリューションをしたい場合は」..次

//Close connection 
$preparedStmt->close(); 

//AND OPEN YOUR CONNECTION AGAIN TO PREPARE NEW QUERIES.. 

$stmtQuery = "SELECT Password, Salt FROM logins WHERE UUID=?;"; 
echo 'flag1 '; 
$preparedStmt = $dbc->prepare($stmtQuery); 
echo 'flag2 '; 
$preparedStmt->bind_param("s", $resultUUID); 
echo 'flag3 '; 
+1

これは質問に答えるものではありませんが、それはうまく動作しないかもしれない別の方法です。 – chris85

+0

";"を削除してくださいあなたの質問に... – victor

+0

私はここで私の答えを編集しました...代替ソリューション " – victor

-1

$preparedStmt->close(); 

または第二のクエリのために$preparedStmt2のような別の変数名を使用します。

SELECT u.UUID, u.Username, l.Password, l.Salt 
    FROM updatedplayers AS u 
    JOIN logins AS l ON (u.UUID = l.UUID) 
    WHERE u.Player = ? 

は、彼らがデータベースと一致を確認するためにフィールド名のケースを確認してください:

+1

私は、それぞれの後にそれを閉じることなく複数の準備済みのステートメントを作ったので、これは当てはまりません。 :/ – Kaelinator

+0

マニュアル、http://php.net/manual/en/mysqli.quickstart.prepared-statements.php、例3の '複数回実行'を参照してください。 – chris85

+0

@ chris85..INSERTはFROM SELECTとは異なります...私はINSERTを何回も使用しても問題はありませんでした。しかし、複数の時間を選択することでトラブルが発生しました。そのためPDOを使用するようになりました。 – victor

0

あなたは、これに似た単一のSELECTステートメントを使用することができるはずです。

ファイルの先頭に、ini_set( 'display_errors'、1)を追加します。。 PHPのエラーがある場合は、それらが表示されます。また、データベース呼び出しからの戻り値をチェックし、エラー表示関数を使用します。

+0

ありがとう、私はチャンスを得たらこれを試してみます。 – Kaelinator

関連する問題