[RESOLU] ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

par Saian » 02 juin 2019, 12:05

Pas tant que ça, mais tu vas surement batailler un peu.
Il faut ajouter un input type file qui se traite côté php avec $_FILES et ajouter sur la balise form l'attribut enctype="multipart/form-data". Tu dois pouvoir trouver nombre d'exemple sur le web et le sujet a surement été abordé quelques fois sur ce forum.
Il va falloir aussi que tu affiches le fichier au destinataire ou que tu lui permettes de le télécharger. Et donc faire quand même attention de pas laisser passer n'importe quel type de fichier histoire que le destinataire ne se fasse pas infecter sa machine par un fichier vérolé (en admettant que le fichier provienne d'un utilisateur mal intentionné).

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

par Hyoshiko » 02 juin 2019, 11:58

Oui c'est nickel merci beaucoup !! :priere: :mrgreen:
Juste pour savoir si je veux envoyer un fichier avec ce message ça va être chiant à rajouter ou pas ? :/

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

par Saian » 02 juin 2019, 11:47

Coucou pas de soucis pour hier ;)

Et bien tu supposes très bien. Un SELECT n'insère pas des données c'est clair. :)

Si t'as pas déjà corrigé, ça sera surement mieux avec quelque chose comme ça (si la méthode insert de la class connexionDB est toujours comme sur la première page) :
$id = $DB->insert('INSERT INTO messages (id_expediteur,id_destinataire,message) VALUES (?,?,?)', array($_SESSION['id'], $id_destinataire, $message));
$error = $id ? "Votre message a bien été envoyé !" : $DB->getError();

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

par Hyoshiko » 02 juin 2019, 10:22

Salut désolé de pas avoir répondu hier... j'ai fait les modifications presque tout fonctionne :priere: :mrgreen:. le message est indiqué comme envoyé et le destinataire reconnu, par contre il ne va plus en bdd :shock: je n'ai aucun message d'erreur pourtant...

Code : Tout sélectionner

if(isset($_POST['envoi_message'])) { if(isset($_POST['destinataire'],$_POST['mess']) AND !empty($_POST['destinataire']) AND !empty($_POST['mess'])) { echo "formulaire soumis<br/>"; $destinataire = htmlspecialchars($_POST['destinataire']); $messages = htmlspecialchars($_POST['mess']); $stmt = $DB->query( 'SELECT id FROM utilisateur WHERE mail = :mail', // paramètre $sql array(':mail' => $destinataire)); // paramètre $data $dest_exist = $stmt->rowCount(); if($dest_exist== 1) { echo "le destinataire existe, on enregistre le message<br/>"; $stmt = $stmt->fetch(); $stmt = $stmt['id']; $messages = $DB->query('SELECT*FROM messages WHERE id_destinataire = :id_destinataire', array(':id_destinataire' => $stmt)); $error = "Votre message a bien été envoyé !"; } else { $error = "Cet utilisateur n'existe pas..."; } } else { $error = "Veuillez compléter tous les champs"; } }
j'ai supposé que le problème venait de cette ligne :

Code : Tout sélectionner

$messages = $DB->query('SELECT*FROM messages WHERE id_destinataire = :id_destinataire', array(':id_destinataire' => $stmt));

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

par Saian » 01 juin 2019, 23:58

C'est ce que je pensais, mais vu que tu fermais le php je me demandais.
Est ce que c'est assez clair maintenant ou c'est toujours un peu confus ?

Et oui effectivement même sans les messages d'erreur j'ai bien vu le problème. ;)

PS : les Call Stack sortent du fichier de log ?
PPS : j'ai utilisé fetchObject car je préfère la syntaxe objet moins chiante à écrire que le tableau associatif à mon goût.

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

par Hyoshiko » 01 juin 2019, 23:56

L'accolade est présente j'ai pas copié le code jusqu'au bout désolé.
J'ai spécifié les erreurs sur mon post précédent, sans doute trop tard u_u.

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

par Saian » 01 juin 2019, 23:47

Je mets chaque $DB->query() sur 2 lignes pour plus de lisibilité :
// ligne 18
$stmt = $DB->query(
  'SELECT id FROM utilisateur WHERE mail = :mail', // paramètre $sql
  array(':mail' => $destinataire)); // paramètre $data
$id = $stmt->fetchObject()->id;

// ligne 144
$stmt = $DB->query(
  'SELECT mail FROM utilisateur WHERE id = :id', // paramètre $sql
  array(':id' => $m['id_expediteur'])); // paramètre $data
$mail = $stmt->fetchObject()->mail;

Comme je te disais tout à l'heure, ta méthode connexionDB::query($sql, $data = array()) prends les paramètres de la requête en deuxième paramètre ($data) et fait déjà le execute... tu ne dois donc pas faire le execute sous le query et tu DOIS passer les paramètres à la méthode query s'il y en a.

La méthode query de connexionDB dont $DB est une instance :
public function query($sql, $data = array()){
  $req = $this->connexion->prepare($sql);
  $req->execute($data);
  return $req;
}

PS : je ne vois pas l'accolade qui ferme ton while.

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

par Hyoshiko » 01 juin 2019, 23:29

envoiexo.php Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: no parameters were bound in C:\wamp\www\ortho\bd\connexionDB.php on line 31
Call Stack
# Time Memory Function Location
1 0.0004 150568 {main}( ) ..\envoiexo.php:0
2 0.0029 170496 connexionDB->query( ) ..\envoiexo.php:18
3 0.0030 171096 execute ( ) ..\connexionDB.php:31

Code : Tout sélectionner

$id_destinataire = $DB->query('SELECT id FROM utilisateur WHERE mail = ?');// <====ligne 18 $id_destinataire->execute(array($destinataire));
exercices.php Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number in C:\wamp\www\ortho\bd\connexionDB.php on line 31
Call Stack
# Time Memory Function Location
1 0.0003 147120 {main}( ) ..\exercices.php:0
2 0.0239 172680 connexionDB->query( ) ..\exercices.php:144
3 0.0239 173280 execute ( ) ..\connexionDB.php:31

Code : Tout sélectionner

<?php if($msg_nbr == 0) { echo "Vous n'avez aucun message..."; } while($m = $messages->fetch()) { $p_exp = $DB->query('SELECT mail FROM utilisateur WHERE id = ?'); // ça c'est la ligne 144 . $p_exp->execute(array($m['id_expediteur'])); $p_exp = $p_exp->fetch(); $p_exp = $p_exp['mail']; ?>
Edit : je sais pas si c'est suffisant :/ han j'ai oublié les messages d'erreurs vraiment désolé.

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

par Saian » 01 juin 2019, 23:12

C'est quoi ces lignes en erreurs ? tu me les montres ? avec les messages d'erreur associés ? peut être que, on sait jamais.

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

par Hyoshiko » 01 juin 2019, 23:03

Bon je ne trouve pas de solution pour la ligne 18 . Par curiosité je suis partie voir sur la page exercices.php, je suis quand même contente le message est reçu il faut que je revois pour la ligne 18 et 144 d'exercice.php. Ce qui m'étonne c'est que ça fonctionne même avec les erreurs j'aimerai bien savoir pourquoi ahah.

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

par Hyoshiko » 01 juin 2019, 22:10

Dans le détail de l'erreur, le problème viendrait de ma ligne 18 et 25 de envoiexo.php
mon tableau de bdd comprend un id auto incrémenté, un id_expediteur, un id_destinataire et le message. le nombre de paramètres correspond au nombre de point d’interrogation à la ligne 25. je ne comprend pas encore moins pour la ligne 18, je suis en train de chercher .



edit: mince je n'avais pas vu ton message ! ahah
edit2: je prend note pour mon fichier connexionDB par contre les quelques lignes que tu as mis je ne vois pas ou les mettre, enfin quoi remplacer...
edit3 j'ai rien dit j'ai trouvé =_= je me fatigue. l'erreur de la ligne 25 est corrigé je vais voir pour la ligne 18

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

par Saian » 01 juin 2019, 21:53

Encore ce problème de paramètres qui ne correspondent pas à la requête. Le nombre de paramètres ne correspond pas.
"Nombre de paramètres non valide : aucun paramètre n'a été lié."
C'est par exemple si tu as trois points d'interrogations dans la requête mais seulement deux paramètres dans le tableau.
Personnellement j'aurai tendance à privilégier cette forme :
$messages = $DB->query(
  'SELECT * FROM messages WHERE id_destinataire = :id_destinataire', 
  array(':id_destinataire' => $id_destinataire));
Au moins pas besoin de modifier l'ordre des paramètres dans le tableau si l'ordre change dans la requête (lors de modifications) et si il manque un paramètre dans le tableau ça me paraît plus simple de voir lequel.

PS : rien à voir mais j'ai vu que dans ton fichier de class connexionDB tu fermes la balise <?php en bas du fichier. Chacun fait comme il veut mais je conseille fortement de ne pas fermer la balise php quand le fichier ne contient que du php ça peut éviter des problèmes de header already sent quand on fait appel à la fonction header si on a mit un espace ou un retour à la ligne après la balise fermante sans faire exprès.

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

par Hyoshiko » 01 juin 2019, 21:50

Bon déjà bonne nouvelle le message s'enregistre dans la bdd !
J'ai juste un dernier message que je n'arrive pas à comprendre x_x
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: no parameters were bound in C:\wamp\www\ortho\bd\connexionDB.php on line 31

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

par Hyoshiko » 01 juin 2019, 21:17

Oui merci beaucoup pour ton aide je suis ne train de vérifier du coup :) !

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

par Saian » 01 juin 2019, 20:47

Et bien comme je te dis si tu veux essayer de comprendre joue avec le echo par exemple pour voir si php passe bien à tel ou tel endroit du script.
C'est le script envoiexo.php qui gère l'envoi de message, tu peux par exemple mettre un echo dans le if principal de traitement de la soumission du formulaire au tout début juste avant le $destinataire = htmlspecialchars($_POST['destinataire']);. ( par exemple echo "formulaire soumis<br/>"; ensuite tu peux mettre un echo après le if($dest_exist == 1) { par exemple echo "le destinataire existe, on enregistre le message<br/>"; etc etc. Si le echo ne s'affiche pas ça montre bien que la condition n'est pas remplie, à toi d'essayer de comprendre pourquoi dans ce cas. Bref essaie de debuguer ton script il faut bien que tu apprennes à le faire. On a pas toujours une solution clé en main à donner.

EDIT : tu vois déjà tu me dis "Le formulaire est bien censé aller vers exercices.php" alors même que le code d'insertion du message est dans envoiexo.php. Tu vois donc que déjà la première chose que je t'ai dit de vérifier si la table est vide n'est pas bonne. Y a pas de secret, il faut juste prendre les problèmes dans l'ordre et faire appel à la logique pour comprendre d'où ils viennent et comment les corriger. La table est vide, première question, pourquoi est-elle vide ? le formulaire est-il soumis vers le bon script ? si oui, le script rentre-t-il dans la condition d'insertion ? etc ;)