Bonjour,

Voila je rencontre un petit problème avec mon code.
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 :

Catchable fatal error: Argument 1 passed to function() must be an instance of content, none given

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


<?php

/**
 * Description of ajouteDesNews
 *
 * @author Anthony.Palermo
 */
require_once '../model/class/content.php';
require_once '../model/ajouteNews.php';

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

ajouteNew::ExecuteAddNew();

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

PS : Lors de mes debug, je récupère bien mes informations avec les bonnes valeurs

9 réponses


Dans ajouteNew.php, ta variable $content doit être une instance de content et tu lui fournis un null.
Pour régler le problème

<?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();

Ou

function testInsert(content $content=null)

ah super je te remercie Kareylo. C'était bien ça.
J'ai juste une erreur au niveau de mon "exec" avec "l'invalid parameter number"...
j'ai un "?" en trop que je viens de supprimer.

Une fois mon code debugger, je le marque en résolu.
Mais encore merci

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

Sauf erreur de mart car je ne suis pas sur à 100% de ma réponse, avec "bindValue", il faut spécifier le type de la variable et les 2 premiers ne peuvents être des string.

Non bien au contraire, les 2 premières informations ne sont que des "INT".

J'ai donc pris en compte ce que tu m'a dit et changer :

$sql->bindValue($n,$v,PDO::PARAM_STR); 
  $sql->bindParam($n,$v,PDO::PARAM_INT); 

mais le problème malheureusement reste le même. Je crois que je vais abandonner la boucle et passer les valeurs à la main

Oui c'est mieux car il faudrait une condition pour les suivant vu que se sonts des strings.

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.

Mettre une valeur par défaut sur idUser à null et retire le unique que tu dois avoir sur idContent-idUser.