我在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
。但是正在发生的事情是因为PHP中的1011
这样的int值在被写入MySQL时会被转换为'g-608311'
之类的东西。它间歇性地发生。
因此,当我在思考如何在我的表中清理时,我很好奇MySQL是如何在数据类型不匹配的情况下从int 1011中提出'g-608311'字符串的?
编辑:我更新了代码段,以显示$ customer_id值实际来自哪里。另外,我在考虑这个问题时今天早些时候想过这个,但是当我最初运行这个代码时,我收到了一条消息的例外:
message SQLSTATE[22007]: Invalid datetime format: 1292 Truncated incorrect DOUBLE value: 'g-608311'
答案 0 :(得分:3)
虽然由于你的不带引号的字符串输入,我无法确切地告诉你为什么你得到不同的值,但我可以指出使用预准备语句是多么荒谬......然后无论如何直接在查询中嵌入变量。 / p>
您的查询应该是:
$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();