8791 sujets

Développement web côté serveur, CMS

Bonjour,

J'ai écris un petit peu plus tôt parce que j'avais un problème avec l'ordre que je voulais que mes annonce s'affiche et dew ma répondu, ensuite je me suis rendu compte d'un autre erreur. Je débute en PHP. Mon problème est celui-ci,

Lorsque je télécharge ma page formulaire, le formulaire envoie directement a ma base de donnée un formulaire vide. Comment empècher ceci!

Ma requête est celle-ci


if(isset($_POST['bouton']));{
$requete="INSERT INTO annonce SET Prenom='".$_POST['Prenom'] ."', Nom='".$_POST['Nom'] ."', Telephone='".$_POST['Telephone'] ."', Titre='".$_POST['Titre'] ."', Prix='".$_POST['Prix'] ."', Annee='".$_POST['Annee'] ."', Kilometrage='".$_POST['Kilometrage'] ."', Lieu='".$_POST['Lieu'] ."', Couleurexterieur='".$_POST['Couleurexterieur'] ."', Couleurinterieur='".$_POST['Couleurinterieur'] ."', Courriel='".$_POST['Courriel'] ."', Transmission='".$_POST['Transmission'] ."', Motricite='".$_POST['Motricite'] ."', AirClimatise='".$_POST['AirClimatise'] ."', Description='".$_POST['Description'] ."' ";
$resultat=mysql_query($requete);
$voiture=mysql_fetch_array($resultat);
}


Ou bouton est mon bouton d'envoye à la fin de mon formulaire.

Merci Beaucoup Smiley smile
Modifié par alexandcote (28 Aug 2010 - 04:35)
Salut alexandcote

SET est utilisé avec UPDATE.
Si tu veut une insertion de donnée : exemple.


$req = "INSERT INTO nomTable VALUES ( . . $_POST['valeurs'] ici . . )";


Comment faire : Téléchargement d'exemple en PDF Téléchargable en bas de page à chaque sujet.
Cours PHP : Cours PHP pour débutant Téléchargable aussi je crois.

J'espère que tu as cette adresse : Manuel PHP : fr

Et aussi MySQL : MySQL : fr
En PDF : MySQL : fr 1168 pages - mais c'est en ligne de commande, simple à utiliser.

Tu n'as pas à écrire : $_POST['bouton'] - En validant, le bouton sert d'envoie au fichier PHP de l'attribut action="insertDonnees.php" : Comme ceci

Ton formulaire HTML

<form action="insertDonnees.php" method="POST">
  // . . . Les champs input ici . . . 
</form>


Et c'est le fichier « insertDonnees.php » qui porte les script d'insertions des données à la base
Un script SELECT và te permettre de récupérer les données pour fin d'affichage dans une page web.

Les façons de faire sont multiples et ça viens avec la pratique et la compréhension issus de l'expérience et de l'apprentissage.

Và à biblio de ton quartier pour emprunter des livres en PHP et MySQL. Ça vaut la peine.

++
Modifié par zardoz (25 Aug 2010 - 06:35)
Hello,

juste quelques précisions :

zardoz a écrit :
Si tu veut une insertion de donnée : exemple.
$req = "INSERT INTO nomTable VALUES ( . . $_POST['valeurs'] ici . . )";
Ce sera plutôt :
$req = "INSERT INTO nomTable VALUES (mysql_real_escape_string($_POST['valeurs']) ... )";
pour protéger les données (faire une recherche sur injection SQL).

zardoz a écrit :
Tu n'as pas à écrire : $_POST['bouton']
Le plus simple lorsqu'il n'y a qu'un formulaire dans une page et qu'il ne possède qu'un bouton possible de soumission (et bien sûr que la méthode HTTP est "post") est de faire :
if($_SERVER['REQUEST_METHOD']=='POST') {

zardoz a écrit :
Ton formulaire HTML

<form action="insertDonnees.php" method="POST">
  // . . . Les champs input ici . . . 
</form>
Ce sera plutôt
<form action="insertDonnees.php" method="post">
  // . . . Les champs input ici . . . 
</form>
sans majuscules. Smiley cligne
Modifié par Heyoan (25 Aug 2010 - 10:44)
Salut heyoan et alexandcote

Oui d'accord pour la requête INSERT : je voulais juste abréger. D'ailleurs les liens que j'ai laisser en font mention.

Et puis de toute façon moi j'utilise l'objet PDO (PHP Data Object). Que je trouve plus lisible, plus léger en écriture.

D'accord aussi pour les minuscules.

Pour l'injection j'utilise un script, une fonction pour éviter les « slashs » en affichage.
Personnellement j'ai dû procéder ainsi à cause de la configuration PHP sur servhome.org.
Les magic_quotes sont activés pour une compatibilité avec PHP 3 et 4 je crois.

Celui-ci

<?php
  // Fonction qui supprime l'effet des magic quotes
  function stripslashes_r($affiche)
{
        // Si la variable passé en argument est un array, on appelle la fonction dessus
        if(is_array($affiche)) 
        {
                return array_map('stripslashes_r', $affiche);
        }
        else 
        {
                // Sinon, un simple stripslashes suffit
                return stripslashes($affiche);
        }
}
 
if(get_magic_quotes_gpc()) 
{
   // Si les magic quotes sont activés, on les désactive avec notre fonction
   $_GET = stripslashes_r($_GET);
   $_POST = stripslashes_r($_POST);
   $_COOKIE = stripslashes_r($_COOKIE);
   $_REQUEST = stripslashes_r($_REQUEST);
}
?>


Je « include » le fichier tout simplement : voilà

++
Modifié par zardoz (25 Aug 2010 - 11:38)
zardoz a écrit :
j'ai dû procéder ainsi à cause de la configuration PHP sur servhome.org.
Les magic_quotes sont activés pour une compatibilité avec PHP 3 et 4 je crois.
En général les hébergeurs ne touchent effectivement pas à ce genre de paramétrage pour ne pas casser les vieux sites mais d'habitude ils proposent toujours une solution de rechange comme une modif via .htaccess ou le passage à PHP 5 (voire 6 pour les chanceux). Smiley murf


Edit: pour ce qui est d'abréger la réponse je suis d'accord avec toi que la version détaillée se trouve parmi les liens que tu fournis mais nous savons bien que la personne qui va tomber sur ce sujet après une recherche (sur UPDATE et SET par exemple) ne va pas forcément s'embêter à suivre les liens mais va juste recopier ta syntaxe. Smiley cligne
Modifié par Heyoan (25 Aug 2010 - 12:01)
Bonjour zardoz et Heyoan,

J'ai testé vos exemple mais lorsque je les met sur ma page, ma page ne s'affiche pas.

J'ai faite un test avec un paramètre pour commencer,


if($_SERVER['REQUEST_METHOD']=='POST') {
$requete = "INSERT INTO annonce [b]VALUES (mysql_real_escape_string($_POST['Prenom']))";[/b]
}


L'erreur se situe dans la ligne de code en gras parce que lorsque je supprime cette section de la requête ma page fonctionne très bien.

J'ai tenté de lire sur les sites que zardoz m'as donnée et regarder des exemples, mais je mis connais pas beaucoup encore donc très dure pour moi de me démêler Smiley langue

Je crois qu'il serais plus facile pour vous de cibler l'erreur si je vous donne le formulaire abréger.



 <form id="monform" name="form1" method="post" action="formulaire2.php">
  <p>
    <label>Pr&eacute;nom :
      <input type="text" name="Prenom"  />
    </label>
  </p>
(....)
 <p>
   <label>
     <input type="submit" name="bouton"  value="Envoyer" />
   </label>
 </p>
</form>



J'ai tenté aussi de faire ma requête à partir d'une autre page en appelant la page avec mon formulaire, mais sa ne change rien, la page s'affiche dans se cas, mais lorsque j'envoie le formulaire, mon URL change pour le nom de ma page inscrit dans l'action et le navigateur reste sur une page blanche dont le code source est absolument rien et la base de donnée n'ai pas à jour.

Merci beaucoup de m'aider, c'est grandement apprécier

Alexandcote Smiley biggrin
J'ai vu aussi que quelqu'un d'autre avait un problème lui aussi avec sa requête. J'ai copier sa requête en changent ses variables par mes variable et il n'y a plus d'erreur, mais aucune donnée ne s'ajoute à la base de donnée. De plus, si j'ajoute directement ma requête sql dans myphpadmin, il me sort un code d'erreur.

J'écris ma requête comme ceci:


$Prenom= "";

	$Nom= "";

	$Courriel= "";

	$Telephone= "";

	$Titre= "";

	$Prix= "";

	$Annee= "";

	$Kilometrage="";

	$Lieu = "";

	$Couleurexterieur = "";

	$Couleurinterieur= "";

	$Transmission= "";

	$Motricite= "";

	$Airclimatise="";

	$Description="";

		
if(isset($_POST["bouton"]))

	{

$Prenom= $_POST['Prenom'];

	$Nom= $_POST['Nom'];

	$Courriel= $_POST['Courriel'];

	$Telephone= $_POST['Telephone'];

	$Titre= $_POST['Titre'];

	$Prix= $_POST['Prix'];

	$Annee= $_POST['Annee'];

	$Kilometrage=$_POST['Kilometrage'];

	$Lieu = $_POST['Lieu'];

	$Couleurexterieur = $_POST['Couleurexterieur'];

	$Couleurinterieur= $_POST['Couleurinterieur'];

	$Transmission= $_POST['Transmission'];

	$Motricite= $_POST['Motricite'];

	$Airclimatise=$_POST['Airclimatise'];

	$Description=$_POST['Description'];


$requete = "INSERT INTO annonce (Prenom, Nom, Courriel, Telephone, Titre, Prix, Annee, Kilometrage, Lieu, Couleurexterieur, Couleurinterieur, Transmission, Motricite, Airclimatise, Description) VALUES (mysql_real_escape_string('".$Prenom."', '".$Nom."', '".$Courriel."', '".$Telephone."', '".$Titre."', '".$Prix."', '".$Annee."', '".$Kilometrage."', '".$Lieu."', '".$Couleurexterieur."', '".$Couleurinterieur."', '".$Transmission."', '".$Motricite."', '".$Airclimatise."', '".$Description."'))";
}


Merci Alexandcote Smiley ohwell
Je m'auto répond, j'ai finalement trouver la solution, après plusieurs essaye j'ai trouver que le problème venais du mysql_real_escape_string.

$requete = "INSERT INTO annonce (Prenom, Nom, Courriel, Telephone, Titre, Prix, Annee, Kilometrage, Lieu, Couleurexterieur, Couleurinterieur, Transmission, Motricite, Airclimatise, Description) VALUES ('".$Prenom."', '".$Nom."', '".$Courriel."', '".$Telephone."', '".$Titre."', '".$Prix."', '".$Annee."', '".$Kilometrage."', '".$Lieu."', '".$Couleurexterieur."', '".$Couleurinterieur."', '".$Transmission."', '".$Motricite."', '".$Airclimatise."', '".$Description."')";


Je voulais remercier tout le monde qui mon aider a se sujet!

Alexandcote
Salut alexandcote

C'est qu'en fait le fameux mysql_real_escape_string($_POST['prenom']) doit être utiliser à chaque élément. Toi tu l'as utiliser une seule fois au travers lequel tu as placer tous les éléments.

Voici un exemple : Celui-ci est tiré de » Le PHP Facile. Regarde bien les apostrophes double ou simple dans l'exemple. Remarque aussi que seule la date n'aura pas de mysql_real_escape_string ( )


// lancement de la requête d'insertion
$sql = 'INSERT INTO news VALUES("", "'.mysql_escape_string($_POST['auteur']).
'", "'.mysql_escape_string($_POST['titre']).'", "'.date("Y-m-d H:i:s").'", "'.
mysql_escape_string($_POST['news']).'")';


C'est pourquoi moi j'utilise l'objet de connection PDO (PHP Data Object). Je n'apprécie pas l'objet de connection mysql. PDO est plus lisible, plus léger et plus rapide.

Voici un exemple avec l'objet de connection PDO : c'est une classe PHP

<?php
  include_once('../fonctions/connecteur.php');
  include_once('../fonctions/injection.php');
  # --

  try {
     $requete = "INSERT INTO articles (categorie, titre, soustitre, auteur, date, texte) VALUES (:categorie, :titre, :soustitre, :auteur, :date, :texte)";
              # --
	 $cibleur = $cible->prepare($requete);
	 # --
	 $categorie = $_POST['categorie'];
	 $titre = $_POST['titre'];
	 $soustitre = $_POST['soustitre'];
	 $auteur = $_POST['auteur'];
	 $date = $_POST['date'];
	 $texte = $_POST['texte'];
	 # --	 
	 $affiche = array(':categorie'=>$categorie, ':titre'=>$titre, ':soustitre'=>$soustitre, ':auteur'=>$auteur, ':date'=>$date, ':texte'=>$texte);
              # --
	 $cibleur->execute($affiche);
	 # --
 
  }
  catch (PDOException $e) { echo $e->getMessage(); } 
  # --
  $cible = null;
  header('Location: ../articles/bdd_articles.php');
?>

Si tu as la chance d'avoir PHP5 Avancé de Éric Daspet et Cyril Pierre de Geyer tant mieux. C'est un livre progressif. Ne te fie pas au mot « Avancé ».

++
Modifié par zardoz (26 Aug 2010 - 07:49)
zardoz a écrit :
Remarque aussi que seule la date n'aura pas de mysql_real_escape_string ( )
D'une manière générale et comme son nom l'indique mysql_real_escape_string n'est à utiliser que sur les strings (chaînes de caractères) et je précise qu'il faut l'utiliser pour se prémunir des injections SQL. Tout cela est bien expliqué dans le lien que je t'ai donné ci-dessus et comme tu as pas mal de variables je t'invite à reprendre l'exemple avec sprintf pour formater ta requête.

D'autre part tu sembles ne faire aucune vérification sur tes variables (ne serait-ce que des champs obligatoires ne sont pas vides (avec !empty($variable)) et ça me semble très étonnant. Smiley murf

zardoz a écrit :
C'est pourquoi moi j'utilise l'objet de connection PDO (PHP Data Object). Je n'apprécie pas l'objet de connection mysql. PDO est plus lisible, plus léger et plus rapide.
+1 en précisant que l'équivalent de mysql_real_escape_string (et pas mysql_escape_string Smiley cligne ) consiste à utiliser la méthode PDO quote ou mieux encore des requêtes préparées.


Edit: au passage tu utilises des labels implicites alors qu'il est préconisé d'utiliser des labels explicites.
Modifié par Heyoan (26 Aug 2010 - 08:07)
Salut

D'accord pour mysql_real_escape_string ( ), j'ai fait vite.
Dommage qu'il n'y a pas plus de documentation/exercice sur PDO.

Même dans le manuel PHP c'est restreint.
Sauf évidemment dans la section « user contributed notes » qui à mon avis est très utile, et ce, sur l'ensemble des fonctions du manuel PHP. Je fréquente régulièrement.

++