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 :

Formulaire erreur Array to string conversion [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2008
    Messages : 27
    Points : 12
    Points
    12
    Par défaut Formulaire erreur Array to string conversion
    Bonjour,

    j'ai fais un formulaire qui fonctionne, mais m'affiche le message d'erreur suivant
    Notice: Array to string conversion in C:\Program Files\EasyPHP 2.0b1\www\pti2\formulaire\traitementduformulaire.php on line 69
    Après de nombreuse heures de recherche infructueuse pour régler se problème je me permet de vous le soumettre.

    Voici donc mon code ( récupéré à partir d'exemple sur internet )

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    <?php
    // Parametres mysql à remplacer par les vôtres
    define('DB_SERVER', 'localhost'); // serveur mysql
    define('DB_SERVER_USERNAME', 'root'); // nom d'utilisateur
    define('DB_SERVER_PASSWORD', ''); // mot de passe
    define('DB_DATABASE', 'pti2_tourisme'); // nom de la base
     
    // Connexion au serveur mysql
    $connect = mysql_connect(DB_SERVER, DB_SERVER_USERNAME,
    DB_SERVER_PASSWORD)
    or die('Impossible de se connecter : ' . mysql_error());
    // sélection de la base de données
    mysql_select_db(DB_DATABASE, $connect);
     
    $msg_erreur = "<a Erreur. Les champs suivants doivent être obligatoirement remplis  href=site.php?page=includes/ajout/ajouter>retour</a>:<br/><br/>";
    $msg_ok =  " <a href=site.php?page=body>retour</a>)";
     
    $message = $msg_erreur;
     
    // vérification des champs
    if (empty($_POST['civilite']))
      $message .= "Votre civilité<br/>";
     
    if (empty($_POST['nom']))
      $message .= "Votre nom<br/>";
     
    if (empty($_POST['adresse']))
      $message .= "Votre adresse<br/>";
     
    if (empty($_POST['codepostal']))
      $message .= "Votre code postal<br/>";
     
    if (empty($_POST['ville']))
      $message .= "Votre ville<br/>";
     
     
     
      if (empty($_POST['prenom']))
      $message .= "Votre Prénom<br/>";
     
      if (empty($_POST['nbpersonne']))
      $message .= "nombre de participant<br/>";
     
      if (empty($_POST['telephone']))
      $message .= "Votre numéro de téléphone<br/>";
     
       if (empty($_POST['email']))
      $message .= "Votre email<br/>";
     
     
       if (empty($_POST['date1']))
      $message .= "date séjour manquante<br/>";
     
     
       if (empty($_POST['date2']))
      $message .= "date séjour manquante<br/>";
     
     
     
    // si un champ est vide, on affiche le message d'erreur
    if (strlen($message) > strlen($msg_erreur)) {
     
      echo $message;
     
    // sinon c'est ok
    } else {
     
      foreach($_POST as $index => $valeur) {
        $$index = mysql_real_escape_string(trim($valeur));
      }
     
      $interets = $_POST['interets'];
      $sqlinterets = '';
      for ($i=0; $i<count($interets); $i++)
      {
        $sqlinterets .= $interets[$i];
        $sqlinterets .= ', ';
      }
     
      $sql = "INSERT INTO formulaire VALUES (
      '',
      '".$civilite."',
      '".$nom."',
      '".$adresse."',
      '".$codepostal."',
      '".$ville."',
      '".$pays."',
      '".$sqlinterets."',
      '".$comments."',
      '".$prenom."',
      '".$telephone."',
      '".$nbpersonne."',
      '".$email."',
      '".$date1."',
       '".$date2."',
      
     
     
      
      now())";
      $res = mysql_query($sql);
     
      if ($res) {
        echo $msg_ok;
      } else {
        echo mysql_error();
      }
     
    }
    ?>
    Merci d'avance pour votre aide.

  2. #2
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Points : 470
    Points
    470
    Par défaut
    $$index = mysql_real_escape_string(trim($valeur));

    Enleve un des 2 $ !

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2008
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Hélas non je l'avais déjà remarqué,
    si j'enlève l'un des $
    cela me donne un
    Undefined variable
    pour toutes mes variables.

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Si $_POST['interets'] est un tableau, cet élément se retrouve bien traité par ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      foreach($_POST as $index => $valeur) {
        $$index = mysql_real_escape_string(trim($valeur));
      }
    Or $valeur, pour cet élément précis du moins, sera un tableau alors qu'il est ensuite utilisé comme une chaîne (trim) sans aucun contrôle (is_string & co).

    PS : ce serait bien d'indiquer directement quelle est la ligne en cause

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2008
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Merci pour ta réponse, j'ai pas tout compris mais voici donc la ligne 69
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $$index = mysql_real_escape_string(trim($valeur));
    Voici le code de" interets" dans mon formulaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     <p id="interets"><label> Type du sejour : </label><br>
        <input type="checkbox" name="interets[]" value="classique" /> Classique
        <input type="checkbox" name="interets[]" value="aventure" />Aventure<br />
        <input type="checkbox" name="interets[]" value="luxe" />Luxe
      </p>
    Le formulaire marche très bien, j'ai bien les données dans ma base , mais il m'affiche toujours cette erreur.

  6. #6
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Points : 470
    Points
    470
    Par défaut
    Arf, je viens de voir que c'est un Notice, et non pas une erreur...
    En général, un notice, c'est sans gravité. Tu peux les désactiver dans le php.ini. Ca indique juste que t'es pas parfaitement rigoureux.

    Julp, j'en profite pour poser la question, comment peux-ton envoyer un tableau via $_POST ?

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Citation Envoyé par akamaru
    Merci pour ta réponse, j'ai pas tout compris mais voici donc la ligne 69
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $$index = mysql_real_escape_string(trim($valeur));
    Voici le code de" interets" dans mon formulaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     <p id="interets"><label> Type du sejour : </label><br>
        <input type="checkbox" name="interets[]" value="classique" /> Classique
        <input type="checkbox" name="interets[]" value="aventure" />Aventure<br />
        <input type="checkbox" name="interets[]" value="luxe" />Luxe
      </p>
    Le formulaire marche très bien, j'ai bien les données dans ma base , mais il m'affiche toujours cette erreur.
    J'ai bien compris votre but consistant à vous simplifier la tâche en simulant la fonctionnalité register_globals et même au-delà, en protégeant, dans le même temps les données POST des injections SQL. Mais le problème ici c'est que le type de la données n'est pas du tout pris en compte car suppose que tout sera de type chaîne. Or, on voit bien, que cela peut être faux (d'où l'avertissement) : on peut parfaitement récupérer des tableaux (voir même des tableaux de tableaux). Il vous faut donc prévoir tous les cas de figure.

    Si je développe un brin mon idée :
    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
    foreach($_POST as $index => $valeur) {
        if (is_string($valeur)) {
            $$index = mysql_real_escape_string(trim($valeur));
        } elseif (is_array($valeur)) {
            // Pour des chaînes
            foreach ($valeur as &$v) {
                if (!is_string($v)) {
                    die('cas non prévu'); // Tableau de plus d'une dimension
                }
                $v = mysql_real_escape_string($v);
            }
            $$index = "'" . implode("', '", $valeur) . "'";
            // Variante pour des nombres entiers
            // $$index = implode(',', array_map('intval', $valeur));
        }/* else {
            die('cas non prévu');
        }*/
    }
    (non testé)

    Soit on traite toutes les données, quelles qu'elles soient, en même temps et de façon appropriée et non le refaire après. Ou alors, une autre possibilité, serait d'exclure certaines clés pour les gérer soi-même.

    Citation Envoyé par comode
    Arf, je viens de voir que c'est un Notice, et non pas une erreur...
    En général, un notice, c'est sans gravité. Tu peux les désactiver dans le php.ini. Ca indique juste que t'es pas parfaitement rigoureux.
    Si on veut, mais il y a quand même une erreur de logique surtout s'il ne comprend pas son erreur. Il est quand même susceptible de la reproduire s'il utilise la même technique ailleurs et d'obtenir au moins un résultat erroné. Ici, ok, ce n'est pas encore très grave, car $_POST['interets'] est retraité juste après.

    Citation Envoyé par comode
    Julp, j'en profite pour poser la question, comment peux-ton envoyer un tableau via $_POST ?
    Par des checkbox : vous en avez l'exemple le post juste au-dessus. Mais dès que le nom du champ (valeur de l'attribut name de la balise HTML) se termine par des crochets ([]), alors vous récupèrerez le résultat sous la forme d'un tableau en PHP (checkbox, fichiers, select à choix multiples, etc).

  8. #8
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2008
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup,

    cela fonctionne maintenant

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

Discussions similaires

  1. [PDO] Array to string conversion et calcule d'après un code promotion
    Par Valadone dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 27/06/2015, 18h30
  2. Array to string conversion
    Par deathart dans le forum CodeIgniter
    Réponses: 17
    Dernier message: 04/09/2012, 13h08
  3. [MySQL] PB : "Notice: Array to string conversion"
    Par moma586 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 13/07/2012, 09h11
  4. Réponses: 2
    Dernier message: 28/12/2007, 12h09
  5. Réponses: 2
    Dernier message: 21/06/2004, 15h55

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