Insérer plusieurs lignes dans une table en php et sql

Fermé
needhelp - Modifié le 22 juil. 2022 à 16:00
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 - 22 juil. 2022 à 16:58

Bonjour, 

mon problème est le suivant: j'essaye d'insérer dans une table (après donnée modifiées) plusieurs lignes de données que j'ai récupérer d'une première table avec une requête select

La fonction s'exécute mais j'ai seulement la première ligne des données qui subit l'insertion dans la nouvelle table 

Je veux ainsi que ça se répète pour toutes les lignes de données. 

j'ai pensé utiliser un foreach et j'obtenais un msg d'erreur qui me renvoyais vers mon fichier dbcontroller plus précisément vers la fonction que j'appelle pour exécuter la requête. je ne sais plus quel était le message d'erreur mais ça avait un rapport avec le fait que mes valeurs sont des booléens et non sous forme d'un tableau (array)

Je code en php 

voici ma fonction :

$dbcontroller = new DBController();
$result = "";
$stmt1 = mysqli_prepare($dbcontroller->getConn(), "SELECT reference, numero, idetat, id_emplacement FROM balancelles  WHERE reference = ?");
mysqli_stmt_bind_param($stmt1, 'i', $id);
$data1 = $dbcontroller->executeSelectQueryMSQL($stmt1);

$stmt2 = mysqli_prepare($dbcontroller->getConn(), "SELECT idetat FROM etats WHERE idetat = 0");
$data2 = $dbcontroller->executeSelectQueryMSQL($stmt2);
$stmt3 = mysqli_prepare($dbcontroller->getConn(), "SELECT id FROM emplacement WHERE id = 0");
$data3 = $dbcontroller->executeSelectQueryMSQL($stmt3);

//foreach($data1 as $data1){   <-- la où j'ai testé le forEach                   

if ($data1 && $data2 && $data3){
                
setlocale(LC_TIME, "fr_FR.UTF-8");
$date = new DateTime();
$date = strftime("%Y-%m-%d %H:%M:%S", $date->getTimestamp());
$stmtAction = mysqli_prepare($dbcontroller->getConn(), "INSERT INTO actions (reference, numero, date_heure, idetat, id_emplacement) VALUES (?,?,?,?,?)");
mysqli_stmt_bind_param($stmtAction, 'sssss', $data1[0]['reference'], $data1[0]['numero'], $date, $data2[0]['idetat'], $data3[0]['id']);
$dataAction = $dbcontroller->executeSelectQueryMSQL($stmtAction);(pb à cette ligne)

... }

//}

La fonction concernée dans mon dbcontroller 

function executeSelectQueryMSQL($stmt)
    {
        $stmt->execute();

        $meta = $stmt->result_metadata();
        while($field = $meta->fetch_field()){
            $params[] = &$row[$field->name];
        }

        call_user_func_array(array($stmt, 'bind_result'), $params);

        while($stmt->fetch()){
            foreach($row as $key => $val){
                $c[$key] = $val;
            }

            $resultset[] = $c;
        }

        $this->freeStatementSql($meta);

        if (!empty($resultset)) {
            return $resultset;
        } else {
            return "";
        }
    }

Merci par avance de votre aide

A voir également:

1 réponse

jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
22 juil. 2022 à 16:58

Bonjour

Pour commencer il faudrait une seule requête SELECT (avec des jointures) au lieu de faire trois requêtes distinctes qui n'ont pas de lien entre elles..

Une fois que ce sera fait tu pourras en effet faire une boucle afin de traiter chaque ligne de ta requête SELECT.

Au passage, ta classe dBcontroller ne sert à rien

. À croire que tu as essayé de modifier un code qui tournait avant avec l'ancienne extension mySQL...

Pourrais remplacer ce code par l'utilisation d'un fetchfall

https://www.php.net/manual/fr/mysqli-result.fetch-all.php


0