Requête dans une boucle foreach

Résolu/Fermé
someone - 14 avril 2022 à 14:36
 someone - 14 avril 2022 à 17:03
Bonjour,

Je cherche à mettre à jours de données après un test.
Je fais donc un select pour récupérer les donnés qui seront testées et après pour chacune des données tester je fais une mise à jour.
Je récupère bien les données et la mise à jour se passe bien mais j'arrive pas à mettre à jour la base de donnée.

Voici mon code.

$req2 = $db->prepare("SELECT IP, Etat, statut FROM lecteur_oui");
$req2->execute();
$row2 = $req2->fetchAll();

if($row2){
    foreach ($row2 as $etat){
        $ping = exec("ping -n 1 " . $etat['IP']);                
        if (strpos($ping, "perte 100%")) {  
            $newetat = "non";                       
        } else {
            $newetat = "oui";
        }
        $etat['statut']='';

        if($etat['Etat'] != $newetat){

            $etat['Etat'] = $newetat;
            $etat['statut'] = 'non-vérifié';
        }

        //echo $etat['IP']." - ".$etat['Etat']." - ".$etat['statut'];

        $db->exec("UPDATE lecteur_oui SET Etat = ".$etat['Etat']." AND statut = ".$etat['statut']);
    }
}


Pouvez vous m'aider

3 réponses

yg_be Messages postés 23429 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 janvier 2025 Ambassadeur 1 559
14 avril 2022 à 14:46
bonjour,
comment détermines-tu quel enregistrement est mis à jour?
0
Quand je teste l'enregistrement 'ip' pour savoir son état, si l'état à une valeur différente de celle contenue dans la bdd et bien elle doit prendre la nouvelle valeur et ensuite je change le statut de l'ip tester en non-vérifié
0
jordane45 Messages postés 38389 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 janvier 2025 4 727
14 avril 2022 à 15:35
0
J'ai modifié mon code de sorte de voir les erreurs

try {
    $db = new PDO('mysql:host=localhost;dbname=bdd_ctrl_acces_dev', 'root', '');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch(PDOException $e){
    die('Erreur de connexion à la base de données :' .$e->etMessage());
}

$req2 = $db->prepare("SELECT IP, Etat, statut FROM lecteur_oui");
$req2->execute();
$row2 = $req2->fetchAll();

if($row2){
    foreach ($row2 as $etat){
        $ping = exec("ping -n 1 " . $etat['IP']);                
        if (strpos($ping, "perte 100%")) {  
            $newetat = "non";                       
        } else {
            $newetat = "oui";
        }
        
        if($etat['Etat'] != $newetat){

            $etat['Etat'] = $newetat;
            $etat['statut'] = 'non-vérifié';
            
            $sql = 'UPDATE lecteur_oui SET Etat = ? AND statut = ?';
            $a = array('Etat'=>$etat['Etat'], 'statut='=>$etat['statut']);

            try{
                $req = $db -> prepare($sql);
                $req ->execute($a);

            } catch(Exception $e){
                // en cas d'erreur :
                 echo " Erreur ! ".$e->getMessage();
                 echo " Les datas : " ;
                print_r($etat);
              }
            
        }

        echo $etat['IP']." - ".$etat['Etat']." - ".$etat['statut'];

    
    }
}


et j'obtien comme erreur :

Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in C:\wamp64\www\LEM_ControleAcces\Php\recupdonnee.php on line 32
( ! ) PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in C:\wamp64\www\LEM_ControleAcces\Php\recupdonnee.php on line 32
0
yg_be Messages postés 23429 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 janvier 2025 1 559 > someone
14 avril 2022 à 16:24
Dans une requête UPDATE, les champs à modifier ne sont pas séparés par
AND
.
0
someone > yg_be Messages postés 23429 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 janvier 2025
14 avril 2022 à 16:53
J'ai enlever le AND mais toujours le même problème
0
jordane45 Messages postés 38389 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 janvier 2025 4 727 > someone
14 avril 2022 à 16:24
Si tu utilises l'écriture avec les ? Il ne faut pas d'Array associatif dans le execute.
0
someone > jordane45 Messages postés 38389 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 janvier 2025
14 avril 2022 à 16:55
$sql = 'UPDATE lecteur_oui SET Etat = :Etat , statut = :statut WHERE IP = '.$etat['IP'];
            $a = array('Etat'=>$etat['Etat'], 'statut='=>$etat['statut'], 'IP'=> $etat['IP']);

            try{
                $req = $db -> prepare($sql);
                $req ->execute($a);

J'ai enlever les ? et fait comme ça mais j'ai toujours la même erreur
0
jordane45 Messages postés 38389 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 janvier 2025 4 727
14 avril 2022 à 16:58
$sql = 'UPDATE lecteur_oui SET Etat = :etat , statut = :statut WHERE IP = :ip';
$a = array(':etat'=>$etat['Etat'], ':statut='=>$etat['statut'], ':ip'=> $etat['IP']);
0
Même comme ça ne fonctionne pas
Apparemment ce n'est pas très propre de faire des requêtes dans une boucle mais je ne vois pas comment faire autrement

UPDATE : Autant pour moi ça à fonctionné ma base à bien été mise à jour. Merci je vais marquer ce problème comme résolu.
0