Page 1 sur 1

PDO - Fatal error: Function name must be a string

Posté : 04 août 2015, 22:42
par McWen
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

Re: PDO - Fatal error: Function name must be a string

Posté : 06 août 2015, 10:34
par xTG
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()

Re: PDO - Fatal error: Function name must be a string

Posté : 06 août 2015, 12:10
par @rthur
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

Re: PDO - Fatal error: Function name must be a string

Posté : 07 août 2015, 09:32
par McWen
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

Re: PDO - Fatal error: Function name must be a string

Posté : 07 août 2015, 09:39
par xTG
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>";

Re: PDO - Fatal error: Function name must be a string

Posté : 07 août 2015, 09:56
par McWen
Ç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)
}

Re: PDO - Fatal error: Function name must be a string

Posté : 07 août 2015, 10:37
par xTG
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"
}

Re: PDO - Fatal error: Function name must be a string

Posté : 07 août 2015, 12:19
par McWen
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"
}

Re: PDO - Fatal error: Function name must be a string

Posté : 07 août 2015, 13:37
par xTG
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
;)

Re: PDO - Fatal error: Function name must be a string

Posté : 07 août 2015, 19:34
par McWen
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..

Re: PDO - Fatal error: Function name must be a string

Posté : 10 août 2015, 10:07
par xTG
Comment initialises-tu $connexiondb ?

Re: PDO - Fatal error: Function name must be a string

Posté : 10 août 2015, 10:08
par moogli
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 !

@+

Re: PDO - Fatal error: Function name must be a string

Posté : 26 août 2015, 09:17
par McWen
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.