Salut à tous, je suis en train de construire un système d'ajout d'articles dans une table et j'ai besoin de trouvé un moyen pour connaitre l'id de la prochaine entrée.

J'avais trouvé une solution qui etait d'ajouter +1 à l'id maximal, mais le problème est que si par exemple 51 qui etait l'id max a été supprimé et que maintenant l'id maximal est 50, je veux que mon système me permette de savoir que le prochain id sera 52(car MySQL compte même les entrées supprimées donc le 51 sera plus de la table mais le l'id 51 ne pourra plus être utilisé).

Merci d'avance pour votre aide.

11 réponses


princelionelnzi
Auteur
Réponse acceptée

J'ai trouvé la solution sur le sujet d'un forum de OpenClassRooms.com

<?php

    /*Récupération des infos concernant ta table*/
    $result= $bdd-> query ("Show table status like 'ma_table' ");
    /*Récupération de la valeur auto incrément*/
    $result -> setFetchMode (PDO::FETCH_ASSOC);
    foreach ($result as $row)
    {   
        $id=$row 'Auto_increment'];
        echo $id;
    }
?>

Salut Princelionelnzi
la solution serait de prendre le dernier ID inséré et faire +1

$id = mysql_insert_id() + 1;

et si tu es en PDO tu fait juste

$id = PDO->lastInsertId() + 1;

Qu'est ce que tu veux faire exactement ? es-tu le seul à pouvoir ajouter des articles ?

fabricelepro ton système revient à celui que j'ai fait c'est à dire ajouter 1 à l'id max mais le problème est que si la derniere entrée est supprimée, la prochaine entrée ne sera pas "$id = mysql_insert_id() + 1;"

J'avais supprimé ma réponse qui était

SELECT `auto_increment` FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = 'nom de la table'

ATTENTION, si un autre utilisateur insère un article en même temps, tu risques d'avoir une valeur incorrecte, parce que tu obtiendras l'id à un instant T ce qui ne garantit pas que pendant ta requête un autre insert à été réalisé.
Si tu es le seul à ajouter des articles, c'est bon.

C'est ce qu'on appelle une "race condition" et çà peut te créer des problèmes, si tu as plusieurs personnes qui peuvent ajouter des articles.
C'est aussi pour ça que je voulais savoir ce que tu comptais mettre en place en voulant le next auto_increment.

J'avais posté la même publication sur un autre forum et là on me dit que le code n'est parait sensible. Voici le lien de la page http://forum.alsacreations.com/posting.php?action=newp&tid=73614&fid=20&p=1

Va voir l'article et laisse moi un postn stp.

Merci

Besoin de vous

Pourquoi veux-tu stocker l'image avant de faire l'insert dans la BDD ? si tu le fais dans l'autre sens, c'est beaucoup plus simple et sûr à 100%
Tu insère les données en BDD, tu récupère l'ID avec mysql_insert_id() ou lastInsertId() suivant ce que tu utilises, et tu rajoutes l'id au nom de ton fichier.

+1 avec Govan, je ne comprend pas l’intérêt de le faire spécifiquement avant ...

je vous balance mon code de suite

Je me base sur l'image enregistré pour stocker le chemin de l'image dans la base données.

if (isset($_FILES'image_article']) AND $_FILES'image_article']'error']==0) {

                            //On verifie si la taille du fichier est inferieur à 1Mo(1 000 000 octets)
                            if ($_FILES'image_article']'size'] < 1000000) {
                                $nom_image = $_FILES'image_article']'name'];
                                $extension_image = explode('.',$nom_image);
                                $extension_image = $extension_image[1];
                                $extensions_autorisees = array('jpg', 'jpeg', 'png','gif');
                                    //Si le fichier envoyé est parmi les extensions autorisées
                                    if (in_array($extension_image, $extensions_autorisees)) {
                                        $nom_fichier_temporaire = $_FILES'image_article']'tmp_name'];
                                        /**
                                        Un pirate informatique peut ecrire un code et changer l'extensions en jpg, gif, png.
                                        Comme chaque image a une taille alors on verifie si le fichier a une taille
                                        Si non alors c'est pas une image, Si oui on continue
                                        */
                                        $image_size = getimagesize($nom_fichier_temporaire);
                                            /*
                                                $image_size est un array contenant les infos de l'image 
                                                comme la largeur, la hauteur, le type et $image_size'0'] 
                                                donne le type de l'image. cela ne marche pas pour la 
                                                technique de piratage informatique mentionné ci dessus
                                            */

                                            ?>
                                            <?php
                                            /*Cette partie permet de reuperer le prochain id de la table*/
                                                /*Récupération des infos concernant ta table*/
                                                $result= $bdd-> query ("Show table status like '".$_POST'rubrique']."' ");
                                                /*Récupération de la valeur auto incrément*/
                                                $result -> setFetchMode (PDO::FETCH_ASSOC);
                                                foreach ($result as $row)
                                                {
                                                    $id_prochaine_entree=$row 'Auto_increment'];
                                                }
                                            ?>
                                            <?php

                                            $pathname = 'images/articles/'.$_POST'rubrique'].'/'.$id_prochaine_entree;

                                        if(isset($image_size'0'])){
                                            if ($image_size'mime'] == 'image/jpeg' ) {
                                                //L'image est un jpg ou jpeg
                                                move_uploaded_file($nom_fichier_temporaire, '../'.$pathname.'.jpg');
                                                $image_src = imagecreatefromjpeg('../'.$pathname.'.jpg');
                                                $extension_image = 'jpg';
                                            }
                                            else if ($image_size'mime'] == 'image/png' ) {
                                                //L'image est un png
                                                move_uploaded_file($nom_fichier_temporaire, '../'.$pathname.'.png');
                                                $image_src = imagecreatefrompng('../'.$pathname.'.png');
                                                $extension_image = 'png';
                                            }
                                            else if ($image_size'mime'] == 'image/gif' ) {
                                                //L'image est un gif
                                                move_uploaded_file($nom_fichier_temporaire, '../'.$pathname.'.gif');
                                                $image_src = imagecreatefromgif('../'.$pathname.'.gif');
                                                $extension_image = 'gif';
                                            }
                                        }
                                        else {
                                            echo '<p class="message">Votre image n\'est pas valide</p>';
                                            $image_src = false;
                                        }
                                                if ($image_src != false) {

                                                        $image_width = 680;
                                                        $image_height = 306;

                                                        $lien_image = $pathname.'.'.$extension_image;

                                                    if ($image_size[0]>=$image_width AND $image_size[1]>=$image_height) {
                                                        echo "<p class='message'>Une photo a bien été ajouté à l'article</p>";

                                                        $insere_article = $bdd->prepare('INSERT INTO '.$_POST'rubrique'].'(titre, image, contenu, date_ajout) VALUES(?, ?, ?, NOW())');
                                                        $insere_article->execute(array($_POST'titre'], $lien_image, $_POST'contenu']));
                                                        ?>
                                                            <div id="overview_article">
                                                                <p style="text-align: center;"><img src="../images/articles/<?php echo $_POST'rubrique'];?>/<?php echo $id_prochaine_entree.'.'.$extension_image;?>" alt="Photo de Profil"/></p>
                                                                <h1><?php echo $_POST'titre']?></h1>
                                                                <p><?php echo $_POST'contenu']?></p>
                                                            </div>
                                                            <hr/>
                                                        <?php
                                                    }
                                                    else {
                                                        echo "<p class='message'>Votre image doit avoir au minimum une largeur de 680px et une longueur de 306px</p>";
                                                        if (file_exists('../'.$lien_image)) {

                                                            unlink('../'.$lien_image);
                                                        }
                                                    }

                                                }
                                                else {

                                                    if (file_exists('../'.$lien_image)) {

                                                        unlink('../'.$lien_image);
                                                    }
                                                }
                                    }
                                    else {
                                        echo '<p class="message">Votre fichier n\'est pas une image.</p>';
                                    }
                            }
                            else {
                                echo '<p class="message">La taille de votre fichier doit être inferieur à 1Mo</p>';
                            }
                        }
                        else {
                            echo '<p class="message">Erreur au niveau du fichier.</p>';
                        }