2012-03-30 15 views
0

こんにちは私は1つの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 
} 
+4

実際の挿入実行を忘れた – ajreal

+0

'$ query'を実行する行はどこですか? – egrunin

+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も)はその列のインデックスを使用できなくなります。

ここでは、より良い方法です:date列を仮定すると、DATETIMETIMESTAMPであり、それが示すゼロtimepartを持つことになります(これが機能する方法はCURRENT_DATEはDATETIMEにキャストされるということです

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

その日、私たちのBETWEENの開始の開始... AND範囲範囲の終わりのために、私たちが言う:。明日使用してください:

1日の第一、第二、後でよりも実際には
CURRENT_DATE + INTERVAL 1 DAY 

現在の日付。 BETWEEN...AND...は包括的な範囲の境界を使用しているので、これは完全に正しいとは言えないので、CURRENT_DATEで示される日の最後の1秒が確実に得られるように、1秒を- MINUS 1 SECONDで引いています。

関連する問題