Dryper Skrevet 30. mars 2008 Del Skrevet 30. mars 2008 Hei jeg driver med å lage ei auksjonside (bare for gøy da) som skal slette auksjonene etter 1 dag (slettes etter timestamp) Men problemet er at jeg ikke vet helt hvordan Fikk denne av Joachim fra forumet, takker for den.. men noe er jo galt her :S hvordan skal jeg gjøre det? timestamp er den tida som ligger i dben (etter at den er gått er auksjonen avsluttet og det skal gå 1 dag til den skal bli slettet) Håper noen kan dette :=) $hent = mysql_query("SELECT * FROM auksjon"); $henta = mysql_fetch_array($hent); while ($henta = mysql_fetch_array($hent)){ $dag = date(time()); $jah = ($henta['timestamp'] + 86400); if ($dag > $jah){ $id = $henta['id']; mysql_query("DELETE * FROM auksjon WHERE id = '$id'"); } else{ echo $jah; echo "<br />"; } Hilsen Dryper Lenke til kommentar
Wackamole Skrevet 30. mars 2008 Del Skrevet 30. mars 2008 $sql = mysql_query("SELECT * FROM auksjon"); while ($row = mysql_fetch_array($sql)){ $today = date(time()); $time_stamp = ($row['timestamp'] + 86400); if ($today > $time_stamp){ $id = $row['id']; mysql_query("DELETE * FROM auksjon WHERE id = '$id'"); } else{ echo $time_stamp; echo "<br />"; } Tror nesten du på utdype deg litt mer i hva som er galt, og hvilken error du får Lenke til kommentar
Dryper Skrevet 30. mars 2008 Forfatter Del Skrevet 30. mars 2008 $sql = mysql_query("SELECT * FROM auksjon"); while ($row = mysql_fetch_array($sql)){ $today = date(time()); $time_stamp = ($row['timestamp'] + 86400); if ($today > $time_stamp){ $id = $row['id']; mysql_query("DELETE * FROM auksjon WHERE id = '$id'"); } else{ echo $time_stamp; echo "<br />"; } Tror nesten du på utdype deg litt mer i hva som er galt, og hvilken error du får ok jeg skal ta dette hvordan det skal gå.. 1. Brukeren legger inn en auksjon på 1 dag 2. timestamp som er en dag senere legges i databasen 3. Etter en dag kommer det opp at "Auksjon Avsluttet" 4. Dagen etter vil jeg at auksjonen skal slettes fra databasen. da kan den bruke timestampet og slette det etter 1 dag er gått. Men hvordan gjøres nummer 4? Du kan jo gå in på http://globalmafia.sytes.net/projects/auksjon og se selv kansje du fatter.. Auksjon nummer 3 har den timestampen som din kode genererte. det som skjedde var at Auksjonen varer 3 dager lengre :S Dryper Lenke til kommentar
itsmebth Skrevet 30. mars 2008 Del Skrevet 30. mars 2008 DELETE FROM auksjon WHERE id = $id Personlig ville jeg ikke ha slettet auksjonen etter at den er ferdig, men f.eks. satt active til 0. Lenke til kommentar
Dryper Skrevet 30. mars 2008 Forfatter Del Skrevet 30. mars 2008 DELETE FROM auksjon WHERE id = $id Personlig ville jeg ikke ha slettet auksjonen etter at den er ferdig, men f.eks. satt active til 0. hvordan gjøres dette? jeg har aleerede laget det for det var planen Lenke til kommentar
JohndoeMAKT Skrevet 30. mars 2008 Del Skrevet 30. mars 2008 (endret) Beklager men Joachims løsning er helt uaktuelt. Omtrent alt av databehandling i en database bør bli gjort av databasen selv. Dersom du på ett eller annet tidspunkt finner deg selv i å skrive "SELECT * FROM table;" bør du seriøst analysere hva du egentlig ønsker å gjøre. "UPDATE auksjon SET deleted = 1 WHERE expired < DATE_SUB( NOW(), INTERVAL 1 DAY );" Fordi jeg mener også som itsmebth at ting ikke skal slettes men bare flagges bruker jeg UPDATE. expired er alene på venstresiden så en index skal fungere fint. Så da henter du ut de ti auksjonene som utgår først med "SELECT id FROM auksjon WHERE !deleted AND expired > " . date( 'Y-m-d H:i:00' ) . " ORDER BY expired ASC LIMIT 10;". OBS: Her har jeg brukt date() med minuttnøyaktighet, hvor MySQL-funksjonen NOW() kan brukes. Dette gjør jeg fordi MySQLs query cache ikke benyttes når NOW() er i bruk og ved å sette nøyaktigheten opp til ett minutt økes også sjansen for query cache hit. Endret 30. mars 2008 av JohndoeMAKT Lenke til kommentar
Dryper Skrevet 30. mars 2008 Forfatter Del Skrevet 30. mars 2008 Beklager men Joachims løsning er helt uaktuelt. Omtrent alt av databehandling i en database bør bli gjort av databasen selv. Dersom du på ett eller annet tidspunkt finner deg selv i å skrive "SELECT * FROM table;" bør du seriøst analysere hva du egentlig ønsker å gjøre. "UPDATE auksjon SET deleted = 1 WHERE expired < DATE_SUB( NOW(), INTERVAL 1 DAY );" Fordi jeg mener også som itsmebth at ting ikke skal slettes men bare flagges bruker jeg UPDATE. expired er alene på venstresiden så en index skal fungere fint. Så da henter du ut de ti auksjonene som utgår først med "SELECT id FROM auksjon WHERE !deleted AND expired > " . date( 'Y-m-d H:i:00' ) . " ORDER BY expired ASC LIMIT 10;". OBS: Her har jeg brukt date() med minuttnøyaktighet, hvor MySQL-funksjonen NOW() kan brukes. Dette gjør jeg fordi MySQLs query cache ikke benyttes når NOW() er i bruk og ved å sette nøyaktigheten opp til ett minutt økes også sjansen for query cache hit. Kunne du klart å sette koden opp slik den skal vaere ? jeg fattet ikke så mye av det derren Lenke til kommentar
JohndoeMAKT Skrevet 30. mars 2008 Del Skrevet 30. mars 2008 (endret) Hvordan ser databasen din ut? Dersom du f.eks lagrer tidspunkt som et vanlig integerfelt med UNIX-time er du ganske fucked og du bør med en gang gå over til et datofelt som vil utvide mulighetene dine i MySQL ganske så mye. Her er et enkelt eksempel på hvordan jeg tenkte meg denne tabellen: http://spackfish.com/hw/database.txt CREATE TABLE `auction` ( `id` mediumint(8) unsigned NOT NULL auto_increment, `expires` datetime NOT NULL default '0000-00-00 00:00:00', `userid` mediumint(8) unsigned NOT NULL, `objectid` mediumint(8) unsigned NOT NULL, `buyerid` mediumint(8) unsigned default NULL, `deleted` tinyint(1) NOT NULL default '0', PRIMARY KEY (`id`), KEY `expires` (`expires`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci; Her er da et eksempel på litt tilhørende PHP-kode: http://spackfish.com/hw/database2.txt Klikk for å se/fjerne innholdet nedenfor /** * Flags auctions with deleted one day after the auction has ended * * return boolean */ function deleteExpiredAuctions() { mysql_query( "UPDATE auctions SET deleted = 1 WHERE expired < DATE_SUB( NOW(), INTERVAL 1 DAY );" ); if ( somemysqlerror ) { throwsomeerror; return false; } else { return true; } } /** * Adds an auction * * param $userId integer * param $objectId integer * param $expires integer * return bolean */ function addAuction( $userId, $objectId, $expires = null ) { if ( !is_int( $userId ) || $userId < 1 || !is_int( $objectId ) || $objectId < 1 ) { //throw some error return false; } if ( empty( $expires ) || !is_int( $expires ) ) { $expires = time() + 86400; } mysql_query( "INSERT INTO auctions ( expires, userid, objectid ) VALUES ( FROM_UNIXTIME( $expires ), $userId, $objectId );" ); if ( somemysqlerror ) { throwsomeerror; return false; } else { return true; } } /** * Deleted an auction * * param $auctionId integer * return boolean */ function deleteAuction( $auctionId ) { if ( !is_int( $auctionId ) || $auctionId < 1 ) { return false; } mysql_query( "UPDATE auctions SET deleted = 1 WHERE id = $auctionId;" ); if ( somemysqlerror ) { return false; } else { return true; } } /** * Retrieves the n first-ending auctions where n is $number * * param $number integer * return mixed */ function getFirstEndingAuctions( $number = 10, $offset = 0 ) { if ( !is_int( $number ) || $number < 1 ) { $number = 10; } if ( !is_int( $offset ) || $offset < 1 ) { $offset = 0; } mysql_query( "SELECT SQL_CACHE id FROM auctions WHERE !deleted AND expires >= '" . date( 'Y-m-d H:i:00' ) . "' ORDER BY expires ASC LIMIT " . ( $offset ? $offset . ', ' : null ) . "$number;" ); if ( somemysqlerror ) { return false; } else { return themysqlresult; } } /** * Fetches a selection of a users auction ordered by ascending expiration * * param $userId integer * param $notDeleted boolean * param $limit integer * param $offset integer * return mixed */ function getUsersAuctions( $userId, $notDeleted = true, $limit = 10, $offset = 0 ) { if ( !is_int( $userId ) || $userId < 1 ) { return false; } if ( !is_int( $number ) || $number < 1 ) { $number = 10; } if ( !is_int( $offset ) || $offset < 1 ) { $offset = 0; } mysql_query( "SELECT SQL_CACHE id FROM auctions WHERE userid = $userId " . ( $notDeleted ? "AND !deleted " : null ) . "ORDER BY expires LIMIT " . ( $offset ? $offset . ', ' : null ) . "$number;" ); if ( somemysqlerror ) { return false; } else { return themysqlresult; } } MySQL error og objekt handling må du legge til selv da jeg ikke kan syntaks på dette. ( Bruker normalt et rammeverk som fikser dette for meg ) EDIT: Tabellen skal selvsagt hete "auctions" og ikke "auction". Endret 30. mars 2008 av JohndoeMAKT Lenke til kommentar
Dryper Skrevet 30. mars 2008 Forfatter Del Skrevet 30. mars 2008 (endret) Slettet Dette gikk ikke helt. :S mysql_query( "UPDATE auksjon SET status = 1 WHERE timestamp < DATE_SUB( NOW(), INTERVAL 1 DAY );" ); if ( somemysqlerror ) { throwsomeerror; return false; } else { return true; } Dette er koden :S hva er galt? Endret 30. mars 2008 av Dryper Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå