[RESOLU] PDO - Fatal error: Function name must be a string

Petit nouveau ! | 9 Messages

04 août 2015, 22:42

Bonjour,

Je suis entrain de m'initier au requête en PDO et j'ai un souci lorsque j’exécute :
Fatal error: Function name must be a string in /home/.../ajoutProduit.php on line 11

la ligne 11 est la suivante :
$stmt→bind_param('ssdss', $_POST['reference'], $_POST['nom'], $_POST['quantite'], $_POST['fournisseur'], $_POST['commentaire']);
Voici donc mon code de ajoutProduit.php :
<?php
	include('connect.php');
	
	if (file_exists('connect.php')){
		
		// Préparation de la requête
		$requete = "INSERT INTO produits (reference, nom, quantite, fournisseur, commentaire) VALUES (?, ?, ?, ?, ?)";
		$stmt = $connexiondb->prepare($requete);
	
		// Lecture des marqueurs
		$stmt→bind_param('ssdss', $_POST['reference'], $_POST['nom'], $_POST['quantite'], $_POST['fournisseur'], $_POST['commentaire']);
		
		// Exécution de la requête
		$resultat->execute($stmt); 
		
		// Affichage du résultat
		if ($resultat) {
            echo "Les données ont bien été insérées.<br />";
        } else {
            echo "L'insertion des données a échoué.<br />";
        }
		
		// Fermeture du traitement
		$stmt->close();
	
		include('close.php');
		}
?>
ma page connect.php :
<?php

	define('SERVEUR','10.0.241.89');
	define('USER','*****');
	define('PASSWORD','*****');
	define('BASE','*****');
		
	try{
		$connexiondb = new mysqli(SERVEUR, USER, PASSWORD, BASE); 
	}
	
	catch (Exception $e){
		echo "Connexion au serveur refusée!<br />";
	}
	
	echo "Connexion au serveur réussi!<br />";
?>
et mon code html :
<! DOCTYPE HTML>

<html>
	<head>
		<meta charset = "utf-8" />
		<title> PHP Avancé - Exercice Final </title>
		<link rel="stylesheet" type="text/css" href="style.css" />
		<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> 
		<script>
			$(document).ready(function(){
				$('#produits').click(function(){
					$('#sousMenu1').slideToggle('fast');
					$('#sousMenu2').hide();
				});
				$('#fournisseurs').click(function(){
					$('#sousMenu2').slideToggle('fast');
					$('#sousMenu1').hide();
				});
			});
		</script>
	</head>

	<body>
		<header>
			<nav>
			<ul id="menu">
				<li id="produits"><a href="#">Produits</a>
					<ul id="sousMenu1">
						<li><a href="#">Modifier</a></li>
						<li><a href="ajoutProduit.html">Ajouter</a></li>
						<li><a href="#">Supprimer</a></li>
					</ul>
				</li>
				<li id="fournisseurs"><a href="#">Fournisseurs</a>
					<ul id="sousMenu2">
						<li><a href="#">Modifier</a></li>
						<li><a href="#">Ajouter</a></li>
						<li><a href="#">Supprimer</a></li>
					</ul>
				</li>
       		</nav>
		</header>
		
		<form name="formulaire" id="formulaire" action="ajoutProduit.php" method="post">
			<fieldset>
				<legend>Ajoutez un produit :</legend>
				<label for="reference">Reference</label>
				<input type="text" id="reference" name="reference" required/><br />
				
				<label for="nom">Nom</label>
				<input type="text" id="nom" name="nom" required/><br />
				
				<label for="quantite">Quantité</label>	
				<input type="number" id="quantite" name="quantite" required/><br />
				
				<label for="fournisseur">Fournisseur</label>
				<input type="text" id="fournisseur" name="fournisseur" required/><br />
				
				<label for="commentaire">Commentaire</label>
				<input type="text" id="commentaire" name="commentaire" /><br /><br />
				
				<input type="submit" value="Ajouter" />
			</fieldset>
			
		</form>
	</body>

</html>
J'ai essayé d'intégrer errorInfo() mais je n'ai pas dû bien le faire car rien n'apparassait.
Un vrai casse-tête comme à l'habitude car je cherche depuis un moment.

En espérant pouvoir m'en remettre à vous.

Merci beaucoup

ViPHP
xTG
ViPHP | 7331 Messages

06 août 2015, 10:34

Deux choses :
1/ La fonction bind_param n'existe pas.
C'est bindParam(). ;)
http://php.net/manual/fr/pdostatement.bindparam.php

2/ La flèche n'est pas le bon caractère.
$var→fct() != $var->fct()

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

06 août 2015, 12:10

2/ La flèche n'est pas le bon caractère.
$var→fct() != $var->fct()
On ne le dira jamais assez : Désactivez la correction automatique quand vous utilisez Word pour développer en PHP :D
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 9 Messages

07 août 2015, 09:32

Merci de vos réponses :)

Bizarrement lorsque j'utilise paramBind(), ça me retourne un message d'erreur :
$stmt->bindParam('ssdss', $_POST['reference'], $_POST['nom'], $_POST['quantite'], $_POST['fournisseur'], $_POST['commentaire']);
Fatal error: Call to undefined method mysqli_stmt::bindParam() in /home/cefiidev/www/maxime411/php-avance/exerciceFinal/ajoutProduit.php on line 11
Et si je laisse param_bind(), l'éxécution semble fonctionner sauf que derrière l'insertion des données ne se fait pas.
<?php
	include('connect.php');
	
	if (file_exists('connect.php')){
		
		// Préparation de la requête
		$requete = "INSERT INTO produits (Reference, Nom, Quantite, Fournisseur, Commentaire) VALUES (?, ?, ?, ?, ?)";
		$stmt = $connexiondb->prepare($requete);
	
		// Lecture des marqueurs
		$stmt->bind_param('ssdss', $_POST['reference'], $_POST['nom'], $_POST['quantite'], $_POST['fournisseur'], $_POST['commentaire']);
		
		// Exécution de la requête
		$resulat = $stmt->execute();
	
		// Affichage du résultat
		if ($resultat) {
            echo "Les données ont bien été insérées.<br />";
        } else {
            echo "L'insertion des données a échoué.<br />";
        }
		
		// Fermeture du traitement
		$stmt->close();
	
		include('close.php');
		}
?>
J'ai du aussi changer $resultat->execute($stmt); en $resulat = $stmt->execute();
Ceci n'est pas la même chose? Car sinon voici le message d'erreur.
Fatal error: Call to a member function execute() on a non-object in /home/.../ajoutProduit.php on line 14

ViPHP
xTG
ViPHP | 7331 Messages

07 août 2015, 09:39

Le execute se fait bien sur le résultat du prepare, pas de problème de ce côté là.
Par contre l'histoire du bind_param... O__o

Peux-tu essayer ce code pour voir ce qu'il retourne ?
echo "<pre>";
var_dump(get_class_methods("PDOStatement"));
echo "</pre>";

Petit nouveau ! | 9 Messages

07 août 2015, 09:56

Ça me retourne :
object(mysqli_stmt)#2 (9) {
["affected_rows"]=>
int(0)
["insert_id"]=>
int(0)
["num_rows"]=>
int(0)
["param_count"]=>
int(5)
["field_count"]=>
int(0)
["errno"]=>
int(0)
["error"]=>
string(0) ""
["sqlstate"]=>
string(5) "00000"
["id"]=>
int(1)
}

ViPHP
xTG
ViPHP | 7331 Messages

07 août 2015, 10:37

Tu n'as pas exécuté le code que je t'ai donné.
Ce n'est pas un var_dump d'un objet mais du retour d'une fonction. ;)

Exemple de retour :
array(21) {
[0]=>
string(7) "execute"
[1]=>
string(5) "fetch"
[2]=>
string(9) "bindParam"
[3]=>
string(10) "bindColumn"
[4]=>
string(9) "bindValue"
[5]=>
string(8) "rowCount"
[6]=>
string(11) "fetchColumn"
[7]=>
string(8) "fetchAll"
[8]=>
string(11) "fetchObject"
[9]=>
string(9) "errorCode"
[10]=>
string(9) "errorInfo"
[11]=>
string(12) "setAttribute"
[12]=>
string(12) "getAttribute"
[13]=>
string(11) "columnCount"
[14]=>
string(13) "getColumnMeta"
[15]=>
string(12) "setFetchMode"
[16]=>
string(10) "nextRowset"
[17]=>
string(11) "closeCursor"
[18]=>
string(15) "debugDumpParams"
[19]=>
string(8) "__wakeup"
[20]=>
string(7) "__sleep"
}

Petit nouveau ! | 9 Messages

07 août 2015, 12:19

Oups :)
array(21) {
[0]=>
string(7) "execute"
[1]=>
string(5) "fetch"
[2]=>
string(9) "bindParam"
[3]=>
string(10) "bindColumn"
[4]=>
string(9) "bindValue"
[5]=>
string(8) "rowCount"
[6]=>
string(11) "fetchColumn"
[7]=>
string(8) "fetchAll"
[8]=>
string(11) "fetchObject"
[9]=>
string(9) "errorCode"
[10]=>
string(9) "errorInfo"
[11]=>
string(12) "setAttribute"
[12]=>
string(12) "getAttribute"
[13]=>
string(11) "columnCount"
[14]=>
string(13) "getColumnMeta"
[15]=>
string(12) "setFetchMode"
[16]=>
string(10) "nextRowset"
[17]=>
string(11) "closeCursor"
[18]=>
string(15) "debugDumpParams"
[19]=>
string(8) "__wakeup"
[20]=>
string(7) "__sleep"
}

ViPHP
xTG
ViPHP | 7331 Messages

07 août 2015, 13:37

bindParam est bien présent, donc pas de souci.

Par contre je viens de relire ton utilisation du bindParam et c'est pas du tout ça..
Regardes l'exemple 2 de la documentation.
http://php.net/manual/fr/pdostatement.bindparam.php
;)

Petit nouveau ! | 9 Messages

07 août 2015, 19:34

Voilà j'ai essayé en me basant sur l'exemple 2 :
<?php
	include('connect.php');
	
	if (file_exists('connect.php')){
		
		// Préparation de la requête
		$requete = "INSERT INTO produits (Reference, Nom, Quantite, Fournisseur, Commentaire) VALUES (?, ?, ?, ?, ?)";
		$stmt = $connexiondb->prepare($requete);
	
		// Lecture des marqueurs
		//$stmt->bindParam('ssdss', $_POST['reference'], $_POST['nom'], $_POST['quantite'], $_POST['fournisseur'], $_POST['commentaire']);
	
		$stmt->bindParam(1, $_POST['reference'], PDO::PARAM_STR);
		$stmt->bindParam(2, $_POST['nom'], PDO::PARAM_STR);
		$stmt->bindParam(3, $_POST['quantite'], PDO::PARAM_INT);
		$stmt->bindParam(4, $_POST['fournisseur'], PDO::PARAM_STR);
		$stmt->bindParam(5, $_POST['commentaire'], PDO::PARAM_STR);
		
		// Exécution de la requête
		$resulat = $stmt->execute();
	
		// Affichage du résultat
		if ($resultat) {
            echo "Les données ont bien été insérées.<br />";
        } else {
            echo "L'insertion des données a échoué.<br />";
        }
		
		// Fermeture du traitement
		$stmt->close();
	
		include('close.php');
		}
?>
Mais ça ne veut toujours pas.
Fatal error: Call to undefined method mysqli_stmt::bindParam() in /home/.../ajoutProduit.php on line 13
Bizarre bizarre..

ViPHP
xTG
ViPHP | 7331 Messages

10 août 2015, 10:07

Comment initialises-tu $connexiondb ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

10 août 2015, 10:08

Salut,

tu utilises les méthodes de la classe PDOStatement alors que tu utilise l'extension mysqli.

Il faut que tu utilises les bonnes méthodes.
Pour mysqli le bind se fait avec ma méthode bind_param

avec ce qui est en commentaire tu y es presque !

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 9 Messages

26 août 2015, 09:17

Bonjour,

J'ai dû m'absenter quelques temps et je me suis repencher dessus à mon retour.
Problème résolu !
<div id="resultatRequete">
			<?php
				include('connect.php');
				
				if (file_exists('connect.php')){
					
					// Préparation de la requête
					$requete = "INSERT INTO produits (Reference, Nom, Quantite, Fournisseur, Commentaire) VALUES (:reference, :nom, :quantite, :fournisseur, :commentaire)";
					$stmt = $connexiondb->prepare($requete);
				
					// Lecture des marqueurs
					$stmt->bindParam(':reference', $_POST['reference'], PDO::PARAM_STR);
					$stmt->bindParam(':nom', $_POST['nom'], PDO::PARAM_STR);
					$stmt->bindParam(':quantite', $_POST['quantite'], PDO::PARAM_INT);
					$stmt->bindParam(':fournisseur', $_POST['fournisseur'], PDO::PARAM_STR);
					$stmt->bindParam(':commentaire', $_POST['commentaire'], PDO::PARAM_STR);
					
					// Exécution de la requête
					$resultat = $stmt->execute();
				  
					// Affichage du résultat
					if ($resultat) {
							echo "Les données ont bien été insérées.<br />";
						} else {
							echo "L'insertion des données a échoué.<br />";
						}
				  
					include('close.php');
					}
				?>
		</div>
et mon ficher connect.php modifié :
<?php

  define('SERVEUR','10.0.241.89');
  define('USER','*****');
  define('PASSWORD','*****');
  define('BASE','*****');
    
  try{
    $connexiondb = new PDO("mysql:host=".SERVEUR.";dbname=".BASE, USER, PASSWORD);
  }
  
  catch (Exception $e){
    echo "Connexion au serveur refusée!<br />";
  }
  
  echo "Connexion au serveur réussi!<br />";
?>

Merci pour votre aide.