插入查询不起作用

时间:2012-03-30 06:18:53

标签: php mysql

嗨我有一个小查询从一个mysql数据库中获取数据并将其插入到一个重复的表中,问题是我从数据库中获取相关数据很好,但我似乎无法将它带入新的数据库,我启用了错误报告,但我没有收到任何错误。

以下是我的代码:

$dbhost                         = "";
$dbuser                         = "";
$dbpass                         = "";
$dbname                         = "";
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ("Error connecting to  database");
mysql_select_db($dbname);
$result = mysql_query("SELECT * FROM ip_stats WHERE DATE(date) = CURDATE()") 
or die(mysql_error());  
// keeps getting the next row until there are no more to get
while($row = mysql_fetch_array( $result )) {
    $id   = $row['id'];
    $date   = $row['date'];
    $ip   = $row['ip'];
    $hostname   = $row['hostname'];
    $company_name   = $row['company_name'];
    $address   = $row['address'];
    $descr   = $row['descr'];

    echo "$id - $date - $ip - $hostname - $company_name - $address - $descr"; 
    ?>
    <br />
    <?php
    $query = "INSERT INTO `ip_stats11` (`id`, `ip`, `date`, `hostname`, `company_name`, `address`, `descr`, `updated`)
      VALUES ('$id', '$ip', '$date', '$hostname', '$company_name', '$address', '$descr', 'yes')";
    echo "updated $ip"; ?><br /><?php
}

1 个答案:

答案 0 :(得分:0)

@klijn可能是您忘记执行INSERT查询的。 但是,我建议这样做更简单,更快:

$result = mysql_query('
    INSERT INTO `ip_stats11` (
        `id`, `ip`, `date`, `hostname`, `company_name`, `address`, `descr`, `updated`
    )
    SELECT ip_stats.*, 'yes' 
    FROM   ip_stats 
    WHERE  DATE(date) = CURDATE()
'); 

另一件事 - 这个结构:

WHERE  DATE(date) = CURDATE()

可能效率不高。您将函数应用于日期列。如果它是DATE数据类型,则不需要它,您应该将其保留。如果它是DATETIME并且你想截断时间部分,那么这样做将使mysql(以及大多数其他RDBMS-es)也无法使用该列上的任何索引。

这是一个更好的方法:

WHERE  `date` BETWEEN CURRENT_DATE
                  AND CURRENT_DATE + INTERVAL 1 DAY - INTERVAL 1 SECOND

这样做的方式是CURRENT_DATE将被投射到DATETIME(假设date列是DATETIMETIMESTAMP,并且它将具有零时间段,表示当天的开始和我们的BETWEEN ... AND范围的开始。在范围的结尾,我们说:请明天使用:

CURRENT_DATE + INTERVAL 1 DAY

实际上,这是比current_date晚1天的第一秒。这不完全正确,因为BETWEEN...AND...使用包含范围边界,因此我们使用- MINUS 1 SECOND减去一秒,以确保我们获得CURRENT_DATE指示的当天的最后一秒。