2014-06-28 59 views
0

我對PHP比較陌生,並且正在學習綁定。我得到一個綁定錯誤:調試簡單的bind_param錯誤

「mysqli_stmt :: bind_param():變量數不匹配的在準備好的聲明中的參數個數」

if(isset($_GET['last_name'],$_GET['id'])) { 
    $last_name = trim($_GET['last_name']); 
    $id = trim($_GET['id']); 
    $people = $db->prepare("select firstName, last_name, id from people where last_name = ? or id >= ?"); 
    $people->bind_param('ssi', $first_name, $last, $id); 
    $people->execute(); 
    $people->bind_result($first_name, $last, $id); 

我得到的bind_param行錯誤。我有'ssi',我的意思是字符串,字符串,整數,我有三個變量。在我的選擇中,我有三個正確命名的字段。如果我更改爲「si」並刪除任何名稱字段,它工作正常。我很困惑,爲什麼添加第二個字符串不工作

+0

您可能有三個變量,但我只能看到兩個'''佔位符... –

回答

0

您有條款中兩個問號:

「選擇名字,姓氏,從人WHERE姓氏= ID?或ID> =?」

(注意camelCases的firstName PARAM而params的下劃線的休息,這是很好的做法有一個命名約定要堅持以避免出現問題)

,這意味着你要綁定2 PARAMS,但在下一行你正試圖把3 PARAMS

$以人爲> bind_param( 'SSI',$ FIRST_NAME,$姓氏,$ id)的

刪除$ first_name來自bind_param的變量和來自類型的's'。

這應該是這樣的:

$以人爲> bind_param( 'SI',$姓氏,$ id)的

注:你的$最後和$ first_name的變量是不確定的。

+0

我同意命名約定,但這些是數據庫中正確的字段名稱。我仍然不確定我是否明白爲什麼這不起作用。 不是我選擇的三個字段的選擇?爲什麼where子句檢索兩個字段與我想要綁定的字段數量有關?也許,我只是不明白綁定是什麼。爲什麼我的where子句中沒有任何問題標記並分配(綁定)任意數量的字段? – DVDmmike

+0

「從last_name =?或id> =?的人中選擇firstName,last_name,id。」你**選擇3個字段** - 名字,姓氏,編號 從表**人** 2條件**:lasnt_name =?或id> =?因爲你沒有指定這兩個條件只是將問號放置爲佔位符您必須將2個參數綁定到這些佔位符。您必須始終將相等數量的變量綁定到'?'的數量在statement.Where子句中不檢索2個字段。你總是檢索3個字段與該語句,但過濾這2個條件,你必須綁定,因爲你不指定它。 – szymanskilukasz

+0

您必須始終將相等數量的變量綁定到'?'的數目在statement.Where子句中不檢索2個字段。 我想我正在嘗試做的事情與真正的綁定不同,因此,我不明白綁定是否正確。 我以後要做的事情是用一個while循環來檢索三個字段,即使我只是從用戶中檢索數據點。因此,我想我必須改變我的綁定選擇只有兩個,因爲你有狀態,並改變我的while循環使用新的選擇標準,而不是。 – DVDmmike