2012-03-30 9 views
0

Hallo ich habe eine kleine Abfrage, die Daten aus einer MySQL-Datenbank nimmt und fügt es in eine doppelte Tabelle, das Problem ist, ich bekomme die relevanten Daten aus der Datenbank, aber ich kann nicht scheinen, es zu bekommen In der neuen Datenbank habe ich Fehlermeldungen aktiviert, aber ich bekomme keine Fehler.Abfrage einfügen Funktioniert nicht

Unten ist mein Code:

$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

Sie vergessen, die eigentliche Insert-Ausführung zu tun – ajreal

+0

Wo ist die Zeile, die $ query ausführt? – egrunin

+0

Danke, ich kann nicht glauben, dass ich das nicht bemerkt habe –

Antwort

0

@klijn ist wahrscheinlich richtig, dass Sie die INSERT Abfrage auszuführen vergessen. Allerdings würde ich raten, dies einfacher zu tun und schneller:

$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() 
'); 

Eine andere Sache - dieses Konstrukt:

WHERE DATE(date) = CURDATE() 

Könnte nicht sehr effizient sein. Sie wenden eine Funktion auf die Datumsspalte an. Wenn das vom DATE-Datentyp ist, brauchen Sie das nicht und Sie sollten es weglassen. Wenn es ein DATETIME ist und Sie den Zeitteil abschneiden wollen, dann macht es das Ausführen von mysql (und auch die meisten anderen RDBMS-es) unmöglich, Indizes für diese Spalte zu verwenden.

Hier ist eine bessere Art und Weise:

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

Die Art und Weise dies funktioniert, ist, dass CURRENT_DATE zu einem DATETIME- gegossen werden wird (vorausgesetzt, die date Spalte ist ein DATETIME oder TIMESTAMP, und es wird eine Null timepart hat, was anzeigt, die . Start des Tages und dem Beginn unseres BETWEEN ... AND Bereich Für das Ende des Bereichs, sagen wir: bitte morgen verwenden:

CURRENT_DATE + INTERVAL 1 DAY 

, die später in der Tat die erste Sekunde des 1 Tag ist als aktuelles Datum. Das ist nicht ganz korrekt, weil BETWEEN...AND... inklusive Bereichsgrenzen verwendet, so dass wir eine Sekunde mit der - MINUS 1 SECOND subtrahieren, um sicherzustellen, dass wir die letzte Sekunde des durch CURRENT_DATE angezeigten Tages erhalten.