2013-02-19 251 views
2

我有一個非常簡單的問題...跑步什麼的下方會返回一個錯誤:PDO查詢返回錯誤

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

但我只是沒有看到它。我計算了8個變量和8個令牌......我錯過了什麼?我一直在盯着它很多年,希望能在這裏指出什麼是我沒有看到的。對這個愚蠢的問題抱歉。

$forward = '-'; 
$datetime = strtotime('now'); 
$mysqldate = date('Y-m-d H:i:s', $datetime); 
$systemInfo = leSniff(); 
$stmt = $conn->prepare('UPDATE users SET last_login = :mysqldate, 
    last_ip = :last_ip, forward = :forward, platform = :platform, 
    browser = :browser, system = :system 
    WHERE email = :email AND password = :password'); 
$query->execute(array(
    ':email' => $email, 
    ':password' => $password, 
    ':mysqldate' => $mysqldate, 
    ':last_ip' => $_SERVER['REMOTE_ADDR'], 
    ':forward' => $forward, 
    ':platform' => $systemInfo['platform'], 
    ':browser' => $systemInfo['name'], 
    ':system' => $systemInfo['userAgent'] 
)); 
+0

你不應該有這樣的一般變量名多準備語句。 – 2013-02-19 12:50:02

+0

爲什麼不呢?原諒我我的無知:) – Galadre 2013-02-19 12:51:31

+0

我已經在我的回答中解釋了這一點。 – 2013-02-19 12:52:38

回答

8

那就是:

$stmt = $conn->prepare('UPDATE users SET last_login = :mysqldate, last_ip = :last_ip, forward = :forward, platform = :platform, browser = :browser, system = :system WHERE email = :email AND password = :password'); 
$query->execute(array(

應該是:

$stmt = $conn->prepare('UPDATE users SET last_login = :mysqldate, last_ip = :last_ip, forward = :forward, platform = :platform, browser = :browser, system = :system WHERE email = :email AND password = :password'); 
$stmt->execute(array(
^^^^^ 
+1

哦哇......好吧,我希望我不是唯一一個犯這樣愚蠢錯誤的人!非常感謝您指出這一點,我從我找到的腳本中複製了一些內容,並忘記更改變量以匹配我自己的工作。當它允許我接受這個答案時(9分鐘)。 – Galadre 2013-02-19 12:50:11

+0

我想知道社區與這類問題有什麼關係。 – 2013-02-19 14:40:49

2

我怕你的犧牲品一個錯字:

$stmt = $conn->prepare('...'); 
$query->execute(...); 

你準備的在$stmt聲明,但你正在執行$query

爲了防止這類情況,你應該給準備語句的更具描述性的變量名,而不是$stmt$query

$update_users = $conn->prepare('...'); 
$update_users->execute(...); 
+0

啊那樣。我想你是對的!我應該並且會開始更好地指定我的變量。感謝您的建議。 – Galadre 2013-02-19 12:55:31