2016-11-22 47 views
0

このタイトルで多くの質問がありますが、私の問題を解決することはできません。 これは無効なパラメータ番号:バインドされた変数の数がトークンの数と一致しません

global $connPDO; 
    ini_set('date.timezone', 'Asia/Karachi'); 
    $date = date('Y-m-d H:i:s'); 

    $sql = "INSERT INTO `pqa` VALUES (null, :ProId, :ProQuestion, null, '$date', null)"; 
    $queryInsert = $connPDO->prepare($sql); 

    try { 
     //Post contain $_POST["ProId"], $_POST["ProQuestion"]; 
     $querySuccess = $queryInsert->execute($_POST); 
     echo $querySuccess; 
    } 
    catch(Exception $e) { 
     echo '<h1>An error has ocurred.</h1><pre>', $e->getMessage() ,'</pre>'; 
    } 

Catchブロックの実行が、エラーを与えていないテーブルにデータを追加する簡単なコードPHPです。

var data = { 
    "action" : "SaveProjectNewQuestion", 
    "ProId" : 1, 
    "ProQuestion" : $jqueryLib("#NewQuestion").val() 
}; 
$jqueryLib.ajax({ 
    url : "ESP.php", 
    type : "POST", 
    data : data, 
    success : function(data, textStatus, XMLHttpRequest) { 
     console.log(data); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     console.log(textStatus, errorThrown); 
    } 
}); 

この警告を示す驚くほど成功したログで、データも挿入されていません。

警告(!): はPDOStatement ::実行():SQLSTATE [HY093]:無効なパラメータ番号:バインド変数の 数 C内のトークンの数と一致しません:\ WAMP \ WWW \ ESP \ラインあなたは「どのように修正する必要があり ............................

+0

'$ _POST'には何がありますか?その上で 'var_dump();'を実行します。 – Qirel

+0

ProjectIdとProjectQuestionデータ –

答えて

2

あなたは

$queryInsert->execute($_POST); 

あなたをやっているときは:あなたはバインド/パラメータを(:ProId, :ProQuestion)を定義しているので、あなたはこのようになります->execute(...)に構築され、配列を渡す必要がありますすべてをグローバルポストアレイにバインドしようとしましたが、アレイ内のそれぞれのインデックスがプレースホルダーとして表示されます。あなたは、AJAXを送信すると、次のデータに

var data = { 
    "action" : "SaveProjectNewQuestion", 
    "ProId" : 1, 
    "ProQuestion" : $jqueryLib("#NewQuestion").val() 
}; 

を送っている。ここ3つの項目がありますが、あなただけのバインドの数でmissmatchがあることが原因と、それらのうちの2つをバインドしようとしているとactionがクエリ内のプレースホルダではないため、バインドしようとしている2つのインデックスがプレースホルダの名前と一致していても、値の数です。

一般に、POSTアレイ全体を使用して、そのようにすることは避けてください。バインドする変数は2つだけです。このように直接バインドしたいと考えています。

$queryInsert->execute(array("ProId" => $_POST['ProId'], 
          "ProQuestion" => $_POST["ProQuestion"])); 
+0

はい私は編集されたコードを投稿し、varsの名前を変更することを忘れていた。あなたは拘束力が必要ですか? –

+0

値を1対1の関係でバインドします。これにより、期待する値を常にバインドすることができます。これは私の答えに載せた例を使っていることを意味します(あなたの実際のコードに従ってPOST-indexesを変更しなければならないかもしれないので、実際にどちらを使用しているのか分かりません)。 – Qirel

+0

答えと時間はQirelに感謝します。一般的に言って、私は、$ Postがparamtersの名前が同じであるために働く必要があると考えています。明示的に定義する必要はありません。 –

1

にESP.phpあなたの声明を再実行する。 「

$binds = array(
    ':ProId' => $_POST['ProjectId'], 
    ':ProQuestion' => $_POST['ProjectQuestion'] 
); 
$querySuccess = $queryInsert->execute($binds); 
+0

私の質問を更新するにはバインドが必要ですか? –

+0

@MohammadFaizanKhanこれが外部ユーザー入力であれば、ユーザー入力を信頼できないので、[** always bind **](http://stackoverflow.com/a/24989031/2518525)にする必要があります。 – Darren

+0

お時間をいただきありがとうございます。私は複数の答えを受け入れることができることを願っています。しかし、私はまだバインディングの目的を理解することができませんパラメータ名が同じであるので、あなたはそれをバインドする必要はありません –

関連する問題