2014-04-11 102 views
0

我一直在抓我的頭在此代碼爲幾個小時.... 沒有道理給我,爲什麼它不工作使用bindParam與PDO

$isCorrect =($question->correct_answer == $body->answer) ? 1:0; 
// the values are all there....... 
// echo $body->question . "\n"; //335 
// echo $body->user . "\n";  //51324123 
// echo $question->day . "\n"; //0 
// echo $isCorrect . "\n";  //0 

//but still the below part fails. 
$db = getConnection(); 
$sql = "INSERT INTO `answers` (`id`, `question_id`, `user`, `day`, `is_correct`) VALUES (NULL, ':question', ':user', ':day', :is_correct)"; 
$stmt = $db->prepare($sql); 
$stmt->bindParam(":question_id", $body->question); 
$stmt->bindParam(":user", $body->user); 
$stmt->bindParam(":day", $question->day, PDO::PARAM_INT); 
$stmt->bindParam(":is_correct", $isCorrect, PDO::PARAM_INT); 
$stmt->execute(); 

給出了這樣的錯誤:

SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens 

我在計算4個標記...我錯過了什麼?顯然我做錯了什麼。

+0

有參數無效的數字,因爲你把你的命名參數在單引號,這是不是這樣做的方式。命名參數':question'不能放在單引號中,比'?' –

回答

0

變化:

$stmt->bindParam(":question_id", $body->question); 

到:

$stmt->bindParam(":question", $body->question); 

您在查詢:question使用,但用錯了鍵(:question_id)結合。

+0

比我快(:) – zkanoca

+0

@springbo別忘了接受它:)如果有幫助 –

+0

非常感謝你們兩位!令人驚訝的是,我完全睜大眼睛盯着它。 我會盡快接受這個答案。 再次感謝! – springbo

0
$stmt->bindParam(":question_id", $body->question); 

應該

$stmt->bindParam(":question", $body->question); 

這只是一個小錯字。

1

只是不使用bindParam和PDO
以及命名參數。它會爲你節省大量的頭痛

$db = getConnection(); 
$sql = "INSERT INTO `answers` VALUES (NULL, ?,?,?,?)"; 
$data = [$body->question,$body->user,$question->day,$isCorrect]; 
$stmt = $db->prepare($sql)->execute($data); 
+0

我只是想要學習。爲什麼不應該使用bindParam?是否有漏洞? – zkanoca

+0

只是比較一下代碼量 –

+0

很好的建議。謝謝。 – springbo

2

試試這樣說:

$sql = "INSERT INTO `answers` (`id`, `question_id`, `user`, `day`, `is_correct`) 
     VALUES 
     --The :variable shouldn't be surrounded by ''-- 
     (NULL, :question, :user, :day, :is_correct)"; 
$stmt = $db->prepare($sql); 
//The values used in $sql should be the same here, so not :question_id but :question 
$stmt->bindParam(":question", $body->question); 
$stmt->bindParam(":user", $body->user); 
$stmt->bindParam(":day", $question->day, PDO::PARAM_INT); 
$stmt->bindParam(":is_correct", $isCorrect, PDO::PARAM_INT); 
+0

Ahaha唯一的眼睛發現錯誤 –