Delete from

PHP

19 svar · 314 visningar · startad av Viking

Medlem sedan maj 20003 652 inlägg
Trådstart#1

Jag vill ta bort alla rader från en tabell (MySQL), säg att den heter viking, som varit där mer än fem minuter. Hur kan man lösa detta?

Detta har jag gjort själv efter vad jag förstått av manualen, men det fungerar inte så bra:

$mktime = mktime(date("H"), date("i")+1, date("s"), date("m"), date("d"), date("Y"));
mysql_query("DELETE FROM viking WHERE date > '$mktime'");

Nån som har några förslag? :)

Medlem sedan dec. 200012 464 inlägg
#2
mysql_query("delete from viking where date + interval 5 minute <= current_timestamp")
Medlem sedan maj 20003 652 inlägg
#3

Tack! SKa fixa det när jag kommer hem igen! :)

Medlem sedan nov. 19991 033 inlägg
#4

Gjorde en anmälning till nyhetsbrev och använder en funktion som tar bort alla rader som inte aktiverats inom en viss tid. Det verkar som att tabellen får ganska mycket outnyttjat utrymme när man gör så här vilket innebär att tabellen bör optimeras mellan varven.
Du kan lösa det genom att använda funktionen OPTIMIZE. Låt säga att den finns i skriptet och körs direkt efter ovanstående om datumet uppfyller kravet.

mysql_query("OPTIMIZE TABLE viking")
Medlem sedan maj 20003 652 inlägg
#5

Optimeras?

Medlem sedan maj 20003 652 inlägg
#6

Hmm, detta fungerar inte:

mysql_query("DELETE FROM online WHERE ip = '$REMOTE_ADDR'");

$date = time();
mysql_query("INSERT INTO online VALUES( '$REMOTE_ADDR', '$date' )");
mysql_query("DELETE FROM online WHERE date 1 INTERVAL 5 MINUTE <= current_timestamp");

Ser ni felet? :o :q

Medlem sedan mars 20007 896 inlägg
#7

Du har en 1:ta istället för ett plus i din sista SQL-fråga.

Medlem sedan maj 20003 652 inlägg
#8

Oj :)

Medlem sedan maj 20003 652 inlägg
#9
mysql_query("DELETE FROM online WHERE ip = '$REMOTE_ADDR'");

$date = time();
mysql_query("INSERT INTO online VALUES( '$REMOTE_ADDR', '$date' )");
mysql_query("DELETE FROM online WHERE date + INTERVAL 5 MINUTE <= current_timestamp");

Hmm... $REMOTE_ADDR, visst är det IP-nummret? Eller? Sen funkar inte intervaldeleten heller :(

Ja, kolumnerna finns där ;)

Medlem sedan maj 20003 652 inlägg
#10

Hmm, ingen som vet något? :o

Medlem sedan dec. 200012 464 inlägg
#11

Lägg till lite felhantering

mysql_query("DELETE FROM online WHERE ip = '$REMOTE_ADDR'");
$date = time();
mysql_query("INSERT INTO online VALUES( '$REMOTE_ADDR', '$date' )");
mysql_query("DELETE FROM online WHERE date + INTERVAL 5 MINUTE <= current_timestamp") or die(mysql_error());
Medlem sedan maj 20003 652 inlägg
#12
You have an error in your SQL syntax near '5 MINUTE <= current_timestamp' at line 1
Medlem sedan nov. 19991 033 inlägg
#13
mysql_query("INSERT INTO online VALUES( '$REMOTE_ADDR', '$date' )");

ser inte riktigt ut att följa standarden.
Bör du inte ange i villka kolumner du vill skriva in värdet i?

Medlem sedan dec. 200012 464 inlägg
#14

Ok, om du testar detta i stället då

mysql_query("DELETE FROM online WHERE date_add(date,INTERVAL 5 MINUTE) <= current_timestamp") or die(mysql_error());

Det exempel jag skrev kräver 3.23 av Mysql enligt dokumentationen.

Medlem sedan dec. 200012 464 inlägg
#15

FlashX

Om man gör insert på alla kolumner som finns i tabellen så behöver man inte ange någon kolumnlista. Värdena måste då anges i samma ordning som kolumnerna är definierade.

Medlem sedan nov. 19991 033 inlägg
#16

Går det inte lika gärna att skriva

$date_out = time()-300;
mysql_query("DELETE FROM online WHERE date < '$date_out '");

LarsG, tack, ska lägga det på minnet.

[r]
skrev lite fel i koden ovanför

[Redigerat av FlashX den 20 jan 2002]

Medlem sedan maj 20003 652 inlägg
#17

Tack så mycket för hjälpen!

Ska testa nu! :)

Medlem sedan maj 20003 652 inlägg
#18

Hmm

$date = time() - 300;
mysql_query("DELETE FROM online WHERE date < $date");

mysql_query("DELETE FROM online WHERE ip = '$REMOTE_ADDR'") or die(mysql_error());
$date = time();

mysql_query("INSERT INTO online VALUES( '$REMOTE_ADDR', '$date' )");

Det som inte fungerar här är andra queryn där man tar bort alla rader som har ip = $REMOTE_ADDR.

Nån som vet varför? :q

Medlem sedan nov. 19991 033 inlägg
#19

Borde fungera tycker man.
Testa om det här fungerar.

// timestamp
$date = time();
// timestamp minus utloggningstiden
$date_out = time()- 300;
// datumet i månaden
$date_optimize = date(d);
// Besökarens ip
$ip = $HTTP_SERVER_VARS[REMOTE_ADDR];

// Plocka bort alla ip-nummer som funnits länre än $date_out
mysql_query("DELETE FROM online WHERE date < $date_out");
// Ta bort aktuell besökares ip ifall den redan existerar
mysql_query("DELETE FROM online WHERE ip='$ip'");
// Lägg till aktuell besökares ip
mysql_query("INSERT INTO online (ip, date) VALUES ('$ip', '$date')");
// Optimera tabellen en gång i månaden
if ($date_optimize == 01) {
mysql_query("OPTIMIZE TABLE online");
}

Nu är det ju besökarna själva som sköter tillägg/radering av rader och då kommer databasen att växa i takt med antalet besökare. Alla rader som raderats allokeras fortfarande av MySQL även om de inte existerar. Kan därför vara bra att frigöra utrymmet genom att optimera tabellen någon gång ibland.

Eftersom bl.a. flera företag och skolor går ut via en proxy, så blir ju inte denna typen av online-statistik särskilt tillförlitlig men det kanske inte gör något.

[Redigerat av FlashX den 20 jan 2002]

Medlem sedan maj 20003 652 inlägg
#20

Ok, thx

267 ms totalt · 4 externa anrop · v20260731065814-full.d34c6d5a
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)