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

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