2017-10-13 21 views
0

以下は、ページ上の新しいフォーム提出のための私のコードです。私は一日中この作業を続けており、bind_paramではこの文が失敗しています。

$query = " INSERT INTO table 
            ( 
             AbandonedComments,           
             DetectorComments,           
             FireExComments,           
             PestComments,          
             SanitationComments 
            ) 
           VALUES 
            ( 
             ?,           
             ?,           
             ?,           
             ?,           
             ?; 
            )"; 
       $stmt = $mysqli->prepare($query); 
       $stmt->bind_param("sssss", 
         $_POST['GeneralComment'], 
         $_POST['SmokeDetectorComment'], 
         $_POST['fireExComments'], 
         $_POST['PestComments'], 
         $_POST['SanitationComments'] 
       ); 
$stmt->execute(); 
$stmt->close(); 

私はそのセクションをtry/catch、if/elseにラップし、値が通過しているかどうかをテストしました。

  • のtry/catchはキャッチしませんでしたが、/それ以外はどちらを実行した場合、それは
  • ザ・いずれも成功しませんでした。
  • これに応じてすべての値が渡されます。

私は、ブール値を返すので、execute()エラーをチェックすることができますが、私はbind_paramに何も見つかりませんでした。

EDIT:これをポストした直後に私の上司に話しました。彼はエラーを指摘し、 'bind_param'のエラーチェックはしませんが、 'prepare'と 'execute'の両方がブール値を返します。そこにチェックしてください。私はあなたが間違って

VALUES 
            ( 
             ?,           
             ?,           
             ?,           
             ?,           
             ?**;** 
            )" 
+1

成功すれば真、失敗した場合は偽を返します._ http://php.net/manual/en/mysqli-stmt.bind-param .php – AbraCadaver

+0

* "$ stmt-> bind_paramのエラーをチェックする方法はありますか?" * - このような質問には以前から回答しており、 'bind_param()'でエラーをチェックする方法はありません。私はそれを見つける必要があります。 –

+0

他の何かが失敗したかもしれませんが、これは何ですか? – AbraCadaver

答えて

2

はそこでセミコロンに注意してください?

PHPをはじめとする言語では、「文末」である有効な文字であるとみなされ、すべてのプレースホルダの末尾に配置されています編集)。

参考:CやPerlと同様に

、PHPはそれぞれの文の末尾にセミコロンで終端される命令が必要です。 PHPコードのブロックの終了タグは自動的にセミコロンを意味します。 PHPブロックの最後の行を終了するセミコロンを持つ必要はありません。ブロックの終了タグには、直後の改行がある場合はその改行が含まれます。

クエリ(バインド)が失敗したことを示しています。それは理由で失敗し、あなたは本当のエラーをチェックしなかったか、またはそれは起こり得ることなく静かに失敗しました。

また、バインド時にエラーをチェックすることはできません。また、クエリに関するエラーをチェックし、PHP関連の問題であるかどうかのエラー報告もチェックします。

編集:

ただし、クエリは次のようなものを読んでいた:

VALUES 
            ( 
             ?,           
             ?,           
             ?,           
             ?; <<< trailing semi-colon           
             ? 
            )"; 

...最後のプレースホルダーは決して使用されず、ステートメントは4番目のプレースホルダーで停止するため、これはまったく違うものです。

あなた可能性があり、にあなたの現在の$stmt->execute();文を変性するとを「クエリが実行されなかった場合は、」のようなものに変換「ではない」演算子、ある!を使用して条件文を使用する必要があります。

if(!$stmt->execute()) { 
    echo "Error: " . mysqli_error($mysqli); 
}else{ 
    echo "Success"; 
} 
+1

良いキャッチだけど.....エラーを投げなかった理由がある。なぜなのかご存知ですか?私がやります。それを見つけて説明してほしい。 –

+1

これは正しい答えです、私はまだそれを受け入れることができません。クエリが機能します! – Liam

+0

@ Liamなぜあなたは編集してセミコロンを削除しましたか? https://stackoverflow.com/revisions/46736498/3この回答は現在の質問には当てはまりません。編集OKは編集を中止します。 https://stackoverflow.com/revisions/46736498/3 –

4
VALUES 
            ( 
             ?,           
             ?,           
             ?,           
             ?,           
             ?; <<< trailing semi-colon 

を挿入セミコロンを持っていると思う

2

prepare()に電話すると構文チェックが行われ、bind_param()ではありません。 $stmtFALSEになるので

$stmt = $mysqli->prepare($query) or die($mysqli->error); 

はしかし、bind_param()はエラーを報告している必要があります。それは、非オブジェクト上でメソッドを呼び出すことについて不平を言わなければならないはずです。

2

@Barmarが示すように、例外を有効にしない場合、falseという応答の場合は、のmysqliコールごとにをチェックする必要があります。 IIRCでは、すべてのmysqli関数はエラー時にfalseを返します。

prepare()エラーの例外を発生させるには、mysqliを設定するだけです。これはデフォルト設定ではないため、有効にする必要があります。しかし、ドキュメントからそれをどうやって行うのかは明らかではありません。

http://php.net/manual/en/mysqli-driver.report-mode.phpが例を示します。

mysqli_report(MYSQLI_REPORT_STRICT); 

$link = mysqli_connect(...); 

あなたがこれを実行した後、その後、あなたが原因でSQL構文エラーの例外が発生している必要があります()の準備、他の人が指摘してきた自分の価値観の句に余分なセミコロン。

私はいつもmysqliで例外を有効にする人がほとんどいないことに驚いています。私は彼らがドキュメントでmysqli_report()に関する部分に気付かなかったと思います。それは本当にかなり埋葬されています。

PDOを使用する開発者が例外を有効にするのが一般的です。これはデフォルトでは有効になっていませんが、ドキュメントで見つけやすくなります。http://php.net/manual/en/pdo.error-handling.php

関連する問題