Partage
  • Partager sur Facebook
  • Partager sur Twitter

probleme avec $req->execute(array(

Sujet résolu
1 juin 2010 à 16:19:59

bonjour, quand j'exécute ce code, j'obtiens l'erreur suivante :

Fatal error: Call to a member function execute() on a non-object in *** on line 27

<?php
session_start();
if (!isset($_SESSION['login'])) {
	header ('Location: index.php');
	exit();
}
try
{
	$bdd = new PDO('mysql:host=***
;dbname=***', '***', '***');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}

	$reponse = $bdd->query('SELECT * FROM marche WHERE id_marche = \'' . $_POST['accepte'] . '\';') or die(print_r($bdd->errorInfo()));
	$donnees = $reponse->fetch();
	
        $login = $donnees['login'];
	$login1 = $_SESSION['login'];
	$quant_donne = $donnees['quant_donne'];
	$ressource1 = $donnees['ressource1'];
	$ressource2 = $donnees['ressource2'];
	$timestamp = time();
	
        $req = $bdd->prepare('INSERT INTO transac(login, login1, quant_donne, ressource1, ressource2, timestamp) VALUES(:login, :login1, :quant_donne, :ressource1, :ressource2, :timestamp)');
	$req->execute(array(
		'login' => $login,
		'login1' => $login1,
		'quant_donne' => $quant_donne,
		'ressource1' => $ressource1,
		'ressource2' => $ressource2,
		'timestamp' => $timestamp 
		));

	header ('Location: accueil.php');


?>

<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?PHP 
//echo $login. ' '.$login1.' '.$quant_donne.' '.$ressource1.' '.$ressource2.' '.$timestamp ;
?>
</body>
</html>


par contre, lorsque je fais un echo de mes variables comme dans le bas du script, j'obtiens les bons résultats.

je ne comprend pas ou mon erreur :(

merci pour vos réponses.
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2010 à 16:26:41

Ce genre d'erreur vient d'un problème au niveau de ta requête SQL. Vérifie la requête.
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
1 juin 2010 à 16:32:59

Bonjour ,
Et les ":" tu les oublis :)


<?PHP

        $req = $bdd->prepare('INSERT INTO transac(login, login1, quant_donne, ressource1, ressource2, timestamp) VALUES(:login, :login1, :quant_donne, :ressource1, :ressource2, :timestamp)');
	$req->execute(array(
		':login' => $login,
		':login1' => $login1,
		':quant_donne' => $quant_donne,
		':ressource1' => $ressource1,
		':ressource2' => $ressource2,
		':timestamp' => $timestamp 
		));

?>

  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2010 à 16:37:24

alors la, ça dépasse mes connaissances de débutant :-°

j'ai execute cette requete sous PHPmyadmin :

INSERT INTO transac(login, login1, quant_donne, ressource1, ressource2, timestamp) VALUES(:login, :login1, :quant_donne, :ressource1, :ressource2, :timestamp)


en remplaçant les VALUES par des données, elle fonctionne parfaitement et insère ce que je veux dans ma BDD.

je ne pense avoir oublié les ":", je tire ce code du tuto => http://www.siteduzero.com/tutoriel-3-1 [...] -donnees.html
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
1 juin 2010 à 16:42:00

Ne compares pas
SQL de Phpmyadmin
Mysql
PDO
Maintenant si je réponds c'est que je l'emploies tout le temps , et il faut les ":"
Bien sur tu fais comme chez toi ... :euh:
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2010 à 16:50:14

comme je le dis, je suis débutant.....

tu penses bien que j'ai essayer ta solution lavarenne dés que je l'ai lu, et le résultat obtenu est exactement le même ^^
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
1 juin 2010 à 17:06:20

Citation : schineau

comme je le dis, je suis débutant.....
tu penses bien que j'ai essayer ta solution lavarenne dés que je l'ai lu, et le résultat obtenu est exactement le même ^^


As tu controlé par des echo, si la connection se fait bien etc ... o_O
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2010 à 17:16:23

Citation : schineau


$login = $donnees['login'];
	$login1 = $_SESSION['login'];
	$quant_donne = $donnees['quant_donne'];
	$ressource1 = $donnees['ressource1'];
	$ressource2 = $donnees['ressource2'];
	$timestamp = time();
	

echo $login. ' '.$login1.' '.$quant_donne.' '.$ressource1.' '.$ressource2.' '.$timestamp ;



par contre, lorsque je fais un echo de mes variables comme dans le bas du script, j'obtiens les bons résultats.



...oui...
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
1 juin 2010 à 17:45:17

Moi j'ais testé un copié collé de ton PHP et ça marche !
sauf que j'ais retiré le OR DIE houlala pas de MySql avec du PDO

$reponse = $bdd->query("SELECT * FROM marche WHERE 'id_marche' = '$_POST['accepte']'");
	$donnees = $reponse->fetch();
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2010 à 18:10:45

Ton erreur est due au fait que $req n'est pas un objet. Ce qui veut dire que ton prepare ne renvoie pas ce qu'il devrait. Regarde s'il a renvoyé des erreurs (encore une fois, avec or exit(...) ou en lançant des exceptions (voir la doc)).

Sinon, les : sont facultatifs dans les execute et bindValue / bindParam.
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
1 juin 2010 à 19:57:52

Citation : Fayden

Ton erreur est due au fait que $req n'est pas un objet. Ce qui veut dire que ton prepare ne renvoie pas ce qu'il devrait. Regarde s'il a renvoyé des erreurs (encore une fois, avec or exit(...) ou en lançant des exceptions (voir la doc)).
Sinon, les : sont facultatifs dans les execute et bindValue / bindParam.


Oui controles tes erreurs avec la bote secréte avant le prépare

$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
qui remplace le or die puisque pas de mysql avec PDO :)
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2010 à 20:14:27

dsl, je comprends rien a ce que vous me dites :euh:

edit :

j'ai fais ça =>
$reponse = $bdd->query('SELECT * FROM marche WHERE id_marche = \'' . $_POST['accepte'] . '\';');
	$donnees = $reponse->fetch();
	$login = $donnees['login'];
	$login1 = $_SESSION['login'];
	$quant_donne = $donnees['quant_donne'];
	$ressource1 = $donnees['ressource1'];
	$ressource2 = $donnees['ressource2'];
	$timestamp = time();
	
	$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	$req = $bdd->prepare('INSERT INTO transac(login, login1, quant_donne, ressource1, ressource2, timestamp) VALUES(login, login1, quant_donne, ressource1, ressource2, timestamp)');
	$req->execute(array(
		'login' => $login,
		'login1' => $login1,
		'quant_donne' => $quant_donne,
		'ressource1' => $ressource1,
		'ressource2' => $ressource2,
		'timestamp' => $timestamp 
		));

	header ('Location: accueil.php');


voila ce que ça me donne =>

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.' in ***:27 Stack trace: #0 ***(27): PDO->prepare('INSERT INTO tra...') #1 {main} thrown in *** on line 27
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
1 juin 2010 à 20:43:41

Citation : schineau

............



Escuses moi je réédites car je n'avais pas vu l'erreur trés interessante il faut mieux écrire ainsi:

<?php
session_start();
if (!isset($_SESSION['login'])) {
   header ('Location: index.php');
   exit();
}
try
{
 $bdd = new PDO('mysql:host=***;dbname=***', '***', '***');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$accepte = (isset($_POST['accepte'])) ? $_POST['accepte'] : '';
$reponse = $bdd->query("SELECT * FROM marche WHERE id_marche ='$accepte'");

while (	$donnees = $reponse->fetch())
{
        $login = $donnees['login'];
	$login1 = $_SESSION['login'];
	$quant_donne = $donnees['quant_donne'];
	$ressource1 = $donnees['ressource1'];
	$ressource2 = $donnees['ressource2'];
	$timestamp = time();
}
$reponse->closeCursor(); 

$req = $bdd->prepare("INSERT INTO transac (login, login1, quant_donne, ressource1, ressource2, timestamp) 
 VALUES(:login, :login1, :quant_donne, :ressource1, :ressource2, :timestamp)");
	$req->execute(array(
		':login' => $login,
		':login1' => $login1,
		':quant_donne' => $quant_donne,
		':ressource1' => $ressource1,
		':ressource2' => $ressource2,
		':timestamp' => $timestamp ));

	header ('Location: accueil.php');


?>

<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?PHP 
//echo $login. ' '.$login1.' '.$quant_donne.' '.$ressource1.' '.$ressource2.' '.$timestamp ;
echo "</body></html>";
?>

Décidément je réédites encore Fayden j'avais pas lu j'ais rajouté ta remarque dans mon code corigé o_O
Dis donc a propos tu as vu comme
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
est efficace, je le trouves plus claire en infos que le OR DIE t'en penses quoi ?


  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2010 à 20:50:44

Il semble te manquer un closeCursor() quelque part.
  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2010 à 23:40:56

j'ai test ton code lavarenne, ça ne marche pas chez moi.....

concrètement, voila ce que je veux faire :

j'ai une page "marché"

Image utilisateur

contenant des données extraient de la table "marche".

Image utilisateur

le joueur schineau accepte la transaction de papy (1er ligne). Dans la premiere table login = papy

j'ai une deuxieme table "transac" qui contient les champs suivants

Image utilisateur

le but du jeu, c'est de creer une page ou papy peut voir qui lui a acheté quoiet pour cela, j'ai besoin d'extraire des donnees de la table "marche" pour les introduire dans la table "transac".

les données a changer de table sont :
-login
-quant_donne
-ressource1
-ressource2

login1 = joueur qui a accepté la transaction
timestamp = time()

par contre, le timestamp des 2 tables est diffèrent.
dans la table marche : timestamp = date de la demande de transaction
dans la table transac : timestamp = date de l'acceptation de la transaction

je ne sais pas si j'ai été clair ?
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
2 juin 2010 à 0:15:00

Bon j'effaces et réécrits tout !
j'avais plein d'erreurs

1) dans la premiére requéte
WHERE 'id_marche' = '$accept'")
Alors que c'était

WHERE id_marche = '$accepte' ");

avec le ";" a la fin pff... et le "e" de accepte et en prime pas de ' ' sur id_marche :colere2:
J'ais donc réédité plus haut.
Testé ça marche.
2) gestion des erreurs juste derriére l'ouverture de la base !
J'ais donc mis en ligne 15
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

3) Reste que si la premiére requéte a plusieures lignes,
il faut écrire sans employer $reponse->closeCursor();
et mettre les ajourts dans la boucle (testé, ça marche)
ça donnerais cela
<?php
session_start();
if (!isset($_SESSION['login'])) {
   header ('Location: index.php');
   exit();
}
try
{
 $bdd = new PDO('mysql:host=***;dbname=***', '***', '***');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$accepte = (isset($_POST['accepte'])) ? $_POST['accepte'] : '';
$reponse = $bdd->query("SELECT * FROM marche WHERE id_marche = '$accepte'");

while (	$donnees = $reponse->fetch())
{
 $login = $donnees['login'];
 $login1 = $_SESSION['login'];
 $quant_donne = $donnees['quant_donne'];
 $ressource1 = $donnees['ressource1'];
 $ressource2 = $donnees['ressource2'];
 $timestamp = time();

  $req = $bdd->prepare("INSERT INTO transac (login, login1, quant_donne, ressource1, ressource2, timestamp) 
   VALUES(:login, :login1, :quant_donne, :ressource1, :ressource2, :timestamp)");
  $req->execute(array(
		':login' => $login,
		':login1' => $login1,
		':quant_donne' => $quant_donne,
		':ressource1' => $ressource1,
		':ressource2' => $ressource2,
		':timestamp' => $timestamp ));
}
?>

<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?PHP 
echo $login. ' '.$login1.' '.$quant_donne.' '.$ressource1.' '.$ressource2.' '.$timestamp ;
echo "</body></html>";
?>






  • Partager sur Facebook
  • Partager sur Twitter
2 juin 2010 à 1:37:58

bon, la gestions des pages perso de SFR est HS, je ne peux pas tester ton script :(

mais bon, je vais essayer d'être plus clair sur ce que je obtenir :D

je vais tenter d'expliquer de A à Z

allez, je dévoile tout......

je crée un marché d'échange de ressource.

un joueur que l'on nommera "papy" se connecte au site et propose d'échanger du bois contre du marbre a hauteur de 1000 unités.

papy alimente la table "marche"

Image utilisateur

id_marche => AUTO_INCREMENT
login => papy
ville, X, Y => ne servent pas a grand chose...... ^^
quant_donne = 1000
ressource1 = bois
ressource2 = marbre
timestamp = date de la mise sur le marché

un deuxieme joueur "schineau" va sur le marché =>

Image utilisateur

il est tres interressé par le proposition de papy et accepte le deal (bouton radio contenant "id-marche")

schineau valide le deal sur une autre page.

et la est mon probleme...

je veux que papy puisse voir que schineau lui a echangé 1000 marbre contre 1000 bois.

je crée donc une deuxième table "transac" =>

Image utilisateur

id_transac = AUTO_INCREMENT
login = papy
login1 = schineau ($_SESSION)
quant_donne = 1000
ressource1 = bois
ressource2 = marbre
timestamp = date a laquelle schineau accepte le deal

dans mon script, $_post['accepte'] contient "id_marche" (via le bouton radio) pour pouvoir appeler la ligne correspondante a la table "marche" et pouvoir ainsi alimenter ma table "transac".

c'est plus clair ???
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
2 juin 2010 à 2:03:24

Normalement tu as une page qui tout bétement affichera la table transac !
mais ce n'est pas le sujet !
Tu pourrais même en prime envoyer a papy l'offre acceptée par mail :)

Voila ça marche ! Je viens te revoir demain ... enfin ce matin :)

<?php
session_start();
/* ========================
Au moment ou nous rentrons dans ce PHP
papy a inform‚ dans la table "marche"
un data d'indexe (id_marche) par exemple 18
qui a pour valeurs entre autres
le champ

login  papy
ville  X
quant_donne = 1000
ressource1 =  bois
ressource2 =  marbre
timestamp = date de la mise sur le marché
________________________________________
Au moment ounous rentrons dans ce PHP
schineau a clique la case 18 ==> $_POST['accepte']=18 attention pas "18"
et comme il est logue ==>  $_SESSION['login']="schineau"
=========================== */
if (!isset($_SESSION['login'])) {
   header ('Location: index.php');
   exit();
}
try
{
 $bdd = new PDO('mysql:host=***;dbname=***', '***', '***');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$accepte = (isset($_POST['accepte'])) ? $_POST['accepte'] : '';
if($accepte!="")
 {
  $reponse = $bdd->query("SELECT * FROM marche WHERE id_marche='$accepte'");
  while ( $donnees = $reponse->fetch())
   {
    $login = $donnees['login'];
    $login1 = $_SESSION['login'];
    $quant_donne = $donnees['quant_donne'];
    $ressource1 = $donnees['ressource1'];
    $ressource2 = $donnees['ressource2'];
    $timestamp = time();
   }
  $reponse->closeCursor(); 
  $req = $bdd->prepare("INSERT INTO transac (login, login1, quant_donne, ressource1, ressource2, timestamp) 
  VALUES(:login, :login1, :quant_donne, :ressource1, :ressource2, :timestamp)");
  $req->execute(array(
    ':login' => $login,
    ':login1' => $login1,
    ':quant_donne' => $quant_donne,
    ':ressource1' => $ressource1,
    ':ressource2' => $ressource2,
    ':timestamp' => $timestamp ));

 }
?>

<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?PHP 

echo "</body></html>";
?>
  • Partager sur Facebook
  • Partager sur Twitter
2 juin 2010 à 9:15:29

SUPER, ça marche ^^

merci lavarenne pour ton aide.

donc concretement, tu as rajouter

$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$accepte = (isset($_POST['accepte'])) ? $_POST['accepte'] : '';
if($accepte!="")

...

$reponse->closeCursor();


et tu as legerement modifier mon script.

mais pourquoi mettre un while ?

pour le mail, c'est mort, SFR bloque la fonction Mail() :(
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
2 juin 2010 à 10:37:54

Merci a toi de mettre résolu :) et A++
Pour ta question par MP
<?php
session_start();
if (!isset($_SESSION['login'])) {
   header ('Location: index.php');
   exit();
}
try
{
 $bdd = new PDO('mysql:host=***
;dbname=***', '***', '***');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$accepte = (isset($_POST['accepte'])) ? $_POST['accepte'] : '';
if($accepte!="")
 {
  $reponse = $bdd->query("SELECT * FROM marche WHERE id_marche='$accepte'");
  while ( $donnees = $reponse->fetch())
   {
    $login = $donnees['login'];
    $login1 = $_SESSION['login'];
    $quant_donne = $donnees['quant_donne'];
    $ressource1 = $donnees['ressource1'];
    $ressource2 = $donnees['ressource2'];
    $timestamp = time();
   }
  $reponse->closeCursor(); 
  $req = $bdd->prepare("INSERT INTO transac (login, login1, quant_donne, ressource1, ressource2, timestamp1) 
  VALUES(:login, :login1, :quant_donne, :ressource1, :ressource2, :timestamp1)");
  $req->execute(array(
    ':login' => $login,
    ':login1' => $login1,
    ':quant_donne' => $quant_donne,
    ':ressource1' => $ressource1,
    ':ressource2' => $ressource2,
    ':timestamp1' => $timestamp ));
  $req->closeCursor(); 


$reponse = $bdd->exec("DELETE FROM  marche WHERE id_marche='$accepte'");
$reponse->closeCursor(); 



 }
 header ('Location: accueil.php');
?>

<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
</body>
</html>
  • Partager sur Facebook
  • Partager sur Twitter
3 mars 2017 à 12:13:14 - Message modéré pour le motif suivant : Merci d’utiliser le bouton code pour insérer un code sur le forum


26 novembre 2024 à 16:18:46 - Message modéré pour le motif suivant : Merci de créer votre propre sujet


26 novembre 2024 à 16:20:57

@PaulAdamsNOMEL  Bonsoir, merci de ne pas squatter le sujet des autres, créer votre propre sujet dans le respect des règles du forum à savoir qu'un message commence par des règles de politesses (Un bonjour ou des salutations à la communauté et se termine par des remerciements par avances pour les futures réponses), la description de votre problème et le code que vous avez écrit inséré sur le forum à l'aide de l'outil d'intégration de code soit le bouton code </>.

Je ferme ce déterrage.

Le message qui suit est une réponse automatique activée par un membre de l'équipe de modération. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

Pour plus d'informations, nous vous invitons à lire les règles générales du forum

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Liens conseillés

  • Partager sur Facebook
  • Partager sur Twitter