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 :

Requête préparé et Insert Php mysql [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3
    Par défaut Requête préparé et Insert Php mysql
    Bonjour à tous,
    Voilà je suis un novice en php mysql et depuis 3 jours, je bloque sur une requête d'insertion.
    Sur ma page j'ai un formulaire qui me permet d'ajouter un participant.
    Quand je clique sur le bouton ajouter, la page se recharger, mais n'ajoute pas d'enregistrement dans ma BD.

    Pourriez-vous jetez un coup d'oeil à mes quelques lignes de code et me d'aider à trouver l'erreur ?
    D'avance merci.

    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
    <?php
        try
        {
             //On se connecte à MySQL
        		$bdd = new PDO('mysql:host='.$VALEUR_hote.';port='.$VALEUR_port.';dbname='.$VALEUR_nom_bd, $VALEUR_user, $VALEUR_mot_de_passe);    
        		$bdd->query("SET NAMES 'utf8'");
        }
        catch(Exception $e)
        {
            // En cas d'erreur, on affiche un message et on arrête tout
                die('Erreur : '.$e->getMessage());
        }
        ?>
     
    <div class="container">
    	<!--<div class="grid-3">
    	</div>-->
     
    	<div class="grid-12">
    	<form action="" method="post">
     
    	<table id="Table_add_part">
    		<tr>
    			<td colspan="2"><h2>Coordonnées</h2></td>
     
    		</tr>
    		<tr>
    			<td class="first_column">Nom complet</td>
    			<td><input type="text" name="nom" id="nom" value="" /><input type="text" name="prenom" id="prenom" value="" />
    				<br><label class="sub_lab" for="nom_lab" >Nom de famille</label><label class="sub_lab"for="prenom_lab">Prénom</label>
    			</td>
    		<tr>
    		<tr>
    			<td class="first_column">Adresse</td>
    			<td><input class="adresse" type="text" name="adresse" id="adresse" value=""/>
    				<br><label class="sub_lab" for="adresse_lab" >Adresse</label>
    			</td>
    		<tr>
    		<tr>
    			<td class="first_column"></td>
    			<td><input type="text" name="ville" id="ville" value="" /><input type="text" name="cp" id="cp" value="" />
    				<br><label class="sub_lab" for="ville_lab" >Ville</label><label class="sub_lab"for="cp_lab">Code postal</label>
    			</td>
    		<tr>
    		<tr>
    			<td class="first_column">Contact</td>
    			<td><input type="text" name="tel" id="tel" value="" /><input type="text" name="port" id="port" value="" />
    				<br><label class="sub_lab" for="tel_lab" >Téléphone</label><label class="sub_lab"for="port_lab">Portable</label>
    			</td>
    		<tr>
    		<tr>
    			<td class="first_column"></td>
    			<td><input class="adresse" type="text" name="mail" id="mail" value="" />
    				<br><label class="sub_lab" for="mail_lab" >E-mail</label>
    			</td>
    		<tr>
    		<tr>
    			<td colspan="2"><h2>Détails</h2></td>
    		</tr>
    		<tr>
    			<td class="first_column">Complément d'infos</td>
    			<td><textarea name="commentaire" id="commentaire"></textarea>
    			<br><label class="sub_lab"for="commentaire_lab">Commentaire</label>
    			</td>
    		<tr>
    		<tr>
    			<td class="first_column">Inscription</td>
    			<td>
    				<select name="statut" id="statut">
    					<option value="En attente">En attente</option>
    					<option value="En formation">En formation</option>
    					<option value="Former">Former</option>
    					<option value="Annuler">Annuler</option>
    				</select><input type="text" name="date" id="date" value="" onclick="var date_inscription = new calendar(this);" />
    				<br><label class="sub_lab" for="statut_lab" >Statut</label><label class="date_lab"for="port_lab">Date d'inscription</label>
    			</td>
    		<tr>
    		<tr>
    			<td class="first_column"></td>
    			<td colspan="2"><input type="submit" value="Ajouter" /></td>
    			<td></td>
    		</tr>
    	</table>
      </form>
     
     
        <?php
     
         //Si tout va bien, on peut continuer     
         //Insertion du message à l'aide d'une requête préparée
        $req = $bdd->prepare('INSERT INTO participant (nom, prenom, commune, cp, adresse, tel, port, mail, statut) VALUES(:nom, :prenom, :commune, :cp, :adresse, :tel, :port, :mail, :statut)');
        $req->execute(array(
        'nom' => $_POST['nom'],
        'prenom' => $_POST['prenom'],
        'commune' => $_POST['commune'],
        'cp' => $_POST['cp'],
        'adresse' => $_POST['adresse'],
        'tel' => $_POST['tel'],
        'port' => $_POST['port'],
        'mail' => $_POST['mail'],
        'statut' => $_POST['statut'],
        ));
     
     ?> 
        </div>
    </div>

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Il faut mettre les ":" dans les nom dans le tableau execute.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Il faut mettre les ":" dans les nom dans le tableau execute.
    Non, ce n'est plus nécéssaire.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    Non, ce n'est plus nécéssaire.
    Dans la mesure ou cela est nécessaire dans certaines versions et que la documentation indique de le faire, il vaut mieux le faire.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Dans la mesure ou cela est nécessaire dans certaines versions et que la documentation indique de le faire, il vaut mieux le faire.
    De mémoire, c'est patché depuis la 5.1, il faut que je retrouve le PT correspondant...

  6. #6
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Par contre excuse mon ignorance, mais je ne comprend pas vraiment
    C'est simple: à partir du moment ou tu affiche quoi que ce soit, tu perds la possibilité d'envoyer des headers et donc d'influer sur le comportement de la requête HTTP car à partir de ce moment, Apache à déjà envoyé (implicitement) les headers (en tête) par défaut.

    Par exemple, si la connexion à la base échoue pour une raison X ou Y, il est de bon ton d'envoyer un header 500 pour signaler une erreur interne ou au moins afficher une page pour indiquer à l'utilisateur que l'appli est plantée.

    L'autre inconvénient évident à sortir brutalement (avec die ou exit) au milieu de la construction d'un flux XML est que le document produit n'est donc plus complet. La plupart des navigateurs modernes sont néanmoins capables de "reconstruire" l'arbre XML/HTML endommagé mais du coup ils passent en mode quirks, ce qui à pour effet de modifier les règles de rendu CSS ainsi que d'affecter le comportement de JavaScript (en gros le navigateur passe dans un mode "document cassé, je fais ce que je peux...").

    C'est pire lors qu'il s'agit d'une application destinée au m2m comme un serveur SOAP, si le document produit n'est pas entier, la requête SOAP entière devient invalide.

    Voici comment j'ai l'habitude de faire:
    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
    <?php
     
    ini_set('error_log', 'err.log');
     
    try {
        $pdo = new PDO(...);
    }
    catch (PDOException $e) {
        error_log($e->getMessage());
        header("{$_SERVER['REQUEST_METHOD']} 500 Internal Server Error");
        header("Refresh: 10; url=index.php"); // rediriger sur la page d'acceuil au bout de 10 secondes
        exit;
    }
     
    if (!$stmt = $pdo->query($q = ...)) {
        $stmt = array();
        error_log("error with query $q");
    }
     
    ?>
    <!DOCTYPE HTML>
    <html lang="en-US">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <?php if ($stmt): ?>
        <?php foreach ($stmt as $row): ?>
        ...
        <?php endforeach ?>
        <?php else: ?>
        Rien à afficher!
        <?php endif ?>
    </body>
    </html>

  7. #7
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Je vais résumer le comportement de ton script:
    1. ouvrir une connexion à la bdd
    2. afficher un formulaire de saisie
    3. enregistrer des informations issues de $_POST en base


    Problème: tu affiche le formulaire et tu enregistre les infos en base en même temps (i.e. lors de la même requête). Ne vaudrait-il pas mieux détecter la soumission du formulaire pour enregistrer ?

    Cas 1: le formulaire n'est pas soumis > afficher le formulaire
    Cas 2: le formulaire est soumis > nettoyer les données > enregistrer > afficher une confirmation [ optionnel > rediriger ]

    Pour détecter que le formulaire à été soumis, le mieux est de donner un nom au boutton submit puis de le détecter avec un simple isset:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
     
    if (isset($_POST['submit'])) {
     // enregistrer ...
    }
    else {
     // afficher le formulaire ...
    }
    N'oublie pas que c'est pas parce que les requêtes préparées te protègent des injections SQL qu'elles te protègent également des XSS donc utilise bien les filtres sur les données à insérer.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3
    Par défaut
    Merci pour votre aide

    J'ai trouvé mon erreur.
    Dans la requête j'avais mis le champ ville, alors que champ s'appel commune.
    J'en ai profité pour modifier un peu.

    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
    <div class="container">
    	<div class="grid-3">
    	</div>
     
    	<div class="grid-12">
    	<form action="" method="post">
     
    	<table id="Table_add_part">
    		<tr>
    			<td colspan="2"><h2>Coordonnées</h2></td>
     
    		</tr>
    		<tr>
    			<td class="first_column">Nom complet</td>
    			<td><input type="text" name="nom" id="nom" value="" /><input type="text" name="prenom" id="prenom" value="" />
    				<br><label class="sub_lab" for="nom_lab" >Nom de famille</label><label class="sub_lab"for="prenom_lab">Prénom</label>
    			</td>
    		<tr>
    		<tr>
    			<td class="first_column">Adresse</td>
    			<td><input class="adresse" type="text" name="adresse" id="adresse" value=""/>
    				<br><label class="sub_lab" for="adresse_lab" >Adresse</label>
    			</td>
    		<tr>
    		<tr>
    			<td class="first_column"></td>
    			<td><input type="text" name="commune" id="commune" value="" /><input type="text" name="cp" id="cp" value="" />
    				<br><label class="sub_lab" for="commune_lab" >Commune</label><label class="sub_lab"for="cp_lab">Code postal</label>
    			</td>
    		<tr>
    		<tr>
    			<td class="first_column">Contact</td>
    			<td><input type="text" name="tel" id="tel" value="" /><input type="text" name="port" id="port" value="" />
    				<br><label class="sub_lab" for="tel_lab" >Téléphone</label><label class="sub_lab"for="port_lab">Portable</label>
    			</td>
    		<tr>
    		<tr>
    			<td class="first_column"></td>
    			<td><input class="adresse" type="text" name="mail" id="mail" value="" />
    				<br><label class="sub_lab" for="mail_lab" >E-mail</label>
    			</td>
    		<tr>
    		<tr>
    			<td colspan="2"><h2>Détails</h2></td>
    		</tr>
    		<tr>
    			<td class="first_column">Complément d'infos</td>
    			<td><textarea name="commentaire" id="commentaire"></textarea>
    			<br><label class="sub_lab"for="commentaire_lab">Commentaire</label>
    			</td>
    		<tr>
    		<tr>
    			<td class="first_column">Inscription</td>
    			<td>
    				<select name="statut" id="statut">
    					<option value="En attente">En attente</option>
    					<option value="En formation">En formation</option>
    					<option value="Former">Former</option>
    					<option value="Annuler">Annuler</option>
    				</select><input type="text" name="date" id="date" value="" onclick="var date_inscription = new calendar(this);" />
    				<br><label class="sub_lab" for="statut_lab" >Statut</label><label class="date_lab"for="port_lab">Date d'inscription</label>
    			</td>
    		<tr>
    		<tr>
    			<td class="first_column"></td>
    			<td colspan="2"><input type="submit" value="Ajouter" /></td>
    			<td></td>
    		</tr>
    	</table>
    	<?php  
    	try
    	{
    	    // On se connecte à MySQL
    			$bdd = new PDO('mysql:host='.$VALEUR_hote.';port='.$VALEUR_port.';dbname='.$VALEUR_nom_bd, $VALEUR_user, $VALEUR_mot_de_passe);    
    			$bdd->query("SET NAMES 'utf8'");
    	}
    	catch(Exception $e)
    	{
    	    // En cas d'erreur, on affiche un message et on arrête tout
    	        die('Erreur : '.$e->getMessage());
    	}
     
    	// Si tout va bien, on peut continuer
    	// On récupère tout le contenu de la table participant
    	$reponse = $bdd->query('select * from participant');    	 
    	// On affiche chaque entrée une à une
     
    	$req = $bdd->prepare('INSERT INTO participant (nom, prenom, commune, adresse, cp, tel, statut, mail, port) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)');
    	$req->execute(array($_POST['nom'], $_POST['prenom'], $_POST['commune'], $_POST['adresse'], $_POST['cp'], $_POST['tel'], $_POST['statut'], $_POST['mail'], $_POST['port']));?>
    	</div>
     
     
    </div>

  9. #9
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Les comportements modèles au milleu du HTML c'est un très mauvaise idée: si tu sors avec die() (ce que tu fais lors du catch) le flux servi au navigateur est incomplet >> quirks mode = fails !

    Il est généralement admis qu'il faut effectuer toutes les requêtes & traitements avant le moindre affichage de façon à pouvoir contrôler l'exécution de la requête HTTP et d'envoyer les bons headers.

    NB: ne jamais afficher les erreurs MySQL sur la page et ce pour 3 raisons principales:
    1. l'utilisateur s'en cogne
    2. un pirate ne s'en cogne pas du tout
    3. pas de log ? pas de log !

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3
    Par défaut
    Les comportements modèles au milleu du HTML c'est un très mauvaise idée: si tu sors avec die() (ce que tu fais lors du catch) le flux servi au navigateur est incomplet >> quirks mode = fails !

    Il est généralement admis qu'il faut effectuer toutes les requêtes & traitements avant le moindre affichage de façon à pouvoir contrôler l'exécution de la requête HTTP et d'envoyer les bons headers.

    NB: ne jamais afficher les erreurs MySQL sur la page et ce pour 3 raisons principales:
    1. l'utilisateur s'en cogne
    2. un pirate ne s'en cogne pas du tout
    3. pas de log ? pas de log !
    Oui merci, je l'avais mis pour tenter de trouver mon erreur. J'enlève cette ligne tout de suite.

    Les comportements modèles au milleu du HTML c'est un très mauvaise idée: si tu sors avec die() (ce que tu fais lors du catch) le flux servi au navigateur est incomplet >> quirks mode = fails !

    Il est généralement admis qu'il faut effectuer toutes les requêtes & traitements avant le moindre affichage de façon à pouvoir contrôler l'exécution de la requête HTTP et d'envoyer les bons headers.
    Par contre excuse mon ignorance, mais je ne comprend pas vraiment

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

Discussions similaires

  1. [MySQL] requête d'insersion en php mysql
    Par belakhdarbts10 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 02/05/2007, 19h42
  2. [PHP MySQL] Erreur execution requête de type INSERT
    Par Pfeffer dans le forum Requêtes
    Réponses: 6
    Dernier message: 23/01/2006, 17h38
  3. [php-mysql] requête qui ne marche pas....
    Par sanosuke85 dans le forum Requêtes
    Réponses: 1
    Dernier message: 09/01/2006, 17h18
  4. Réponses: 2
    Dernier message: 02/12/2005, 21h21
  5. Réponses: 1
    Dernier message: 02/12/2005, 20h18

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