IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Array PHP email


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 161
    Par défaut Array PHP email
    Bonjour à tous,

    J'ai un souci au niveau de mon code et je ne comprends pas l'origine de ce problème. En effet, j'ai créé une fonction PHP contenant un tableau avec une liste des mots interdits. Il s'agit d'un système de question/réponse. Si un client saisit un mot interdit dans sa réponse, je vérifie que ce mot ou expression est dans mon tableau. Si le mot existe et est interdit j'envoie un émail à l'administrateur pour le signaler, sinon j'enregistre la réponse et je l'affiche. Même dans le cas ou le mot est interdit j'enregistre quand même la réponse et c'est juste au niveau de l'affichage que je remplace le mot par des étoiles (***). L'envoie de mail c'est pour informer l'administrateur qu'un mot interdit a été saisi et lui permettre de le modérer ou de le supprimer.

    Voici mon script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // fonction mots interdits:
    function motInterdit ($mot) {
            $mots = array(
                  'mot 1',
                  'mot 2',
                  'mot 3'
            );
            $mot_remplacement = '******';
            $data = str_ireplace($mots, $mot_remplacement, $mot);
            return $data;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    // requête d'insertion ici
    /*.........*/
     
    // select
    $q = array('lastId'=>$lastId);
    $sql = 'SELECT * FROM reponse WHERE reponse_id = :lastId';
    $req = $db->prepare($sql);
    $req->execute($q) or die(print_r($db->errorInfo()));
     
    foreach ($req->fetchAll() as $data):
           $tab = nl2br(htmlspecialchars($data));
           $resTab = motInterdit ($tab);
     
           if (is_array(resTab) && in_array($tab, $resTab)) {
                 // envoie de mail
                 mail($to, $subject, $message, $headers);
           }
    endforeach;
    Je pense que mon problème c'est au niveau de la vérification si le mot interdit existe dans mon tableau. Car je n'arrive pas à envoyer mon mail. Mais je n'ai pas de problème au niveau du traitement de mon mail car si je fais un test d’envoi de mail avec un mot correcte ça fonctionne.

    Merci pour votre aide !

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Attention à la faute de frappe : il manque un $ devant le 1er resTab ici : if (is_array(resTab) && in_array($tab, $resTab)) {.
    Activer la totalité des erreurs et des notices pendant les phases de développement est une bonne idée et pourrait t'aider à repérer ce genre d'erreurs
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 161
    Par défaut
    Bonjour @Celira,

    Merci pour la remarque.
    Oui en effet c'est une erreur de frappe. Mais ce n'est pas ça mon problème.
    Le message d'erreur que j'ai est celui là et rien d'autres :

    Array
    (
    [0] => 00000
    [1] =>
    [2] =>
    )
    1

    Cdlt,

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Ah, donc ce qui plante, c'est ta requête (vu que c'est le seul endroit où je vois un print_r dans ton bout de code)
    Ton abscence d'informations vient du fait que tu n'appelles pas la bonne fonction errorInfo :
    Si vous créez un objet PDOStatement avec la fonction PDO::prepare() ou la fonction PDO::query() et que vous invoquez une erreur sur le gestionnaire de requête, PDO::errorInfo() ne retournera pas l'erreur depuis le gestionnaire de requête. Vous devez appeler la fonction PDOStatement::errorInfo() pour retourner les informations sur l'erreur pour une opération exécutée sur un gestionnaire de requête particulier.
    Essaye donc avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $req->execute($q) or die(print_r($req->errorInfo()));
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 161
    Par défaut
    @Celira,

    J'ai toujours la même erreur.

    Cdlt,

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 161
    Par défaut
    Re,

    Tout ce que j'ai comme erreur c'est ça après plusieurs debug :

    Array
    (
    [0] => HY000
    [1] => 206
    [2] => General SQL Server error: Check messages from the SQL Server [206] (severity 16) [(null)]

    [3] => -1
    [4] => 16
    )

    Cdlt,

  7. #7
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Ah on avance : tu as bien un plantage dans l'exécution de ta requête.
    Je pense que le problème vient des paramètres passés à la requête : il manque le ":" devant le nom du paramètre $q = array(':lastId'=>$lastId);. Évidemment, il faut aussi qu'il y ait quelque chose de correct dans $lastId
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 161
    Par défaut
    L'erreur vient du fait que j'ai remplacé ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $req->execute($q) or die(print_r($req->errorInfo()));
    Par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $req->execute($q) or die(print_r($db->errorInfo()));
    .

    Si je remets $db je n'ai plus le message d'erreur précédent mais j'ai celui là :
    Array
    (
    [0] => 00000
    [1] =>
    [2] =>
    )
    1

    Donc on revient à la phase initiale.

    Cdlt,

  9. #9
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Effectivement, mais ne pas afficher le message d'erreur, ce n'est pas franchement la même chose que corriger l'erreur

    Au départ, avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $q = array('lastId'=>$lastId);
    $sql = 'SELECT * FROM reponse WHERE reponse_id = :lastId';
    $req = $db->prepare($sql);
    $req->execute($q) or die(print_r($db->errorInfo()));
    tu avais deux problèmes : ça ne marchait pas et on n'avait pas le message d'erreur.

    Maintenant, avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $q = array('lastId'=>$lastId);
    $sql = 'SELECT * FROM reponse WHERE reponse_id = :lastId';
    $req = $db->prepare($sql);
    $req->execute($q) or die(print_r($req->errorInfo()));
    ça ne marche toujours pas, mais on a un message d'erreur qui dit (en gros) que ta requête ne peut s'exécuter.

    Donc, ensuite, on tente de corriger cette erreur. Pour cela, je te propose d'essayer ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $q = array(':lastId'=>$lastId);
    $sql = 'SELECT * FROM reponse WHERE reponse_id = :lastId';
    $req = $db->prepare($sql);
    $req->execute($q) or die(print_r($req->errorInfo()));
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 161
    Par défaut
    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $q = array(':lastId'=>$lastId);
    c'est toujours le statu quo.

    Pour contextualiser à nouveau ce que je souhaite faire, j'ai un formulaire avec un champ texarea dans lequel un client peut saisir une réponse à une question posée précédemment. J'ai créé une fonction (motInterdit => code ci-dessus) qui contient elle-même un tableau avec une liste de mots ou expressions bannies. Quand une réponse est saisie je vérifie dans mon array qu'elle ne contient pas un des mots ou expressions. Si le test est positif j'envoie dans ce cas un mail à l'admin pour lui signaler et sinon j'envoie un autre mail à celui qui a posé sa question que elle a reçu de réponse. Dans tous les cas de figure j'enregistre la réponse dans la BD et les mots non désirés sont remplacés par des astérisque (***) pour l'affichage.

    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    // fonction mots interdits:
    function motInterdit ($mot) {
            $mots = array(
                  'mot 1',
                  'mot 2',
                  'mot 3'
            );
            $mot_remplacement = '******';
            $data = str_ireplace($mots, $mot_remplacement, $mot);
            return $data;
    }
     
    // Mon insert
    /* ..............  */
     
    // select
    $q = array(':lastId'=>$lastId);
    $sql = 'SELECT * FROM reponse WHERE reponse_id = :lastId';
    $req = $db->prepare($sql);
    $req->execute($q) or die(print_r($req->errorInfo()));
    $rows = $req->fetchAll();
     
    foreach ($rows as $row):
        $tab = nl2br(htmlspecialchars($row['reponse_message']));
        $resTab = motInterdit($tab);
     
        if (is_array($resTab) && in_array($tab, $resTab)) {
             // envoie de mail
             mail($to, $subject, $message, $headers);
        } else {
            // envoie de mail
            mail($to, $subject, $message, $headers);
        }
    endforeach;
    Dans le cas de saisie d'un mot normal = non interdit (condition else), l'envoie de mail marche bien et je récupère mes infos avec les mêmes requêtes précédentes. Donc c'est au niveau de cette condition qu'il y a un problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (is_array($resTab) && in_array($tab, $resTab)) {}
    .

    Mon envoi de mail ne marche pas à ce niveau et que j'ai un message d'erreur. Hors dans le cas de else je n'ai pas de message d'erreur pourtant j'utilise la même requête, ce que je ne comprends pas.

    Cdlt,

  11. #11
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Si la requête ne marche pas, vu que tu interceptes l'erreur avec un die, ni ta vérification de mots, ni ton envoi de mail ne vont être exécutés.
    Si la même requête exactement fonctionne ailleurs dans le code, c'est qu'il y a un problème autre la requête. Par exemple, la valorisation de $lastId.

    Peut-on voir un chouia plus de code ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  12. #12
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 161
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    // requête d'insertion
    $message = $_REQUEST['message'];
    $client_id = $_SESSION['client_id'];
     
    $q = array(':message'=>$message, ':id'=>$client_id);
    $sql = 'INSERT INTO reponse (reponse_message, reponse_date, client_id) VALUES (:message, GETDATE(), :id)';
    $req = $db->prepare($sql);
    $req->execute($q) or die(print_r($req->errorInfo()));
     
    $lastId = (int) $db->lastInsertId();
     
    // select
    $q = array(':lastId'=>$lastId);
    $sql = 'SELECT * FROM reponse WHERE reponse_id = :lastId';
    $req = $db->prepare($sql);
    $req->execute($q) or die(print_r($req->errorInfo()));
    $rows = $req->fetchAll();
    Et un m'affiche int(6) dans le cas de la condition else mais avec if rien ne s'affiche.

    Cdlt,

  13. #13
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Ok, donc la requête de récupération plante probablement parce que $lastId n'est pas renseigné. Où sont les if et else dont tu parles ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  14. #14
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 161
    Par défaut
    Ce sont ceux à l'intérieur du foreach :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    foreach ($rows as $row):
        $tab = nl2br(htmlspecialchars($row['reponse_message']));
        $resTab = motInterdit($tab);
     
        if (is_array($resTab) && in_array($tab, $resTab)) {
             // envoie de mail
             mail($to, $subject, $message, $headers);
        } else {
            // envoie de mail
            mail($to, $subject, $message, $headers);
        }
    endforeach;
    Le script n’envoie pas de mail et n'insert pas la réponse dans la BD dans la condition if.

  15. #15
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 161
    Par défaut
    Je pense avoir compris le problème mais je ne suis pas sûr et si c'est le cas je ne sais pas comment procéder pour le corriger.
    En effet, dans ma condition je teste ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    in_array($tab, $resTab)
    .

    Je teste si $tab (qui est le mot résultant de ma requête sql) est présent dans mon tableau $resTab qui est lui même résultant de la fonction qui va remplacer le mot interdit par des étoiles. Après avoir remplacer le mot interdit par des étoiles, peut-il (le mot résultant de ma requête sql) être présent (encore ?) dans le tableau de ma fonction ?

    Cdlt,

  16. #16
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 161
    Par défaut
    Mon problème c'est que je disais dans le dernier post. Ma variable $tab que je vérifie dans mon tableau est déjà remplacé par des étoiles. Après avoir remplacer le mot interdit par des étoiles, le mot résultant de ma requête sql ne peut pas être présent dans le tableau de ma fonction. D’où l'erreur incompréhensible. Pour corriger le problème j'ai donc créé un nouveau tableau pour ma condition sans modifier ma fonction motInterdit() qui gère l'affichage (remplacement des étoiles).

    Ça marche très bien maintenant.

    Merci bcp @Celira pour ton aide !

    A bientôt !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. afficher données array php
    Par Patpillon dans le forum Langage
    Réponses: 2
    Dernier message: 30/07/2009, 09h21
  2. [Tableaux] Tableau (array) PHP/ foreach
    Par KOUTO dans le forum Langage
    Réponses: 2
    Dernier message: 01/06/2009, 00h54
  3. [MySQL] Boucle Array Php
    Par toulousain3117 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/05/2009, 00h13
  4. Augmenter un array php via js
    Par bastien dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 17/09/2008, 11h26
  5. [Tableaux] Recherche évoluée dans un array PHP
    Par fanfouer dans le forum Langage
    Réponses: 2
    Dernier message: 01/03/2008, 13h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo