1

私はjavascript POST経由で次のスクリプトを呼び出しています

$target = $_POST['id'];
$sid = $_POST['sid'];

$sql = 'DELETE FROM `subusers` WHERE `subusers.uid`=?';
$stmt = $conn->prepare($sql);
if($stmt === false) {
  trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $conn->errno . ' ' . $conn->error, E_USER_ERROR);
}
echo $target;
$stmt->bind_param('i', $target);
$stmt->execute();

実行されるたびに、何らかの理由でクラッシュしPOST http://xx.php 500 (Internal Server Error)ます。bind_param を削除すると正常に動作します。PHP はそれを呼び出したスクリプトとも通信します。 $target の値をスクリプトに送り返してアラートを出そうとしたところ、適切な値が表示されました。$target=1整数として宣言するためだけに試しましたが、何も変わりませんでした。クエリの全体的な混乱は、どこかにキーワードがあった場合に備えて修正しようとしているだけです。

エラーコード:

PHP 警告: mysqli::prepare(): 行 12 の /var/www/html/delpar.php で mysqli を取得できませんでした。リファラー:

PHP 致命的なエラー: 17 行目、リファラーの /var/www/html/delpar.php の非オブジェクトに対するメンバー関数 bind_param() の呼び出し:

4

1 に答える 1

4

ここにはprepare()/bind_param()/execute()、失敗の原因となる問題はほとんどありません。視覚的に最初に発見されるのは、ステートメントの句table.columnに含まれるの誤った引用です。MySQL の識別子の引用では、引用されている場合、識別子の各セグメントを独自のバッククォートのペアでラップする必要があります。DELETEWHERE

// Correct quoting
$sql = 'DELETE FROM `subusers` WHERE `subusers`.`uid`=?';
//-----------------------------------^^^^^^^^^^^^^^^^^

display_errorsコードを開発およびテストするときは常に、PHP のini ディレクティブを有効にすると役立ちます。これにより、エラー ログを掘り下げる必要がなくなり、画面にエラーと警告が出力されます (これも推奨されますerror_reporting = E_ALL)。ただし、いずれにせよ、ほとんどのデフォルト設定では、PHP エラーが Web サーバーのエラー ログ ( や など) に記録され/var/log/apache2/error.logます/var/log/httpd/error_log

最初のエラー メッセージに基づいて:

PHP 警告: mysqli::prepare(): 行 12 の /var/www/html/delpar.php で mysqli を取得できませんでした

$connの MySQLi 接続オブジェクトが閉じられているか、最初から正しく接続されていなかったことは明らかです。$conn->close()以前のコードを参照して、まだ呼び出されていないことを確認してください。

于 2016-01-12T19:38:00.183 に答える