2009-08-06 6 views
0

Je veux que les gens soient capables de "bump" ce qu'ils ont écrit dans ma base de données mais en même temps seulement permettre à l'entrée d'être dans la table une fois à la fois.Permet aux utilisateurs de remplacer une entrée qu'ils ont soumise toutes les heures?

Par exemple:

Code de Jim est 5555. Jim entre son code et il tire au bas de la table. Après 34 minutes, il essaie d'entrer à nouveau son code (parce que d'autres personnes ont entré leur code entre maintenant et ensuite) mais obtient une erreur d'affichage lui laissant savoir qu'il a encore 26 minutes à attendre.

Joe entre son code et attend une heure et cinq minutes et est capable de repousser son code vers le bas à nouveau.

Fondamentalement, j'affiche des données de bas en haut dans ma table.

Y at-il un moyen de le faire facilement?

function some_more_custom_content() { 

    $output="<BR>"; 

    ob_start(); 

    if ($_REQUEST['code'] != "") { 
     $code = $_REQUEST['code']; 
     $query="INSERT INTO `fc` (`code`,`datetime`) values ('" . mysql_real_escape_string($code) . "', now())"; 
     $result=mysql_query($query); 
     $entry['datetime'] = strtotime($entry['datetime']); 

     while ($fetch_array = mysql_fetch_array($result)) { 
      $seconds = time() - strtotime($fetch_array["datetime"]); 

      if ((time() - $entry['datetime']) < 60*60) { 
       echo ("The code " . htmlentities($code) ." was updated less than an hour ago."); 
      } else { 
       echo ("Inserted " . htmlentities($code) ." into the top."); 
      } 
     } 
?> 

Je reçois une erreur de syntaxe. Une idée où c'est?

MISE À JOUR: Obtenir erreur de:

Parse error: syntax error, unexpected $end

+0

Je l'ai déjà si les gens entrent des codes, il obtient le timbre maintenant() et il affiche même combien de temps il a été entré (parce que je jette la table entière dehors là). Comment puis-je vérifier si l'horodatage a été dans une heure et afficher cette erreur? C'est mon problème –

+1

J'ai indenté correctement votre code, vous devriez être en mesure de voir le problème vous-même. Astuce: "}". – deceze

+1

Comptez vos accolades d'ouverture '{' et accolades de fermeture '}', il vous manque quelques-uns de ces derniers. – deceze

Répondre

0

pas difficile:

Utilisez un horodatage pour la dernière "bosse temps".

Lorsqu'un code est entré, vérifiez s'il existe déjà dans la base de données.
Si ce n'est pas le cas, insérez-le et réglez l'horodatage de la bosse sur now().
S'il existe, vérifiez si l'horodatage était dans l'heure. Si c'était le cas, erreur d'affichage.
Si ce n'était pas le cas, réinitialisez-le à now().

Triez vos données d'affichage par horodatage.

EDIT:

$entry = /* get entry from database, assuming the case where it already exists */; 

// depending on the format of timestamp you get from the database, 
// you may have to convert it to a UNIX timestamp: 
$entry['timestamp'] = strtotime($entry['timestamp']); 

if ((time() - $entry['timestamp']) < 60*60) { // 60*60 is one hour in seconds 
    // display error 
} else { 
    // reset bump 
} 
+0

Je l'ai déjà pour que les gens entrent des codes, il reçoit le timbre now() et il affiche même depuis combien de temps il a été entré (parce que je jette toute la table là-bas). Comment puis-je vérifier si l'horodatage a été dans une heure et afficher cette erreur? C'est mon problème. –

+0

Réponse mise à jour. – deceze

+0

Si vous n'êtes pas familier avec les horodatages UNIX: http://en.wikipedia.org/wiki/Unix_time Une fois que vous vous êtes habitué à l'idée que tout est exprimé en secondes, il est facile de faire des calculs avec. – deceze

2

vous devez créer une table avec un index unique sur le champ de code, puis utiliser une requête comme:

 
INSERT INTO CODES (code) 
    VALUES (555) 
    ON DUPLICATE KEY UPDATE lastUpdated = 
       case when NOW() - INTERVAL 5 MINUTE > lastUpdated 
        then NOW() 
        else lastUpdated end 

Cela mettra à jour le champ LastUpdated uniquement dans les cas où il est plus vieux que 5 minutes

Questions connexes