0

我有这个横幅系统可以在我的网站上运行。我有一个 SQL 表,其中存储 id、链接、标题、打印和点击等内容。

所以,我需要在给定的页面上随机打印它们,并使用 prints + 1 值更新打印列(这是显示此横幅的次数)。我正在使用 2 个查询,一个用于选择,然后一个用于更新,但我知道只使用一个查询是可能的,但我听说 SQL + PHP 不太健康。但是,当我运行脚本时,它添加了两次值,应该多打印一次,它添加了 2。已经检查了脚本是否每个 id 运行两次,但不是,它运行正常。代码如下:

$query = 'SELECT * FROM banners WHERE (NOW() BETWEEN ban_start_date AND ban_final_date) AND ban_paid = "y" AND ban_active = "a" ORDER BY RAND() LIMIT 3';
    $query = mysql_query($query) or die(mysql_error());
    while($response = mysql_fetch_array($query)){
        extract($response); 
        $banners[] = array('id' => $ban_id, 'code' => $ban_code, 'img' => $ban_img, 'title' => $ban_title, 'link' => $ban_link, 'prints' => $ban_prints);
        $ban_qr = 'UPDATE banners SET ban_prints = ban_prints + 1 WHERE ban_id = "' . $ban_id . '"';
        $ban_qr = mysql_query($ban_qr) or die(mysql_error);
    }
4

1 回答 1

0

您不能在一个查询中既选择行又更新它们。您可以更新您在一个查询中选择的所有行(使用WHERE ban_id IN (list of IDs)),但您仍然至少需要两个查询。

$query = "
    SELECT 
        `ban_id` AS `id`, 
        `ban_code` AS `code`, 
        `ban_img` AS `img`, 
        `ban_title` AS `title`, 
        `ban_link` AS `link`, 
        `ban_prints` AS `prints` 
    FROM
        `banners`
    WHERE 
        `ban_paid` = 'y'
    AND 
        `ban_active` = 'a'
    AND
        `ban_start_date` < CURRENT_TIMESTAMP
    AND
        `ban_final_date` > CURRENT_TIMESTAMP
    ORDER BY
        RAND()
    LIMIT 
        3
    ";

$result = mysql_query($query) or die(mysql_error());
while ($row = mysql_fetch_array($result)) {
  $banners[] = $row;
  $ids[] = $row['id'];
}

$query = "
    UPDATE 
        `banners` 
    SET 
        `ban_prints` = `ban_prints` + 1 
    WHERE 
        `ban_id` IN (" . implode(',', $ids) . ")
    ";

mysql_query($query) or die(mysql_error());
于 2012-08-20T21:35:15.387 回答