这让我疯了几个小时:
我有一份制造商名单,他们必须不时更新。我必须选择最旧的更新,然后将当前时间写为最后更新时间。
这是我的脚本(类中函数的一部分):
public function get_manufacturer () {
$sql = '
SELECT manufacturer_id FROM
manufacturer
ORDER BY last_update LIMIT 1
';
$query = $this->query($sql);
$manufacturer = $query->row;
//echo $manufacturer['manufacturer_id'];
$sql = 'UPDATE manufacturer
SET last_update = '.time().'
WHERE manufacturer_id ='. $manufacturer['manufacturer_id'];
$query = $this->query($sql);
return $manufacturer;
}
问题是即使我放了LIMIT 1
,更新查询也会更新两行,而不是一行。它使用正确的manufacturer_id
和下一个更新行。
另一个奇怪的事情是,如果我在两个查询之间发出回声,那么一切正常。
我也注意到,如果我不使用ORDER BY
,一切似乎都能正常工作。 (不幸的是,我在查询中需要ORDER BY
。)
我想我必须在两个查询之间清除一些缓存或类似的内容。请指教!
更新
这是查询函数,但我尝试使用mysql_query()代替此函数,结果是相同的。
public function query($sql) {
$resource = mysql_query($sql, $this->connection);
if ($resource) {
if (is_resource($resource)) {
$i = 0;
$data = array();
while ($result = mysql_fetch_assoc($resource)) {
$data[$i] = $result;
$i++;
}
mysql_free_result($resource);
$query = new stdClass();
$query->row = isset($data[0]) ? $data[0] : array();
$query->rows = $data;
$query->num_rows = $i;
unset($data);
return $query;
} else {
return TRUE;
}
} else {
exit('Error: ' . mysql_error($this->connection) . '<br />Error No: ' . mysql_errno($this->connection) . '<br />' . $sql);
}
}
更新2
我再次提出了相同的问题,但是您可以在自己的服务器上测试一个简化的(完整的)代码。 见这里:Why UPDATE used after SELECT chages 2 rows instead of one?
感谢您的帮助!
答案 0 :(得分:1)
manufacturer_id
不是UNIQUE
,或者您正在调用该函数两次。
答案 1 :(得分:0)
尝试在第一个查询中选择last_update字段,并将其作为AND子句添加到update语句中,以确保更多唯一性。