SQLSTATE[42000]: Syntax error + Uncaught Error: Call to a member function prepa

Résolu/Fermé
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 - 19 mai 2020 à 18:56
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 - 20 mai 2020 à 12:00
Bonjour,

Voici le code utilisé pour récupérer les valeurs d'une table afin qu'un admin puisse les modifier éventuellement.
Est-ce parce que le formulaire POST sur lui-même et que les requêtes UPDATE et SELECT sont même fichier ?
Car tout se déroule plutôt bien, les variables sont là, les requête sont à priori bonnes aussi à l'affichage...

Requête pour récupérer la ligne choisie à partir de l'ID affiché dans l'intégralité de la table sur une page précédente. ID récupéré par un input et submit.
J'ai pas de variable dans ma requête. Le valeurs attendues sont bien récupérées et affichées dans les input plus bas (partie HTML).

<?php
//activation de l'affichage des erreurs PHP
		error_reporting(E_ALL);
		ini_set('display_errors', TRUE);
		ini_set('display_startup_errors', TRUE);
	//echo "Test";

		//on inclut le fichier de connexion à la bdd
		require_once "../secure/cnxBdd.php";
	
		//on récupère proprement la variable avant de l'utiliser
		$IDmodif = !empty($_POST['IDmodif']) ? $_POST['IDmodif'] : NULL;
	//echo $IDmodif;
		
		//préparation de la requête
	    $sql = "SELECT * 
        FROM Donnees
		WHERE ID =" . $IDmodif;
	//echo $sql;

    	//tri des datas pour les avoir dans un tableau 
    	$datas = array();
    	
    	//Execution de la requete
    	try{
    	$req = $bdd->prepare($sql);
    	$req->execute($datas);
    
    	//on récupère les résultats
    	$result = $req->fetchAll();
    
    	}catch(Exception $e){
    		// en cas d'erreur :
    		echo " <br>Erreur ! ".$e->getMessage();
    		echo " <br>Les datas : " ;
    		print_r($datas);
    	}
    			            	
    	// Mise en forme des résultats pour les champs voulus
     	if(!empty($result)){
    		foreach($result as $uneValue){
    $ID = $uneValue['ID'];
    $SSA = $uneValue['SSA'];
    $CMCAS = $uneValue['CMCAS'];
    $Dept = $uneValue['Dept'];
    		 	 
	}
}

 $req->closeCursor(); // Termine le traitement de la requête
 $bdd = null; // Ferme la connexion 
?>


On a bien les valeurs par défaut dan sle sinput, celles-ci peuvent être modifiées si besoin et le submit devrait poster le contenu des variables suivant la requête d'UPDATE.
<form method="post">

<p> </p> 
<p> </p>
<p>
     <b><u><font size="5" color="red"> ATTENTION :</font></u></b>  Les champs ne sont pas liés entre eux... Vous pouvez avoir SSA "Bourgogne" avec CMCAS "Corse" et Département "(08)". Cela est tout à fait normal car il s'agit de listes (liste des SSA, liste des CMCAS et liste des départements).<br>
     Par ailleurs, pour les départements, merci de laisser les parenthèses ! De toutes façons, il est peu probable d'avoir à changer quoique ce soit pour les départements ;-)  
</p>

<p> </p>

<p>
    <!-- Les valeurs sont affichées dans des inputs pour être modifiées si besoin -->
     <input type="hidden" name="ID" id="ID" value="<?php echo $ID; ?>" />  <!-- input hidden pour garder l'ID concerné lors de l'envoi -->
     <LABEL for="SSA">SSA : </LABEL>
     <input type="text" name="SSAmod" id="SSAmod" value="<?php echo $SSA; ?>" /> 
</p>
 
<p>
    <LABEL for="CMCAS">CMCAS : </LABEL>
    <input type="text" name="CMCASmod" id="CMCASmod" value="<?php echo $CMCAS; ?>" /> 
</p> 

<p>
    <LABEL for="Dept">Département : </LABEL>
    <input type="text" name="Deptmod" id="Deptmod" value="<?php echo $Dept; ?>" /> 
</p> 

<input type="submit" name="Validation" value="Validez vos modifications">

<br>


Les nouvelles variables sont bien récupérées, elles s'affichent correctement ainsi que la requête.

<?php
//activation de l'affichage des erreurs PHP
		error_reporting(E_ALL);
		ini_set('display_errors', TRUE);
		ini_set('display_startup_errors', TRUE);

		//On vérifie qu'on a bien cliqué sur le bouton
		if (isset($_POST['Validation'])) {

        //on récupère proporement les variables 
		$SSAmod = !empty($_POST['SSAmod']) ? $_POST['SSAmod'] : NULL;
		$CMCASmod = !empty($_POST['CMCASmod']) ? $_POST['CMCASmod'] : NULL;
		$Deptmod = !empty($_POST['Deptmod']) ? $_POST['Deptmod'] : NULL;
		$ID = !empty($_POST['ID']) ? $_POST['ID'] : NULL;
		
		//on affiche les variables juste pendant le développement
		echo ' SSA transmise : '.$_POST['SSAmod'].'<br>' ;
		echo ' CMCAS transmise : '.$_POST['CMCASmod'].'<br>';
		echo ' Département transmis : '.$_POST['Deptmod'].'<br>';
		echo ' ID utilisé pour le WHERE : '.$_POST['ID'].'<br>';
		
		//on inclut le fichier de connexion à la bdd
		require_once "../secure/cnxBdd.php";
	 
		//$sth appartient la classe PDOStatement
		$sql = "UPDATE Donnes
		SET SSA = :ssa, CMCAS = :cmcas, Dept = :dept
		WHERE ID = :id";
        echo $sql;	
        	
        		try{
			$sth = $bdd->prepare($sql);
			$sth->bindParam(':ssa', $_POST['SSAmod'], PDO::PARAM_STR);
			$sth->bindParam(':cmcas', $_POST['CMCASmod'], PDO::PARAM_STR);
			$sth->bindParam(':dept', $_POST['Deptmod'], PDO::PARAM_STR);
			$sth->bindParam(':id', $_POST['ID'], PDO::PARAM_INT);
			$result = $sth->execute();
		}catch(Exception $e){
		  echo "Erreur : " . $e->getMessage();
		}
         
				echo '<br><br>      <span style="font-size:14pt;"><font color="blue">	les modifications ont bien été prises en compte </font></span>';
				
		}
		

		$bdd = null; // Ferme la connexion 

?>



</form>

et pourtant lors du submit, j'ai 2 erreurs qui s'affichent une en haut d el'écran qui me parle des datas et du tableau (array) alors que cela fait partie de la requête en amont du formulaire...
Erreur ! SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 3
Les datas : Array ( )
et une seconde après l'affichage de ma requête d'UPDATE où c'est vrai que les identifiants s'affichent et pas les contenus des variables qui s'affichent eux juste avant.
Fatal error: Uncaught Error: Call to a member function prepare() on null in /home/anegjxuk/public_html/Admin_Stage/Admin_General_act.php:117 Stack trace: #0 {main} thrown in /home/public_html/Admin_Stage/Admin_General_act.php on line 117
D'e quoi peuvent bien venir ces erreurs et comment j'aurais pu les repérer pour les corriger.

La ligne 117 est :
$sth = $bdd->prepare($sql);
avant les paramètres de la méthode bindParam()

Désolé d'être encore en panne sur le bord de la route...

Daniel

Configuration: Windows / Firefox 75.0

5 réponses

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
19 mai 2020 à 19:12
Bonsoir,

Je ne sais pas si c'est que je suis fatigué.... mais ton texte est un charabia incompréhensible...
(désolé)

Quoi qu'il en soit, tu as deux erreurs
Une sur une requête SQL :
On peut supposer que c'est sur celle là
<?php
//on récupère proprement la variable avant de l'utiliser
$IDmodif = !empty($_POST['IDmodif']) ? $_POST['IDmodif'] : NULL;
//echo $IDmodif;

//préparation de la requête
$sql = "SELECT * FROM Donnees WHERE ID =" . $IDmodif;
//echo $sql;

//tri des datas pour les avoir dans un tableau 
$datas = array(); // si pas de données à transmettre dans la requête.. mettre la variable à null

//Execution de la requete
try{
$req = $bdd->prepare($sql);
$req->execute($datas);

//on récupère les résultats
$result = $req->fetchAll();

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

et donc, la réécrire un peut plus proprement
//on récupère proprement la variable avant de l'utiliser
$IDmodif = !empty($_POST['IDmodif']) ? $_POST['IDmodif'] : NULL;
//echo $IDmodif;

//préparation de la requête
$sql = "SELECT * FROM Donnees WHERE ID = :IDmodif";
//echo $sql;

//tri des datas pour les avoir dans un tableau 
$datas = array(":IDmodif"=>$IDmodif);

//Execution de la requete
try{
  $req = $bdd->prepare($sql);
  $req->execute($datas);
  //on récupère les résultats
  $result = $req->fetchAll();
}catch(Exception $e){
  // en cas d'erreur :
  echo " <br>Erreur ! ".$e->getMessage();
  echo " <br>Les datas : " ;
  print_r($datas);
}



La seconde erreur semble indiquer que ta variable $bdd n'existe pas (ou est nulle )
Je constate d'ailleurs que tu la forces à null dans ton code.
Ce n'est clairement pas nécessaire.

1
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
19 mai 2020 à 22:47
<?php
//activation de l'affichage des erreurs PHP
  error_reporting(E_ALL);
  ini_set('display_errors', TRUE);
  ini_set('display_startup_errors', TRUE);
 //echo "Test";

  //on inclut le fichier de connexion à la bdd
  require_once "../secure/cnxBdd.php"; // le ONCE veut dire UNE FOIS .. donc ne le réinclus pas si tu refaire un require....
 
  //on récupère proprement la variable avant de l'utiliser
  //$IDmodif = !empty($_POST['IDmodif']) ? $_POST['IDmodif'] : NULL; // si données envoyées en POST
  $IDmodif = !empty($_GET['IDmodif']) ? $_GET['IDmodif'] : NULL; // si données envoyées via l'url ( en GET )
 //echo $IDmodif;
  
  //préparation de la requête
     $sql = "SELECT * 
        FROM Donnees
        WHERE ID =:IDmodif" . ;
      //echo $sql;

     //tri des datas pour les avoir dans un tableau 
     $datas = array(":IDmodif"=>$IDmodif);
     
     //Execution de la requete
     try{
     $req = $bdd->prepare($sql);
     $req->execute($datas);
    
     //on récupère les résultats
     $result = $req->fetch(); //fetch si une seule ligne retournée par la requête / fetchAll si plusieurs lignes
     // Mise en forme des résultats pour les champs voulus
      if(!empty($result)){
        $ID = $result['ID'];
        $SSA = $result['SSA'];
        $CMCAS = $result['CMCAS'];
        $Dept = $result['Dept'];
      }
     }catch(Exception $e){
      // en cas d'erreur :
      echo "<br>".$sql;
      echo "<br>Erreur : " . $e->getMessage();
      echo " <br>Les datas : " ;
      print_r($datas);
     }
                    
  

  $update = false;
  //On vérifie qu'on a bien cliqué sur le bouton
  if (isset($_POST['Validation'])) {
     
    //on récupère proporement les variables 
    $SSAmod = !empty($_POST['SSAmod']) ? $_POST['SSAmod'] : NULL;
    $CMCASmod = !empty($_POST['CMCASmod']) ? $_POST['CMCASmod'] : NULL;
    $Deptmod = !empty($_POST['Deptmod']) ? $_POST['Deptmod'] : NULL;
    $ID = !empty($_POST['ID']) ? $_POST['ID'] : NULL;
    
    //on affiche les variables juste pendant le développement
    echo ' SSA transmise : '.$_POST['SSAmod'].'<br>' ;
    echo ' CMCAS transmise : '.$_POST['CMCASmod'].'<br>';
    echo ' Département transmis : '.$_POST['Deptmod'].'<br>';
    echo ' ID utilisé pour le WHERE : '.$_POST['ID'].'<br>';
       
    //$sth appartient la classe PDOStatement
    $sql = "UPDATE Donnes
      SET SSA = :ssa, CMCAS = :cmcas, Dept = :dept
      WHERE ID = :id";
     
           
    try{
      $sth = $bdd->prepare($sql);
      $sth->bindParam(':ssa', $_POST['SSAmod'], PDO::PARAM_STR);
      $sth->bindParam(':cmcas', $_POST['CMCASmod'], PDO::PARAM_STR);
      $sth->bindParam(':dept', $_POST['Deptmod'], PDO::PARAM_STR);
      $sth->bindParam(':id', $_POST['ID'], PDO::PARAM_INT);
      $result = $sth->execute();
      $update = true;
    }catch(Exception $e){
      echo "<br>".$sql;
      echo "<br>Erreur : " . $e->getMessage();
    }
    
  }
  

  //$bdd = null; // Ferme la connexion  // INUTILE !
 
?>

<form method="post" action="">
  <p> </p> 
  <p> </p>
  <p>
    <b><u><font size="5" color="red"> ATTENTION :</font></u></b>  Les champs ne sont pas liés entre eux... Vous pouvez avoir SSA "Bourgogne" avec CMCAS "Corse" et Département "(08)". Cela est tout à fait normal car il s'agit de listes (liste des SSA, liste des CMCAS et liste des départements).<br>
    Par ailleurs, pour les départements, merci de laisser les parenthèses ! De toutes façons, il est peu probable d'avoir à changer quoique ce soit pour les départements ;-)  
  </p>
  <p> </p>
  <p>
    <!-- Les valeurs sont affichées dans des inputs pour être modifiées si besoin -->
    <input type="hidden" name="ID" id="ID" value="<?php echo $ID; ?>" />  <!-- input hidden pour garder l'ID concerné lors de l'envoi -->
    <LABEL for="SSA">SSA : </LABEL>
    <input type="text" name="SSAmod" id="SSAmod" value="<?php echo $SSA; ?>" /> 
  </p>
  <p>
    <LABEL for="CMCAS">CMCAS : </LABEL>
    <input type="text" name="CMCASmod" id="CMCASmod" value="<?php echo $CMCAS; ?>" /> 
  </p> 
  <p>
    <LABEL for="Dept">Département : </LABEL>
    <input type="text" name="Deptmod" id="Deptmod" value="<?php echo $Dept; ?>" /> 
  </p> 
  <input type="submit" name="Validation" value="Validez vos modifications">
  <br>
</form>
<?php
 if($update==true){
   echo '<br><br>
    <span style="font-size:14pt;"><font color="blue"> 
      les modifications ont bien été prises en compte </font>
    </span>';
 }
?>

1
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 2
19 mai 2020 à 20:05
Bonsoir Jordane45,

Désolé, j'avais seulement détaillé pour bien expliquer la situation. Comme quoi le trop est l'ennemi du bien.

Je ne comprends pas pourquoi la première requête indiquerait une erreur car les valeurs attendues sont bien là. Le message apparait seulement lorsque je valide pour la seconde requête liée au formulaire alors que la première est terminée et fermée (normalement).

Pour la seconde, je ne vois pas où je la force à NULL .. $bdd existe bien, elle est dans le fichier de connexion.
Merci quand même.

Bonne soirée.
Daniel
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
19 mai 2020 à 20:26
Pourrais tu nous montrer le code COMPLET de ton fichier d'update (sans le séparer... tout d'un bloc... et tout le code html/php.. )
0
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 2
Modifié le 19 mai 2020 à 22:38
Bien sûr, le voici :

<?php
//activation de l'affichage des erreurs PHP
  error_reporting(E_ALL);
  ini_set('display_errors', TRUE);
  ini_set('display_startup_errors', TRUE);
 //echo "Test";

  //on inclut le fichier de connexion à la bdd
  require_once "../secure/cnxBdd.php";
 
  //on récupère proprement la variable avant de l'utiliser
  $IDmodif = !empty($_POST['IDmodif']) ? $_POST['IDmodif'] : NULL;
 //echo $IDmodif;
  
  //préparation de la requête
     $sql = "SELECT * 
        FROM Donnees
  WHERE ID =" . $IDmodif;
 //echo $sql;

     //tri des datas pour les avoir dans un tableau 
     $datas = array();
     
     //Execution de la requete
     try{
     $req = $bdd->prepare($sql);
     $req->execute($datas);
    
     //on récupère les résultats
     $result = $req->fetchAll();
    
     }catch(Exception $e){
      // en cas d'erreur :
      echo " <br>Erreur ! ".$e->getMessage();
      echo " <br>Les datas : " ;
      print_r($datas);
     }
                    
     // Mise en forme des résultats pour les champs voulus
      if(!empty($result)){
      foreach($result as $uneValue){
    $ID = $uneValue['ID'];
    $SSA = $uneValue['SSA'];
    $CMCAS = $uneValue['CMCAS'];
    $Dept = $uneValue['Dept'];
         
 }
}

 $req->closeCursor(); // Termine le traitement de la requête
 $bdd = null; // Ferme la connexion 
?>

<form method="post">

<p> </p> 
<p> </p>
<p>
     <b><u><font size="5" color="red"> ATTENTION :</font></u></b>  Les champs ne sont pas liés entre eux... Vous pouvez avoir SSA "Bourgogne" avec CMCAS "Corse" et Département "(08)". Cela est tout à fait normal car il s'agit de listes (liste des SSA, liste des CMCAS et liste des départements).<br>
     Par ailleurs, pour les départements, merci de laisser les parenthèses ! De toutes façons, il est peu probable d'avoir à changer quoique ce soit pour les départements ;-)  
</p>

<p> </p>

<p>
    <!-- Les valeurs sont affichées dans des inputs pour être modifiées si besoin -->
     <input type="hidden" name="ID" id="ID" value="<?php echo $ID; ?>" />  <!-- input hidden pour garder l'ID concerné lors de l'envoi -->
     <LABEL for="SSA">SSA : </LABEL>
     <input type="text" name="SSAmod" id="SSAmod" value="<?php echo $SSA; ?>" /> 
</p>
 
<p>
    <LABEL for="CMCAS">CMCAS : </LABEL>
    <input type="text" name="CMCASmod" id="CMCASmod" value="<?php echo $CMCAS; ?>" /> 
</p> 

<p>
    <LABEL for="Dept">Département : </LABEL>
    <input type="text" name="Deptmod" id="Deptmod" value="<?php echo $Dept; ?>" /> 
</p> 

<input type="submit" name="Validation" value="Validez vos modifications">

<br>

<?php
//activation de l'affichage des erreurs PHP
  error_reporting(E_ALL);
  ini_set('display_errors', TRUE);
  ini_set('display_startup_errors', TRUE);

  //On vérifie qu'on a bien cliqué sur le bouton
  if (isset($_POST['Validation'])) {

        //on inclut le fichier de connexion à la bdd
  require_once "../secure/cnxBdd.php";
        
        //on récupère proporement les variables 
  $SSAmod = !empty($_POST['SSAmod']) ? $_POST['SSAmod'] : NULL;
  $CMCASmod = !empty($_POST['CMCASmod']) ? $_POST['CMCASmod'] : NULL;
  $Deptmod = !empty($_POST['Deptmod']) ? $_POST['Deptmod'] : NULL;
  $ID = !empty($_POST['ID']) ? $_POST['ID'] : NULL;
  
  //on affiche les variables juste pendant le développement
  echo ' SSA transmise : '.$_POST['SSAmod'].'<br>' ;
  echo ' CMCAS transmise : '.$_POST['CMCASmod'].'<br>';
  echo ' Département transmis : '.$_POST['Deptmod'].'<br>';
  echo ' ID utilisé pour le WHERE : '.$_POST['ID'].'<br>';
  
  
  
  //$sth appartient la classe PDOStatement
  $sql = "UPDATE Donnes
  SET SSA = :ssa, CMCAS = :cmcas, Dept = :dept
  WHERE ID = :id";
        echo $sql; 
         
          try{
   $sth = $bdd->prepare($sql);
   $sth->bindParam(':ssa', $_POST['SSAmod'], PDO::PARAM_STR);
   $sth->bindParam(':cmcas', $_POST['CMCASmod'], PDO::PARAM_STR);
   $sth->bindParam(':dept', $_POST['Deptmod'], PDO::PARAM_STR);
   $sth->bindParam(':id', $_POST['ID'], PDO::PARAM_INT);
   $result = $sth->execute();
  }catch(Exception $e){
    echo "Erreur : " . $e->getMessage();
  }
         
    echo '<br><br>      <span style="font-size:14pt;"><font color="blue"> les modifications ont bien été prises en compte </font></span>';
    
  }
  

  $bdd = null; // Ferme la connexion 

?>

</form>


EDIT : Ajout des BALISES DE CODE
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 2
20 mai 2020 à 00:03
Merci beaucoup,

Finalement, mes requêtes n'étaient pas si mauvaises (j'avais pas de variable à l'intérieur) c'était plus la chronologie qui pêchait. Ceci étant, j'ai appris des choses supers.
1°) Qu'avec le require_once, il n'y avait plus besoin de le refaire pour les requêtes suivantes (je m'en doutais un peu mais dans le doute et comme cela ne me coutait rien...).
2°)J'utilisais fetchAll car je pensais que c'était dès qu'il y avait plusieurs valeurs même sur une seule ligne... tout faux Daniel sur ce coup là.
3°)J'ai découvert aussi que la requête pouvait être avant le html où on est sensé récupérer les données modifiées.

Merci encore pour l'aide apportée avec les explications

Daniel
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
20 mai 2020 à 12:00
1) Oui, il faut comprendre les instructions, pas juste les coller.
Et dans le doute, penser à regarder la documentation officielle de php

2) Idem que le (1)

3) Comme évoqué dans le lien que j'avais déjà dû te donner : https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code
(et si je ne te l'avais pas encore donné... maintenant c'est chose faite )
0