2009-03-14 5 views
3

J'utilise PHP et PHPMyAdmin pour créer un petit site de profil. Je donne aux membres un numéro d'identification, basé sur lequel est le plus grand nombre actuellement dans la base de données, +1MySQL requête en PHP donne un mauvais résultat évident

J'ai fait 25 tests avant d'avoir le script PHP où je voulais que ce soit. J'ai ensuite supprimé ces 25 entrées en utilisant PHPMyAdmin.

Mais maintenant, quand mon code PHP fait ceci:

function getLatestID() { 
    $query = "SELECT max(member_id) FROM members"; 
    $result = @mysql_query($query) or showError("unable to query database for user information"); 
    if (!($record = mysql_fetch_array($result))) return null; 
    return $record[0]; 
} 

je reçois le mauvais numéro.

Scénario de test: la table de base de données contient 3 entrées, avec l'ID de 1, 2 et 3.

Je commence une session de débogage et de mettre un point d'arrêt sur le retour $record[0]. Je vérifie son contenu et au lieu de 3, ce qui est le plus grand nombre, il est 28.

Comme dans 25 + 3 = 28, les 25 entrées que je allready Deleted ...

Quelqu'un sait ce qui cause ceci et comment je peux le réparer?

Répondre

6

C'est probablement parce que vous avez défini auto_increment et que la requête renvoie l'ID le plus élevé. Lorsque vous avez supprimé les autres enregistrements, vous n'avez probablement pas réinitialisé le nombre d'incréments automatiques.

+0

En effet, cela l'a résolu. – Vordreller

+0

Pour l'avenir, si vous ne l'avez pas encore compris, vous pouvez le réinitialiser en accédant à l'onglet Opérations pour une table donnée. – VirtuosiMedia

5

Si vous utilisez auto_increment dans MySQL, la suppression d'enregistrements ne diminuera pas la valeur suivante.

Vous pouvez vider une table avec TRUNCATE TABLE mytable - cela réinitialisera la valeur.

+0

Merci, qui l'a résolu. Dommage que la commande truncate supprime toutes les valeurs. J'ai de la chance d'avoir seulement 3 entrées à remplacer. Imaginez des milliers d'entrées. Maintenant, je comprends pourquoi les gens ne suppriment généralement pas les entrées de leurs tables. – Vordreller

+0

@Vordreller: Non-sens; la suppression des entrées des tables est correcte. S'attendre à ce que l'ID AUTO_INCREMENT se recalcule miraculeusement ne l'est pas, et se fier à cela indiquerait en fait un design cassé. C'est "AUTO_INCREMENT", pas "AUTO_MAX". –

3

Vous pouvez également modifier la valeur que l'auto-incrément pense est la valeur suivante d'allouer:

ALTER TABLE members AUTO_INCREMENT = 3; 

Notez que si vous mettez une valeur qui est inférieure à la valeur actuelle max dans la colonne auto-incrément , ça va changer la valeur à ce MAX + 1. Pour voir ce que la valeur suivante actuelle est définie sur, faites ceci:

SHOW CREATE TABLE members; 

A la fin de la définition de la table, il va montrer « AUTO_INCREMENT = 26 » ou quoi que sa valeur actuelle.