8791 sujets

Développement web côté serveur, CMS

Bonjour à tous !
J'ai un petit formulaire qui est censé m'envoyer les données dans une bdd et le comportement est étrange : parfois les données sont bien envoyées en bdd, parfois non !
Quelqu'un saurait-il m'aguiller sur ce qui peut se passer ?

Ci-dessous le code du formulaire :


<?php
session_start();
$prenom = $_POST['prenom'];
$nom = $_POST['nom'];
$nombre = $_POST['nombre'];
$email = $_POST['email'];
$message = $_POST['message'];
$presence = $_POST['presence'];
?>

<!DOCTYPE html>
<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <title>555</title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width">
        <link rel="stylesheet" href="css/styles.css">
        <link rel="stylesheet" href="css/responsive-styles.css">

   </head>
    <body>
<form method="post" action="confirm.php" name='formul'>
<p class='label'>Prénom</p>
<input name="prenom" type="text" class="champ-texte"/>
<p class='label'>Nom</p>
<input name="nom" type="text" class="champ-texte"/>
<p class='label'>Nombre de personnes</p>
<select name="nombre" class="champ-select"/>
	<option value="1">1 personne</option>
	<option value="2">2 personnes</option>
	<option value="3">3 personnes</option>
	<option value="4">4 personnes</option>
</select>
<p class='label'>Adresse e-mail</p>
<input name="email" type="text" class="champ-mail"/>
<textarea rows="3" name="message"></textarea>
<input type="radio" id='oui' name="presence" value="oui" /><label for='oui'>  Assistera</label>
<input type="radio" id='non' name="presence" value="non" /><label for='non'>  N'assistera pas</label>
<input type="submit" value="Envoyer" name="submit_ll" class="confirm">
</form>
</body>
</html>



Et le php de la page de confirmation :


<?php
session_start();
$host ='localhost';
$login='root';
$pass='root';
$bdd='mabdd';


$lien = @mysql_connect($host, $login, $pass);
if (!$lien) exit('Erreur connexion bdd');
$selection = @mysql_select_db($bdd);
if (!$selection) exit ('Erreur connexion bdd.');

$confirm = $_POST['submit_ll'];
$prenom = $_POST['prenom'];
$nom = $_POST['nom'];
$nombre = $_POST['nombre'];
$email = $_POST['email'];
$message = $_POST['message'];
$presence = $_POST['presence'];


if (isset($confirm)) {
$export_sql = "INSERT INTO invite (prenom,nom,nombre,email,message,presence) VALUES('$prenom','$nom','$nombre','$email','$message','$presence')";
$final = mysql_query($export_sql);	
if(mysql_affected_rows() == 1) {

// RECUP ID ENREGISTREMENT DERNIERE LIGNE
	$id = mysql_insert_id();

	$import_sql = @mysql_query("SELECT * FROM invite WHERE id = '$id'");
	$recup_sql = mysql_fetch_assoc ($import_sql);
	$prenom_sql = $recup_sql['prenom'];
	$nom_sql = $recup_sql['nom'];
	$nombre_sql = $recup_sql['nombre'];
	$email_sql = $recup_sql['email'];
	$message_sql = $recup_sql['message'];
	$presence_sql = $recup_sql['presence'];


//ENVOI MAIL

require_once('class.phpmailer.php');
$mail = new PHPMailer();
$sujet = "Sujet";
$body = "
$prenom_sql $nom_sql
Adresse e-mail : $email_sql
Assistera : $presence_sql
Nombre de personnes présentes : $nombre_sql
Message personnel :
$message_sql
";
$body = utf8_decode($body);
$sujet = utf8_decode($sujet);
$mail->From = "555";
$mail->FromName = "555";
$mail->Subject = $sujet;
$mail->Body = $body;
$mail->AddAddress("mail@mail.com");
$mail->AddCC("mail@mail.com");
$mail->send();
	}
}
?>

<!DOCTYPE html>
<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <title>555</title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width">
        <link rel="stylesheet" href="css/styles.css">
        <link rel="stylesheet" href="css/responsive-styles.css">

    </head>
    <body>
<div class='confirmation'><p>Merci pour votre message</p></div>
    </body>
</html>



Merci d'avance pour votre aide !
Si tu n'as pas accès à tes logs d'erreurs MySQL tu peux faire un truc comme ça :


$final = mysql_query($export_sql);
if (!$final) {
  $log = 'Requête invalide : ' . mysql_error() . ' - ' . $export_sql . "\n\n";
  file_put_contents('db_error.log', $log, FILE_APPEND);
  exit('Erreur !');
}

Modifié par jb_gfx (10 Jun 2013 - 13:23)
Oui bien sûr, mais ce que je ne m'explique pas c'est pourquoi le formulaire réagit de cette manière : je teste en prod de plusieurs navigateurs et postes, ça marche toujours mais plusieurs personnes essayent de leur côté et ça ne fonctionne pas systématiquement !?

Je comprendrais si le fonctionnement était binaire : soit ça fonctionne soit ça ne fonctionne pas.

Une idée de piste peut-être ?
Eric3005 a écrit :
Une idée de piste peut-être ?


Oui : tu fais comme je t'ai dis et tu regardes le code d'erreur et la requête qui cause l'erreur.
+1 pour les logs

a écrit :
Oui bien sûr, mais ce que je ne m'explique pas c'est pourquoi le formulaire réagit de cette manière : je teste en prod de plusieurs navigateurs et postes, ça marche toujours mais plusieurs personnes essayent de leur côté et ça ne fonctionne pas systématiquement !?


Tu as essayé avec des accents ? Il faut que tu protège ta commande SQL de la présence de caractères spéciaux...
benj a écrit :
+1 pour les logs

Tu as essayé avec des accents ? Il faut que tu protège ta commande SQL de la présence de caractères spéciaux...


C'est les apostrophes qui font planter la requête mais c'est mieux de comprendre pourquoi l'erreur se produit. Smiley cligne
Modifié par jb_gfx (10 Jun 2013 - 17:38)
Non, en fait quand un utilisateur entre une apostrophe dans un des champs (apostrophe = simple quote) ta requête plante parce que tu ne protège pas tes données avant de les insérer dans ta base de données.

Tu peux soit échaper tes variables avant de les insérer dans ta base, soit utiliser des requêtes préparées.

Dans ton cas, vu que tu utilises l'extension mysql qui est obsolète, tu ne pourra pas faire de requêtes préparées et tu est obligé de te rabattre sur la première solution en utilisant la fonction mysql_real_escape_string().

http://fr2.php.net/manual/fr/function.mysql-real-escape-string.php
jb_gfx a écrit :
C'est les apostrophes qui font planter la requête mais c'est mieux de comprendre pourquoi l'erreur se produit. Smiley cligne
accent Smiley biggol En effet je voulais dire apostrophes. Merci de m'avoir repris.
Modérateur
jb_gfx a écrit :
(apostrophe = simple quote)

Attention, chaque fois que quelqu’un dit quelque chose de cet acabit, un typographe meurt.

' = signe vertical avec usage variés. Appelé parfois trait, guillemet droit, guillemet simple, abusivement apostrophe informatique/datylographique, ou toutes autre variétés de mots. Mais 4a n'a rien, de près ni de loin d’une apostrophe!
kustolovic a écrit :

Attention, chaque fois que quelqu’un dit quelque chose de cet acabit, un typographe meurt.


C'est bien pour ça que j'ai précisé "apostrophe = simple quote", sous entendu que j'utilise un raccourci/abus de langage.

PS : j'ai un BAC Pro de photo-compositeur et j'ai bossé de longues années dans l'industrie du print. Smiley cligne
Modérateur
jb_gfx a écrit :
PS : j'ai un BAC Pro de photo-compositeur et j'ai bossé de longues années dans l'industrie du print. Smiley cligne

apostrophe = single quote. ça va t'es pas mort? Smiley lol
Et si les typographes, ils meurent pour ça...

si ' n'est pas une apostrophe
Ils ont quoi à nous proposer comme apostrophe ? Smiley rolleyes