Récupérer l’id suivant et précédent en PHP/MySQL
Pour un script, j’ai eu besoin de récupérer l’id suivant et précédent d’une table, mais comment faire ? Car si on fait un simple id+1 et qu’il existe pas, on va être assez embêté. On doit donc être sur qu’il existe et une simple condition serait trop simple coté PHP^^. Ainsi si on est sur l’id 10 et qu’on veut le précédent, on aura l’id 9 et 11 pour le suivant et si il existe pas le 12…
En réalité ce qu’il faut c’est que ça soit MySQL qu’il nous donne cet id, car lui ne se trompe pas et choisira automatiquement l’id suivant ou précédent.
Pour faire cela il faut connaitre vos opérateurs de comparaisons(lien dans le manuel), la liste:
$a == $b Egal TRUE si $a est égal à $b après le transtypage. $a === $b Identique TRUE si $a est égal à $b et qu'ils sont de même type. $a != $b Différent TRUE si $a est différent de $b après le transtypage. $a <> $b Différent TRUE si $a est différent de $b après le transtypage. $a !== $b Différent TRUE si $a est différent de $b ou bien s'ils ne sont pas du même type. $a < $b Plus petit que TRUE si $a est strictement plus petit que $b. $a > $b Plus grand TRUE si $a est strictement plus grand que $b. $a <= $b Inférieur ou égal TRUE si $a est plus petit ou égal à $b. $a >= $b Supérieur ou égal TRUE si $a est plus grand ou égal à $b.
Nous on en aura besoin de juste deux qui sont ceux de la ligne 6 et 7.
Voici le code:
// Id précédent: $stmt = $bdd->prepare('SELECT id FROM mf_table WHERE id < :id Order By id DESC LIMIT 1'); $stmt->execute(array('id' => 10)); $stmt->setFetchMode(PDO::FETCH_ASSOC); $precedent_id = $stmt->fetchColumn(); var_dump($precedent_id); // ID suivant: $stmt = $bdd->prepare('SELECT id FROM mf_table WHERE id > :id Order By id ASC LIMIT 1'); $stmt->execute(array('id' => 10)); $stmt->setFetchMode(PDO::FETCH_ASSOC); $suivant_id = $stmt->fetchColumn(); var_dump($suivant_id);
Pour faire simple:
Pour l’id précédent, on récupère tous les id en dessous de 10, c’est à dire: 1 2 3 4 5 6 7 8 9 si ils existent bien sur.
Ensuite on retourne le résultat pour y prendre à l’envers avec un Order By id DESC, c’est à dire: 9 8 7… et on place un petit LIMIT 1 pour en avoir qu’un seul: l’id précédent.
Pour l’id suivant même chose, mais dans l’autre sens.
C’est assez clair ?
Pour finir: on utilise les requête préparé pour éviter tout problème de sécu, c’est important et fetchColumn pour récupérer l’id directement dans une variable plutôt qu’un array avec fetch ou fetchAll et j’en passe:
array(1) { ["id"]=> string(1) "1" } array(1) { ["id"]=> string(2) "12" }
Par contre, il faudra toujours une condition pour le premier et le dernier, ce qui est assez logique^^ .
Tous les codes sont testés et sont fonctionnels, si il arrive qu'un de ces codes ne fonctionne pas chez vous, merci de me le signaler.