我在Magento脚本中得到了这段代码:
$order = $observer->getEvent()->getOrder();
$customer_id = $order->getBillingAddress()->getCustomerId();
$idArray = array('LN123456789XZY'); // this is just arbitray sample data, the array can be any length
$prequery = "UPDATE $detailedTable SET ordered=1 WHERE customer_id=$customer_id AND image_id IN (";
$qPart = array_fill(0, count($idArray), "?");
$prequery .= implode(",", $qPart) . ")";
$query = $dbLink->prepare($prequery);
$i = 1;
foreach($idArray as $elem){
$query->bindValue($i++, (string) $elem, PDO::PARAM_STR);
}
$query->execute();
我看到的是$customer_id
的值被转换成一个具有完全不同值的字符串。表中这两列的数据类型是:
customer_id => VARCHAR(64)
image_id => TEXT
所以我意识到我的第一个问题是我没有用单引号包围$customer_id
。但是发生的事情是因为它是一个int值,比如PHP中的1011
,当它被写入MySQL时,被转换成'g-608311'
。它断断续续地发生。
所以当我在思考如何清理我的表中的东西,我很好奇MySQL是如何从int 1011中提出的'g-608311'字符串当有数据类型不匹配?
EDIT:我更新了代码片段,以显示$customer_id值实际来自何处。此外,我今天早些时候在思考这个问题时想到了这一点,但是当我最初运行这个代码时,我得到了一个异常消息:
message SQLSTATE[22007]: Invalid datetime format: 1292 Truncated incorrect DOUBLE value: 'g-608311'
虽然我不能确切地告诉你为什么你得到不同的值由于你的未引号字符串输入,但我可以指出它是如何荒谬的使用准备语句…然后直接在查询中嵌入变量。
你的查询应该是:
$prequery = "UPDATE `literal_table_name_here` SET `ordered`=1
WHERE `customer_id` = ?
AND `image_id` IN (".str_repeat("?,",count($idArray)-1)."?)";
$query = $dbLink->prepare($prequery);
$query->bindValue(1,$customer_id);
foreach($idArray as $i=>$elem) {
$query->bindValue($i+2, $elem, PDO_PARAM_STR);
}
$query->execute();