Requête dans une boucle foreach

Résolu
someone -  
 someone -
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
comment détermines-tu quel enregistrement est mis à jour?
0
someone
 
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
0
someone
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > someone
 
Dans une requête UPDATE, les champs à modifier ne sont pas séparés par
AND
.
0
someone > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
J'ai enlever le AND mais toujours le même problème
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752 > someone
 
Si tu utilises l'écriture avec les ? Il ne faut pas d'Array associatif dans le execute.
0
someone > jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention  
 
$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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
$sql = 'UPDATE lecteur_oui SET Etat = :etat , statut = :statut WHERE IP = :ip';
$a = array(':etat'=>$etat['Etat'], ':statut='=>$etat['statut'], ':ip'=> $etat['IP']);
0
someone
 
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