Gå til innhold

Slette en auksjon etter at det har gått en dag etter angitt timestamp.


Anbefalte innlegg

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
Videoannonse
Annonse

				$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
				$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
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

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 av JohndoeMAKT
Lenke til kommentar
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 :D

Lenke til kommentar

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 av JohndoeMAKT
Lenke til kommentar

Slettet :D

 

 

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 av Dryper
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...