2017-02-21 50 views
0

下一個代碼給我一個錯誤SQLSTATE[HY093]: Invalid parameter number無效參數號

$sql = "INSERT INTO `users` (`id`, `date_install`, `date_ping`, `cc`, `uv`, `pid`, `pv`, `aff_id`, `sub_id`, `channel`, `cid`, `os`, `av`, `db`) VALUES (:id, :date_install, now(), :country, :updaterVersion, :productId, :productVersion, :affiliateId, :subId, :channel, :commandId, :os, :av, :defaultBrowser) " 
    . "ON DUPLICATE KEY UPDATE `date_install` = :date_install, `date_ping` = now(), `cc` = :country, `uv` = :updaterVersion, `pid` = :productId, `pv` = :productVersion, `aff_id` = :affiliateId, `sub_id` = :subId, `channel` = :channel, `cid` = :commandId, `os` = :os, `av` = :av, `db` = :defaultBrowser "; 

$statement = $database->prepare($sql); 
$statement->bindValue(":id", $user->id, PDO::PARAM_INT); 
$statement->bindValue(":date_install", $user->date_install, PDO::PARAM_STR); 
$statement->bindValue(":country", $user->cc, PDO::PARAM_STR); 
$statement->bindValue(":updaterVersion", $user->uv, PDO::PARAM_INT); 
$statement->bindValue(":productId", $user->pid, PDO::PARAM_INT); 
$statement->bindValue(":productVersion", $user->pv, PDO::PARAM_INT); 
$statement->bindValue(":affiliateId", $user->aff_id, PDO::PARAM_INT); 
$statement->bindValue(":subId", $user->sub_id, PDO::PARAM_INT); 
$statement->bindValue(":channel", $user->channel, PDO::PARAM_STR); 
$statement->bindValue(":commandId", $user->cid, PDO::PARAM_INT); 
$statement->bindValue(":os", $user->os, PDO::PARAM_STR); 
$statement->bindValue(":av", $user->av, PDO::PARAM_STR); 
$statement->bindValue(":defaultBrowser", $user->db, PDO::PARAM_STR); 

$statement->execute(); 

我不知道什麼是錯的,如果我複製/粘貼SQL到控制檯,並更換所有值手動一切正常。另外,如果我註釋掉部分ON DUPLICATE KEY...,也適用。

+0

'date_ping'的值在哪裏? –

+1

當它已經存在時,這是一個可怕的更新值 - 我對你的數據完整性有點擔心! –

+0

@HankyPanky它現在是'now()' –

回答

3

如果emulation mode is turned off您PDO例如,你將不能夠使用相同的佔位符名稱不止一次在查詢中。

此外,對於上的重複是沒有必要或者,因爲你總是可以使用VALUES經營者,將採取價值從VALUES子句:

ON DUPLICATE KEY UPDATE `date_install` = VALUES(date_install), ... 
1

PDO不允許重複變量名稱。你的重複密鑰更新應該有它自己的變量名。這也意味着你必須分配你的變量2次。這是一個悲傷的限制:(。

1

爲了兩次使用相同的參數名稱,必須設置PDO::ATTR_EMULATE_PREPARES屬性true

$database->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);