2014-02-24 20 views
0

我試圖創建我自己的註冊表單,但即時通訊與預處理語句有問題。準備INSERT語句以獲得insert_id在第二個準備INSERT語句中使用

的想法是創建一個準備好的語句插入信息到用戶表,然後從生成的內容在另一個INSERT語句

這裏使用的是一個版本我的註冊腳本獲取INSERT_ID

<?php 

    $returnedId = ''; 

    include "includes/dbconnect.php"; 

    $stmt = $db->prepare("INSERT INTO `users`(`Username`, `Email`, `Password`) VALUES (?, ?, ?)"); 
    $stmt->bind_param('sss', $_POST['username'], $_POST['email'], $_POST['password']); 
    $stmt->execute(); 
    $returnedId = $stmt->insert_id; 
    $stmt->close(); 

    echo $returnedId; 

    $allergystmt = $db->prepare("INSERT INTO 'user_allergy' ('user_id', 'allergy_id') VALUES (?, ?)"); 
    $allergystmt->bind_param('ss', $returnedId, $_POST['check_list']); 
    $allergystmt->execute(); 
    $allergystmt->close(); 

    header('Location: index.php'); 

?> 

第一個準備好的語句正確運行並將信息插入表中,之後$ returnId變量被成功回顯。接下來的腳本是我第二個準備好的語句,當它試圖運行即時得到,說錯誤:

Fatal error: Call to a member function bind_param() on a non-object in D:\filepath\register.php on line 17

看來,我的心不是變量被帶入第二個準備好的聲明。

+3

您在第二個查詢中使用'''而不是反引號('\'')。 –

+0

您不需要將值作爲'$ returnedId'獲取和重用。您可以在第二個「INSERT」查詢中本地調用MySQL的'LAST_INSERT_ID()'。 –

+0

@MichaelBerkowski:最好用PHP捕獲它。以防萬一以後有其他插入。 –

回答

1

您的第二個查詢有語法錯誤,但未通過prepare。既然你沒有錯誤處理的這樣的數據庫故障,你以後的代碼只是失誤開始:

$allergystmt = $db->prepare("INSERT INTO 'user_allergy' ('user_id', 'allergy_id') VALUES (?, ?)"); 
             ^---   ^--^--- ^-- etc... 

不能使用的表和字段名稱'報價。 '表示字符串。這些字段/表名稱都不是保留字,所以沒有必要在所有引用它們:

$allergystmt = $db->prepare("INSERT INTO user_allergy (user_id, allergy_id) VALUES (?, ?)"); 
if (!$allergystmt) { die($dbh->errorInfo()); } 

注意添加errorInfo中()的輸出。永遠不要假設數據庫操作成功。總是假設失敗,並將成功視爲令人驚喜的事情。

+0

引用標記做了竅門,爲這些愚蠢的錯誤道歉,它第一次ive在近2年裏看了PHP! –