Bonjour,
Merci pour ce tuto, il m'est trés utile! Cependant je me heurte à un soucis et j'ai besoin d'aide (j'assure avoir cherché pendant des heures avant)
Voici mon code :

22 $errors = false;
23 $success = false;
24 if (isset($_POST'action']) && $_POST'action'] == 'comment') {
25 $save = $comments_cls->save('posts', $post->id);
26 if($save){
27 $success = true;
28 }else{
29 $errors = $comments_cls->errors;
30 }
31 }

Pourtant mon navigateur m'indique "Fatal error: Call to undefined method OrigineGraphix\Plugins\Comments::save() in /var/www/server/Plugin Commentaires/views/posts/view.php on line 25"

Pourriez-vous m'aider svp?

19 réponses


Tu peux nous montrer le code de la fonction save ?
(Et par pitié, utilise la coloration syntaxique ...)

Oui je te donne ça et toutes mes excuses pour la colorisation, je n'avais pas vu précédemment.

public function save($ref, $ref_id) {
    $errors = ];
    if (empty($_POST'username'])) {
        $errors'username'] = $this->options'username_error'];
    }
    if (
        empty($_POST'email']) ||
        !filter_var($_POST'email'], FILTER_VALIDATE_EMAIL)) {
        $errors'email'] = $this->options'email_error'];
    }
    if (empty($_POST'content'])) {
        $errors'content'] = $this->options'content_error'];
    }
    if (count($errors) > 0) {
        $this->errors = $errors;
        return false;
    }
    // @todo : mettre un système antispam (akismet ou recaptcha)
    $q = $this->pdo->prepare("INSERT INTO comments SET
        username = :username,
        email = :email,
        content = :content,
        ref_id = :ref_id,
        ref = :ref,
        created = :created");
    $data = 
        'username' => $_POST'username'],
        'email' => $_POST'email'],
        'content' => $_POST'content'],
        'ref_id' => $ref_id,
        'ref' => $ref,
        'created' => date('Y-m-d H:i:s')
    ];
    return $q->execute($data);
    }
}

C'est pas le nom de ta fonction qu'il aime pas ?
Change save, appelle là autrement. Je crois que c'est ça ...

Je ces pas ci ces sa mais ta une "}" en trop ces la dernière, mes sa peux aussi être la fin de ta class?

public function save($ref, $ref_id) {
    $errors = ];
    if (empty($_POST'username'])) {
        $errors'username'] = $this->options'username_error'];
    }
    if (
        empty($_POST'email']) ||
        !filter_var($_POST'email'], FILTER_VALIDATE_EMAIL)) {
        $errors'email'] = $this->options'email_error'];
    }
    if (empty($_POST'content'])) {
        $errors'content'] = $this->options'content_error'];
    }
    if (count($errors) > 0) {
        $this->errors = $errors;
        return false;
    }
    // @todo : mettre un système antispam (akismet ou recaptcha)
    $q = $this->pdo->prepare("INSERT INTO comments SET
        username = :username,
        email = :email,
        content = :content,
        ref_id = :ref_id,
        ref = :ref,
        created = :created");
    $data = 
        'username' => $_POST'username'],
        'email' => $_POST'email'],
        'content' => $_POST'content'],
        'ref_id' => $ref_id,
        'ref' => $ref,
        'created' => date('Y-m-d H:i:s')
    ];
    return $q->execute($data);
    }
} <----------------------------------------------------------------------------------------

C'est quoi cette requête ... ? Un insert ou un update ?

Je connais "INSERT INTO table (field ...) VALUES ($val)" ou encore "UPDATE table SET field=val " mais le INSERT SET j'avoue que je n'ai jamais vu xD

J'ai même pas vue :), et voila une pratique pour pas faire des requête ou tu dois toujours tout retaper pour chaque requête différente:

public $_insert_keys = array(); // réutilisable par les autre fonction 
    public $_insert_values = array(); // réutilisable par les autre fonction 
    public function insert($table = null, $array = null){ // $table => nom de la table, $array => array avec tes donner
        if(!empty($table) && !empty($array) && is_array($array)){
            foreach($array as $key => $values){ // ici on stock tout les nom de colonne dans $this->_insert_keys] et ces valeur $this->_insert_values]
                $this->_insert_keys] = $key; // les $key de ton array() doive correspondre aux colonnes de ta table
                $this->_insert_values] = $this->escape($values); // escape() => htmlentities($value, ENT_QUOTES. 'UTF-8')
            }
            // ici on utilise la fonction implode pour introduire les nom de colonne stocker dans $_insert_keys] et valeur stocker dans $_insert_values]
            $sql = "INSERT INTO `{$table}` (`" . implode("`, `", $this->_insert_keys) . "`) VALUES ('" . implode("', '", $this->_insert_values) . "')";
            try{ $this->ta_connexion->query($sql); } catch (Exception $e) { echo "Insert {$table} failed"; }
        }
        return false;
    }

Et sa donne sa et reutilisable par les autre fonction

public function insert($table = null, $array = null){
        if(!empty($table) && !empty($array) && is_array($array)){
            foreach($array as $key => $values){ $this->_insert_keys] = $key; $this->_insert_values] = $this->escape($values); }
            $sql = "INSERT INTO `{$table}` (`" . implode("`, `", $this->_insert_keys) . "`) VALUES ('" . implode("', '", $this->_insert_values) . "')";
            try{ $this->ta_connexion->query($sql); } catch (Exception $e) { echo "Insert {$table} failed"; }
        }
        return false;
    }

Bonsoir,

Merci pour vos propositions, je vais tester cela dés que j'aurais réparé mon erreur #2002 pour me connecter à ma base de données, je ne sais pas quoi faire on me parle d'un document mysql.sock mais comme j'utilise vagrant je ne sais pas trouver ce fichier... enfin bref.
En ce qui concerne le INSERT INTO ... SET, c'est comme cela que MONSIEUR GRAFIKART nous apprend dans le tuto pour faire un plugin de commentaires, j'ai donc cru que c'était une methode abrégée...
si je comprends bien SevDevSar, tu me fais changer le nom de ma fonction save en insert? mais la variable $table n'est pas connue de ou vient-elle?

Desole pour ;on hesitation mais j'ai commence le php la semaine derniere donc...

le script que je tes donner tu le mes dans la classe de ta connexion de base de donner, et pour le utiliser je te donne le exemple avec ce que tu a donner:

public function save($ref, $ref_id) {
    $errors = ];
    if (empty($_POST'username'])) {
        $errors'username'] = $this->options'username_error'];
    }
    if (
        empty($_POST'email']) ||
        !filter_var($_POST'email'], FILTER_VALIDATE_EMAIL)) {
        $errors'email'] = $this->options'email_error'];
    }
    if (empty($_POST'content'])) {
        $errors'content'] = $this->options'content_error'];
    }
    if (count($errors) > 0) {
        $this->errors = $errors;
        return false;
    }
    // @todo : mettre un système antispam (akismet ou recaptcha)
    // je ces pas comment sa marche avec ton MVC j'ai pas regarder ce tutoriel mais chez moi ces commsa:
    $recuest= new DBase(); // ces ma class de connection a la basse de donner
    //$recuest->insert("ici le nom de ta table", "et ici le array() avec tes donner")
    $array = (
        'username' => $_POST'username'],
        'email' => $_POST'email'],
        'content' => $_POST'content'],
        'ref_id' => $ref_id,
        'ref' => $ref,
        'created' => date('Y-m-d H:i:s')
    );
    $recuest->insert("comments", $array);
}

et pour ce qui et du formulaire de envois la aussi tu peux faire une class réutilisable dans tout ton site avec plain de paramètre qui vont sécuriser l’accès a ta basse de donner et les validation, mes je crois que dans le MVC du tuto GRAFIKART il dois aussi une class comme cela, GRAFIKART fait les meilleur tuto du web en français 100%

Voila un exemple concret comme ces chez moi si je devrais faire ta fonction, mais ces a toi de le adapter a ta structure si tu souhaite faire comme j'ai dit :)

CLASS Dbase:

<?php
class Dbase{
    private $_pdo_host_dbname = "mysql:host=localhost;dbname=test";
    private $_user = "user";
    private $_password = "password";
    private $_conndb = FALSE;
    public $_insert_keys = array();
    public $_insert_values = array();
    public function __construct(){
        $this->connect();
    }
    private function connect(){
        try{
            $this->_conndb = new PDO($this->_pdo_host_dbname,$this->_user,$this->_password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
        } catch (Exception $e) {
            echo "Connection failed";
        }
    }
    public function escape($value){
        return htmlentities($value, ENT_QUOTES. 'UTF-8');
    }
    public function insert($table = null, $array = null){
        if(!empty($table) && !empty($array) && is_array($array)){
            foreach($array as $key => $values){ $this->_insert_keys] = $key; $this->_insert_values] = $this->escape($values); }
            $sql = "INSERT INTO `{$table}` (`" . implode("`, `", $this->_insert_keys) . "`) VALUES ('" . implode("', '", $this->_insert_values) . "')";
            try{ $this->ta_connexion->query($sql); } catch (Exception $e) { echo "Insert {$table} failed"; }
        }
        return false;
    }
}

CLASS Application pour partager la connexion:

<?php
    class Application {

    public $db;

    public function __construct(){
        $this->db = new Dbase();
    }
}

et ici exemple ta CLASS Commentaire pour les commentaire:

<?php
class Commantaire extends Application{
public function save($ref, $ref_id) {
    $errors = ];
    if (empty($_POST'username'])) {
        $errors'username'] = $this->options'username_error'];
    }
    if (
        empty($_POST'email']) ||
        !filter_var($_POST'email'], FILTER_VALIDATE_EMAIL)) {
        $errors'email'] = $this->options'email_error'];
    }
    if (empty($_POST'content'])) {
        $errors'content'] = $this->options'content_error'];
    }
    if (count($errors) > 0) {
        $this->errors = $errors;
        return false;
    }
    // @todo : mettre un système antispam (akismet ou recaptcha)

    // je fais appel a ma fonction insert() et mais les donner $recuest->db->insert("ici le nom de ta table", "et ici le array() avec tes donner")

    $array = (
        'username' => $_POST'username'],
        'email' => $_POST'email'],
        'content' => $_POST'content'],
        'ref_id' => $ref_id,
        'ref' => $ref,
        'created' => date('Y-m-d H:i:s')
    );
    $recuest->db->insert("comments", $array);
}
}

Ouah super merci beaucoup pour cette mine d'informations. Demain je vais recuperer ma connection a ma DB je suppose donc je le testerai et reviendrai poster un message pour t'informer de l'evolution.
Merci pour ton temps et tes connaissances! J'apprecie vraiment!

et encore une petite chose j'ai in-peut regarder sur le net pour ton erreur avec vanguard, tes pas le seul mais personne a vraiment une solution, mais il y a un type qui dit que il a lancer vanguard et il a KILL le process appeler VBoxHeadless.exe et il a relancer vanguard et sa a re-marcher, voila le lien: link, bonne soirée

Alors,
j'ai de nouveau la connection avec ma DB aprés réinstallation de ma VM, j'ai essayé ton code, que j'ai adapté et mis dans ma page comments, mais il me dis toujours "Fatal error: Call to undefined method OrigineGraphix\Plugins\Comments::save() in /var/www/server/public/Plugin Commentaires/views/posts/view.php on line 25"
Le problème ne venait donc sans doute pas de la fonction en elle même mais à l'évidence de la méthode mais je ne vois pas le soucis...
Je me casse la tête mais le mur va finir par tomberˆˆ.

j'ai oublier un GRAND détail, j'ai pas définie que $array et un array() :) désoler

$array = array(
        'username' => $_POST'username'],
        'email' => $_POST'email'],
        'content' => $_POST'content'],
        'ref_id' => $ref_id,
        'ref' => $ref,
        'created' => date('Y-m-d H:i:s')
    );

Pas de soucis je l'avais vu, tu n'as pas à être désolé, c'est déjà cool que tu m'aides!!!!!
en revanche je ne comprends vraiment où est l'erreur de méthode sérieusement.

je ces de ou sa viens j'ai pas trop fait gaffe j'ai voulu allez trop vite, dans

$array = array(
'username' => $_POST'username'],
'email' => $_POST'email'],
'content' => $_POST'content'],
'ref_id' => $ref_id,
'ref' => $ref,
'created' => date('Y-m-d H:i:s')
);

on demande

'username' => $_POST'username'],
'email' => $_POST'email'],
'content' => $_POST'content'],

mais le probleme et de ou recupere $_POST on est dans une fonction :)

tu dois juste faire une petite modification:

public function save($ref, $ref_id, $username, $email, $content)

et quand tu utilise ta fonction tu fait:

save($ref, $ref_id, $_POST'username'], $_POST'email'], $_POST'content'])

et ici:

if (empty($username)) {
$errors'username'] = $this->options'username_error'];
}
if (
empty($email) ||
!filter_var($_POST'email'], FILTER_VALIDATE_EMAIL)) {
$errors'email'] = $this->options'email_error'];
}
if (empty($content)) {
$errors'content'] = $this->options'content_error'];
}
if (count($errors) > 0) {
$this->errors = $errors;
return false;
}

Bien tenter mais toujours la meme erreur de methode. Je pense que je vais devoir reprendre le codage a zero je verrai peut etre mieux le soucis vu sous cette angle.
A moins que tu aies une autre idée...

Ta fonction $error] tu la utilise comment?

demain ou aprer demain je commence un tuto complet en plusieurs étape sur la Validation et un formulaire de enregistrement et envois d'un email de configuration