/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Delete fra MYsql database....
Fra : Jeppe Christensen


Dato : 31-10-05 20:34

Hey har et problem med at den ikke sletter fra min database...

Min kode ser således ud:

    if($_SESSION[userid]){
             mysql_connect("$server","$user","$password");
mysql_select_db("$database");


$ip = $_SERVER['REMOTE_ADDR'];

             $tjek_ip = mysql_query("SELECT COUNT(*) AS antal FROM online
WHERE ip='$ip'") or die(mysql_error());

             if(!mysql_result($tjek_ip,0)) {
             mysql_query("INSERT INTO online (time, ip, userid, username,
hus) VALUES
(NOW(),'$ip','$_SESSION[userid]','$_SESSION[username]','$_SESSION
[husnumber]')") or die(mysql_error());
} else {
mysql_query("UPDATE online SET time=NOW() WHERE
ip='$ip'") or die(mysql_error());
}            

            mysql_query("DELETE FROM online WHERE date_add(time,
interval 2 MINUTE) < NOW()") or die(mysql_error());
         
   
            $antal_online = mysql_query("SELECT COUNT(*) AS antal FROM
online") or die(mysql_error());
            
            $online = ".mysql_result($antal_online,0).";
            }

Det er følgende sætning der ikke ser ud til at virker:

mysql_query("DELETE FROM online WHERE date_add(time, interval 2
MINUTE) < NOW()") or die(mysql_error());

Da den ikke slettet dem der er over 2 min gamle....

mvh. Jeppe Christensen...



--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

 
 
Kasper Johansen (31-10-2005)
Kommentar
Fra : Kasper Johansen


Dato : 31-10-05 22:23

"Jeppe Christensen" <mr.puity@gmail.com> skrev i en meddelelse
news:436671b5$0$41140$14726298@news.sunsite.dk...
> mysql_query("DELETE FROM online WHERE date_add(time, interval 2
> MINUTE) < NOW()") or die(mysql_error());

Kender ikke til MySQL's datoformat da jeg ikke bruger den.

Men nu hvor du bruger PHP vil jeg da foreslå at du også bruger
UNIX-timestamps der, som man normalt gør i PHP.


Derved kunne du lave noget lignende:

<?
$dato = strtotime("-10 minutes");
mysql_query("DELETE FROM online WHERE dato < '$dato'") or
die(mysql_error());
?>


MySQL understøtter allerede en del UNIX-timestamp-funktioner. Som f.eks.
"FROM_UNIXTIME" der næsten fungere som PHP's date() bare i SQL-sætningen.



Hvis du ønsker at bruge UNIX-timestamps kan du omskrive dit script til noget
ala:

<?
$tiden_nu = time();
$tiden_10_min = strtotime("-10 minutes");

mysql_query("DELETE FROM online WHERE ip = '$_SERVER[REMOTE_ADDR]' ||
dato < '$tiden_10_min'") or die(mysql_error());
mysql_query("INSERT INTO online (ip, dato) VALUES
('$_SERVER[REMOTE_ADDR]', '$tiden_nu')") or die(mysql_error());
?>


Læg mærke til at jeg ikke laver noget tjek i databasen, om der allerede
findes en med samme IP. I stedet vælger jeg at slette der hvor IP'en er den
samme. Jeg vil tror at det koster lige så meget performance at gøre det på
denne måde (da du både bruger UPDATE i MySQL, samt en masse linjer kode på
at tjekke det).

Det gør bare det hele lidt simplere i PHP.


Vær opmærksom på at jeg ikke har testet koden.



PS. MySQL-sprørgsmål bør stilles i "dk.edb.database" :)


--
Mvh Kasper Johansen



Peter Brodersen (01-11-2005)
Kommentar
Fra : Peter Brodersen


Dato : 01-11-05 02:35

On Mon, 31 Oct 2005 22:22:57 +0100, "Kasper Johansen"
<kasper@johansen.tdcadsl.dk> wrote:

>> mysql_query("DELETE FROM online WHERE date_add(time, interval 2
>> MINUTE) < NOW()") or die(mysql_error());
>
>Kender ikke til MySQL's datoformat da jeg ikke bruger den.
>
>Men nu hvor du bruger PHP vil jeg da foreslå at du også bruger
>UNIX-timestamps der, som man normalt gør i PHP.

Jeg vil fraråde at gemme UNIX-timestamps i MySQL. Der er ingen grund
til at holde tidligere tiders standarder fortsat i live.

MySQL har nogle fine datofelter med tilsvarende fine funktioner, der
tillige gør forespørgsler lettere at læse (fx hvis man skal lægge
præcis en måned til en aktuel dato - strtotime() kan dog delvist
kompensere for det, men det kræver at man flytter logikken ind i
applikationen).

Mit bud på en simpel forespørgsel til formålet:

DELETE FROM online WHERE dato < (NOW() - INTERVAL 2 MINUTE)

--
- Peter Brodersen

Kasper Johansen (01-11-2005)
Kommentar
Fra : Kasper Johansen


Dato : 01-11-05 10:25

"Peter Brodersen" <usenet2005@ter.dk> skrev i en meddelelse
news:dk6gom$o91$1@news.klen.dk...
> Jeg vil fraråde at gemme UNIX-timestamps i MySQL. Der er ingen grund
> til at holde tidligere tiders standarder fortsat i live.
>
> MySQL har nogle fine datofelter med tilsvarende fine funktioner, der
> tillige gør forespørgsler lettere at læse (fx hvis man skal lægge
> præcis en måned til en aktuel dato - strtotime() kan dog delvist
> kompensere for det, men det kræver at man flytter logikken ind i
> applikationen).
>
> Mit bud på en simpel forespørgsel til formålet:
>
> DELETE FROM online WHERE dato < (NOW() - INTERVAL 2 MINUTE)

Som jeg nævnte før, så mente jeg at han burde bruge det, netop fordi at PHP
selv bruger det. Desuden understøtter MySQL faktisk det meste selv, nu skrev
jeg det bare hurtigt i PHP, men man kunne jo også have lavet noget af det
samme direkte i MySQL, ved hjælp af timestamps.

Desuden så bliver timestamps jo understøttet af et væld af sprog, deriblandt
JavaScript hvor man let kan overføre et timestamp fra PHP til JavaScript på
klientsiden.


Jeg skal ikke kunne sige om PHP understøtter MySQL's format af tid, men det
er umiddelbart mit indtryk at det ikke gør? Eller kan man få et
MySQL-tidformat ud som et timestamp, således at man kan bruge det sammen med
PHP's datoformater bagefter?

Kan du ridse nogle punkter op, hvorfor at man burde bruge MySQL's format
fremfor PHP's?

Ellers kunne det jo være, at man, som du skriver, burde sætte sig lidt mere
ind i MySQL's format :)


Endnu et spørgsmål. Jeg regner med at MySQL er hurtigere til at håndtere
dens egen format. Men hvad er forskellen i performance? Er der nogen der har
erfaringer, målt det, eller sidder med et link til en god guide?


--
Med venlig hilsen
Kasper Johansen



Peter Brodersen (01-11-2005)
Kommentar
Fra : Peter Brodersen


Dato : 01-11-05 11:42

On Tue, 1 Nov 2005 10:24:44 +0100, "Kasper Johansen"
<kasper@johansen.tdcadsl.dk> wrote:

>Jeg skal ikke kunne sige om PHP understøtter MySQL's format af tid, men det
>er umiddelbart mit indtryk at det ikke gør? Eller kan man få et
>MySQL-tidformat ud som et timestamp, således at man kan bruge det sammen med
>PHP's datoformater bagefter?

MySQL har UNIX_TIMESTAMP() til at konvertere et datofelt til unixtime,
hvis det er nødvendigt.

Jeg tror blot at min holdning er, at data skal gemmes i dets
tilsvarende format. Unix timestamp er et system til at henvise til
sekunder i et givent tidsinterval, og som sådan et subsæt af et
generelt tidssystem. Derfor ser jeg ingen grund til at tage
udgangspunkt i timestamps. Den direkte data giver i mine øjne også
lettere overblik, når man skimmer sit indhold igennem.

>Kan du ridse nogle punkter op, hvorfor at man burde bruge MySQL's format
>fremfor PHP's?

Altså, hvis man er mest hjemme i PHP, og det i øvrigt ikke gør den
store forskel om man har logik i database-opslagene eller i
applikationen, så er det selvfølgelig bare hvad der passer én bedst.
Man kan fx komme langt med strtotime() og mktime() i PHP.

Unix timestamps kan virke appellerende, fordi man blot kan bruge
simpel matematik (fx +(60*60*24) og lignende). Dog kan man let komme
til kort i forhold til at tilføje en måned, et år eller lignende, hvor
der indgår variable. I stedet for at genopfinde datologik, vil man
alligevel være tvunget til at bruge en anden håndtering. For PHPs
vedkommende kunne det fx være:

list($y,$m,$d,$h,$i,$s) = explode(" ",date("Y m d H i s",$somedate));
$plusonemonth = mktime($h,$i,$s,$m+1,$d,$y);

I MySQL kan en tilsvarende løsning være:

SELECT somedate + INTERVAL 1 MONTH AS plusonemonth ..

Dertil kommer at opløsningen eller omfanget i unix timestamps måske
ikke er godt nok i forhold til mikrosekunder eller datoer uden for år
1901 til 2038.

Hvad angår formattering af data, så findes der også et væld af
funktioner i MySQL, hvis det er den del, man er bekymret for, og man
er frisk på at lave formatteringen i database-laget:
http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html

>Ellers kunne det jo være, at man, som du skriver, burde sætte sig lidt mere
>ind i MySQL's format :)

Det kan måske også bare være, at jeg ikke bryder mig om unixtime
Eller måske snarere den unødige konvertering

>Endnu et spørgsmål. Jeg regner med at MySQL er hurtigere til at håndtere
>dens egen format. Men hvad er forskellen i performance? Er der nogen der har
>erfaringer, målt det, eller sidder med et link til en god guide?

Forskellen er ret sikkert minimal. Sandsynligvis er det vilkårligt
hurtigere at benytte sig af unixtime. Her kan man klare sig med en
32-bit int, hvorimod et DATETIME-felt optager 64 bit. I praksis har
det sandsynligvis ingen betydning.

--
- Peter Brodersen

Jeppe Christensen (01-11-2005)
Kommentar
Fra : Jeppe Christensen


Dato : 01-11-05 22:56

Interresant diskution...

Men fik det til at virke ved at bruge følgende løsning:

<?PHP
$timestamp = strtotime(- 2 minutes);
$tid_2 = date("d-m-y H:i" $timestamp);

mysql_query("DELETE * FROM online WHERE time < '$tid_2'") or die(mysql_error());
?>

Prøvede begge foreslag men var det her jeg kunne få til at virke.

Ska siges at den tid jeg satte ind i time var*

$tid = time();
$tid_now = date("d-m-y H:i" $tid); <-------*

mvh. Jeppe Christensen


--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408927
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste