Bonjour à tous.

Je poste un petit problème que je rencontre actuellement au niveau de mon programme.

Je m'explique : j'ai un petit problème au niveau de l’exécution avec comme erreur :

upload/54974-error.png

Je sais par avance que l'erreur précise un mauvais nombre de paramètre au niveau constructeur et/ou de la fonction.

Mais je ne trouve pas le problème.

Voici mon code :

model/content :


 
<?php
 
/**
 * Description of content
 *
 * @author Anthony.Palermo
 */
class content {
 
    private $idContent;
    private $idUser;
    private $title;
    private $text;
 
    function __construct($idContent=null, $idUser=null, $title=null, $text=null) {
        $this->idContent = $idContent;
        $this->idUser = $idUser;
        $this->title = $title;
        $this->text = $text;
    }
 
 
    function getIdContent() {
        return $this->idContent;
    }
 
    function getIdUser() {
        return $this->idUser;
    }
 
    function getTitle() {
        return $this->title;
    }
 
    function getText() {
        return $this->text;
    }
 
    public function getReqParams ()
    {
        return array ('idContent' => $this->getIdContent(),
                      'idUser' => $this->getIdUser(),
                      'title' => $this->getTitle(),
                      'text' => $this->getText(),
                    );
    }
 
}



model/ajouteNews.php

 
<?php
 
require_once 'class/content.php';
require_once '../autoloader.php';
require_once '../controller/connexion.php';
 
function replaceEmailByID()
{
    $connexion = Connexion::getInstance();
    $emailUser = $_POST['emailUser'];
    $idUser= $connexion->prepare('SELECT idUser from user where emailUser ="'.$emailUser.'"');
    $idUser->execute();
    $ligne = $idUser->fetch(PDO::FETCH_ASSOC);
    return $content = new content('',$ligne['idUser'],$_POST['title'],$_POST['text']);
 
 
}
 
 
function testInsert(content $content)
{
 
    $db= Connexion::getInstance();
    $contents = replaceEmailByID();
 
    $sql=$db->prepare('INSERT INTO content(idContent, idUser, title, text) VALUE (?,?,?,?,?)');
    {
            $params = $content->getReqParams();
            $n=1; // Nombre de paramètres
 
                foreach($params as $v)
                    {
                        $sql->bindValue($n,$v,PDO::PARAM_STR);
                        echo $v; echo"<br>";
                        $n++;
                    }
 
        $sql->execute();
        $result=$sql->fetchAll();
        return $result;
      }
 
    var_dump($sql,$contents); 
 
}


et mon controller/ajouteNew.php

 
require_once '../model/class/content.php';
require_once '../model/ajouteNews.php';
 
 
class ajouteNew 
{
   public static function ExecuteAddNew(content $content)
   {
       testInsert($content);
   }
}
 
ajouteNew::ExecuteAddNew();


Si quelqu'un a une solution, je suis preneur =);

PS : Lors de mes debug, je récupère bien mes informations avec les bonnes valeurs
salut,
le message t'indique que tu n'es pas entrain de passer une instance de la classe content comme argument alors que ta fonction attend ça :

function testInsert(content $content) {//...}

Donc essaye de faire un var_dump sur la variable que tu passes pour voir ce qu'elle représente.
Bonjour, Oui en effet je viens de résoudre ce problème avec le code suivant :


<?php

/**
 * Description of ajouteDesNews
 *
 * @author Anthony.Palermo
 */

require_once '../model/class/content.php';
require_once '../model/ajouteNews.php';


class ajouteNew 
{
   public static function ExecuteAddNew()
   {
       $content = new content;
       testInsert($content);    
   }
}

ajouteNew::ExecuteAddNew();



maintenant il me reste plus qu'a résoudre un autre problème concernant le nombre d'entrées que j'injecte dans mon execute...

je reviendrai mettre le sujet en résolu une fois le code résolu entièrement
Après plus d'une heure de travail sur ce maudit code.
J'ai mon erreur qui persiste au niveau des paramètres envoyés au niveau de "execute()".

J'ai essayer de convertir mon objet en un tableau afin de renvoyer un "array" dans "execute()" sans succès.
J'ai essayer de redéfinir le code afin de supprimer la boucle "foreach" et d'entrer en dur les résultats : sans succès.

Donc je suis à votre merci pour une dernière aide.


<?php

require_once 'class/content.php';
require_once '../autoloader.php';
require_once '../controller/connexion.php';

function replaceEmailByID()
{
    $connexion = Connexion::getInstance();
    $emailUser = $_POST['emailUser'];
    $idUser= $connexion->prepare('SELECT idUser from user where emailUser ="'.$emailUser.'"');
    $idUser->execute();
    $ligne = $idUser->fetch(PDO::FETCH_ASSOC);
    return $content = new content('',$ligne['idUser'],$_POST['title'],$_POST['text']); 
    
      
}


function insertContent()
{
    
    $db= Connexion::getInstance();
    $contents = replaceEmailByID();
    
   var_dump($contents);
    
    if (isset($_POST['submit']) && !empty($contents)) {


    $sql=$db->prepare('INSERT INTO content(idContent, idUser, title, text) VALUES (?,?,?,?)');
    {
            $params = $contents;
            $n=1; // Nombre de paramètres 
            
                foreach($params as $v)
                    {
                        $sql->bindValue($n,$v,PDO::PARAM_STR); 
                        echo $v; echo"<br>";
                        $n++;
                    }
	
        $sql->execute();    <--------------- erreur à ce niveau
        $result=$sql->fetchAll();
        return $result;
      }
        
        
}  else {
    return false;
} 
   
}



l'erreur ce trouve au niveau de l'execute() selon mon navigateur : PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: no parameters were bound

merci d'avance
Modifié par Palerm0_57 (25 Aug 2016 - 16:35)
Bonjour !

J'avoue ne jamais avoir fait comme ça, j'utilise presque exclusivement les marqueurs nominatifs et je n'ai pas de problèmes...

Il y a une raison particulière à ce que vous utilisiez les points d'interrogation ?

Smiley smile
Modifié par Zelena (25 Aug 2016 - 18:01)
Non il n'y pas de raison particulière à utiliser les "?".
Il y'a plusieurs manière d'utiliser les procédures stockées.
Celle-ci en est une.

J'ai par ailleurs toujours utiliser ce procéder
Je pense qu'on y es presque...
J'ai réussi à outre-passer les valeurs en dur car j'aime l'automatisme mdr =$

donc il me reste un dernier problème à résoudre : celui de la clé étrangère.
En effet mon schéma relationnel est le suivant :

Un user n'est pas focément enregistrer dans une news : (#idUser , nomUser, prenomUser, emailUser, passUser)
Une news peut recevoir un enregistrement d'un user : (#idContent , idUser, title, text)

Quand j'enregistre une news directement via l'interface phpmyadmin, il y'a un problème d'enregistrement : " Duplicate entry '1' for key 'idUser'.
Ce que je veux c'est qu'un utilisateur puisse ajouter autant de news qu'il veut. Comme un style de blog.

Le problème lors de l'ajout d'une news à partir de mon application me donne comme erreur : 1452 Cannot add or update a child row: a foreign key constraint fails.

Que me conseillez-vous d'utiliser comme méthode ?

Merci d'avance.
si tu regardes du coté phpMyAdmin, tu as bien une clé étrangère ?? sinon il faut faire un alter table
ALTER TABLE content
ADD FOREIGN KEY (idUser)
REFERENCES user(idUser)


Ensuite ré-essaye ... regarde si IdContent est bien en auto-incremente ! comme ça tu peux l'enlever de ta requête insert into.


EDIT : j'espère que ton User existe deja dans ta table user avant de l'inserer dans ta table Content..... Smiley fache


EDIT 2 : Et à la limite il faudrait que tu mette UserID en autoincremente également, et là tu pourrais faire une requête imbriquer dans ton insert into !

exemple : INSERT INTO content(idUser) VALUES ((SELECT USERID from user where userName = "toto"))
Modifié par JENCAL (26 Aug 2016 - 15:04)