SELECT和UPDATE更新2行而不是1行

时间:2011-10-22 17:59:32

标签: php mysql

这让我疯了几个小时:

我有一份制造商名单,他们必须不时更新。我必须选择最旧的更新,然后将当前时间写为最后更新时间。

这是我的脚本(类中函数的一部分):

    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?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

manufacturer_id不是UNIQUE,或者您正在调用该函数两次。

答案 1 :(得分:0)

尝试在第一个查询中选择last_update字段,并将其作为AND子句添加到update语句中,以确保更多唯一性。