Bonjour,

Je cherche à modifier des enregistrements via sql

J'ai une ligne qui pose problème (ligne 127) mais je n'arrive pas à savoir pourquoi;
Si je modifie une ligne inférieure à cette ligne la modification est bien prise en compte mais pour les lignes à partir de 128 j'ai toujours le nom de la ligne 127 qui est enregistré

Je vous joins une image de cette partie de la table

J'ai le même problème quand je veux ajouter une ligne avec un nom supérieur à celui de la ligne 127

Cordialement
Modifié par dudu22 (21 Apr 2022 - 10:50)
upload/1650552821-77837-pbbase.jpg Désolé l'image de ma base n'est pas passée

Sinon pour code

Controleur


public function edit(){

        $table = 'plants';

        $pageId=46;
        
        $errors = false;

            if(isset($_POST['edit']))
                {
                
                if($plant_edit_valid->isValid())
                    {
                    $result = $this->Plant->update($_GET['param'], [
                     'gender_id' => $_POST['plantgender_id'],
                     ]);
                    }
               else
                    {
                    $errors = $plant_edit_valid->getErrors();

                    } 
                }

        $plant = $this->Plant->find_Category($_GET['param']);                      
        
        $this->loadModel('Plantgender');
        $plantgenders = $this->Plantgender->all_orderGender('name');
             
    
        $this->render('plants/edit', compact('pageId','plant','plantfamilies','plantgenders','planttypes','plantcolors','plantexposures','planthardinesses','plantinflorescences','plantfoliages','plantstatus','errors'));
    }


Model


public function all_orderGender($data){
        return $this->sql(" SELECT * FROM plantgenders  ORDER BY $data ASC ");
    }

public function find_Category($id){
    return $this->sql("
      SELECT plants.*, plantfamilies.familyname ,planttypes.typename,plantcolors.colorname,plantexposures.exposurename,plantstatus.statusname,planthardinesses.name AS hardinessname,plantinflorescences.name AS inflorescencename,plantfoliages.name AS foliagename,plantgenders.name AS gendername
      FROM plants
      LEFT JOIN plantgenders ON gender_id = plantgenders.id
     WHERE plants.id = ? 
      ", [$id],true);
    }

public function update($id, $fields){

        $sql_parts = [];
        $attributes = [];

        foreach($fields as $k => $v)
            {
            $sql_parts[] = "$k = ?";
            $attributes[] = $v;
            }

        $attributes[] = $id;

        $sql_part = implode(', ', $sql_parts);

        return $this->sql("UPDATE {$this->model} SET $sql_part WHERE id = ?", $attributes, true);
    }



View


<form  id="form_edit" name="form_edit"  method="post" >               
            <fieldset>
                
                <legend >Modification Plante</legend>

               <div class="form-group row">
                    <label for="gender" class="col-sm-4 col-form-label">Liste Genres</label>
                    <select class="form-control col-sm-8" name="plantgender_id" id="plantgender_id"><option value="<?=$plant->gender_id;?>"><?=$plant->gendername;?></option>
<?php
                        foreach($plantgenders as $plantgender): ?>
                           <option value="<?=$plantgender->id;?>"><?=$plantgender->name;?></option>
                        <?php endforeach; ?> 
                    </select>
                </div>
                 
                <button  class="btn btn-primary btn-lg" name="edit" id="edit" type="submit" >Modifier</button>
            </fieldset>
        </form>

Modifié par dudu22 (21 Apr 2022 - 16:53)
C'est très étonnant je viens d'effacer l'id 127 mais je l'ai dans ma réponse de requête avec bien sûr un name sans rien !!!
Bonjour,

Si l'extrait de table que tu as fourni vient de la table "plantgenders" (ce qui n'est pas sûr, faudrait préciser),
le fait que le 127 apparaisse viendrait du left join
La requête retourne tous les enregistrements de "plants", la valeur correspondante de "plantgenders"s'il y en a une ou la valeur null sinon.

Plants_id; plantgenders_id
125 ; 125
126 ; 126
127 ; null
128 ; 128

Essaie de remplacer left par inner, le 127 devrait disparaître.

Après je ne suis pas sûr de tout comprendre, la requête "findCategory" appelle des champs de la table "plantfoliages", mais cette table n'est pas appelée dans ta requête.
Finalement c'était dans la base de données où j'ai mis l'id en TINYINT qui va jusqu'à 127 en positif
J'ai modifié en SMALLINT et cela a l'air de marcher

Merci pour ton aide
Smiley petard Lapin compris l'histoire du 127, mais si tu es content, c'est l'essentiel.
Modifié par loicbcn (22 Apr 2022 - 13:16)