Besoin d'aide pour améliorer mon script

Eléphanteau du PHP | 17 Messages

10 oct. 2010, 10:00

Bonjour,

J'aimerais savoir, comment inserer des données via un formulaire html à ma base de données depuis
le code ci-dessous, mais sans utiliser la requête de connexion au serveur, mais en regardant un fichier settings.php,
qui lui contient déjà les instructions de connexion à ma base.
  $cnx = mysql_connect( "localhost", "root", "password" ) ;
  $db  = mysql_select_db( "bdd" ) ;
Merci d'avance.
P.S : en même temps, si quelqu'un peut me dire si mon code est bien écrit !
Weshpub

demo.html
<h3>Module de test</h3>
<form name="insertion" action="insertion.php" method="POST">
      <td><div align="left">Nom :</div></td>
      <td><input type="text" name="login"></td>
      <td><div align="left">Code postal :</div></td>
      <td><input type="text" name="cp"></td>
      <td><div align="left">Ville :</div></td>
      <td><input type="text" name="ville"></td>
      <td><div align="left">Pays :</div></td>
      <td><input type="text" name="pays"></td>
      <td colspan="2"><input type="submit" class="form_button" value="insérer"></td>
    </tr>
</form>
insertion.php
<?php
  //connection au serveur
  $cnx = mysql_connect( "localhost", "root", "password" ) ;
 
  //sélection de la base de données:
  $db  = mysql_select_db( "bdd" ) ;
 
  //récupération des valeurs des champs:
  //nom:
  $login     = $_POST["login"] ;
  //code postal:
  $cp        = $_POST["cp"] ;
  //ville:
  $ville        = $_POST["ville"] ;
  //pays:
  $pays       = $_POST["pays"] ;
 
  //création de la requête SQL:
  $sql = "INSERT  INTO carte (login, cp, ville, pays)
            VALUES ( '$login', '$cp', '$ville', '$pays') " ;
 
  //exécution de la requête SQL:
  $requete = mysql_query($sql, $cnx) or die( mysql_error() ) ;
 
  //affichage des résultats, pour savoir si l'insertion a marchée:
  if($requete)
  {
    echo("L'insertion a été correctement effectuée") ;
  }
  else
  {
    echo("L'insertion à échouée") ;
  }
?>
settings.php
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
// Paramètres de la base de données

$hote = "localhost" ;         // Nom de votre serveur SQL
$utilisateur = "root" ;       // Nom d'utilisateur SQL
$baseDeDonnees = "bdd" ;      // Nom de la base de données
$motDePasse = "password" ;    // Mot de passe SQL
$tableUtilisee = "carte" ;    // Nom de la table utilisée (par défaut "carte")

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
// Paramètres des champs
// Nom des champs de votre base

$champId = 'id';
$champNom = 'login';	
$champCodePostal = 'cp';
$champVille = 'ville';
$champPays = 'pays';

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

10 oct. 2010, 10:45

Si j'ai bien compris ce que tu veux faire, il te faut utiliser include() ou require() pour inclure ton fichier setting à ton script, et ainsi récupérer les informations qu'il contient comme si elles étaient présentes dans le script à l'endroit de l'inclusion.

Sinon concernant ton code, deux petites remarques :
- la première concernant le html : tu as des balises <td> (table data) qui se baladent, mais pour être valide, celles-ci devraient systématiquement être placée dans un <tr> (table row), elles même situées dans un <table> :
<table>
  <tr>
    <td> ... </td>
    ...
  </tr>
  ...
</table>
- La seconde concerne la sécurité : lorsque tu récupères les données fournies par l'utilisateur ($_POST["ville"] ...), avant de les insérer dans ta base de données, il est important de les contrôler et de les protéger pour éviter ce que l'on appelle des "injections SQL". C'est à dire éviter que l'utilisateur ne puisse altérer ta requête et exécuter ses propres requêtes sur ta base de données. Pour cela on utilise entre autre la fonction mysql_real_escape_string() :)

Bon courage ! :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 17 Messages

10 oct. 2010, 10:49

Merci pour ta réponse rapide Ryle,
Je vais essayer tout ça, et je reviens faire le point plus tard.

Bon dimanche,

Weshpub

Eléphanteau du PHP | 17 Messages

10 oct. 2010, 11:08

Est-ce un include() ou un include_once() qu'il faut dans mon cas ?

Je suis un peu lourdé, je suis aller voir sur php.net, mais c'est pas tout clair dans ma tête !!!! #-o

Sinon, j'ai modifié ($_POST["ville"] ...) comme tu me l'a dit, est-ce correct cette fois ci ?
<?php
  //connection au serveur
  $cnx = mysql_connect( "localhost", "root", "password" ) ;
 
  //sélection de la base de données:
  $db  = mysql_select_db( "bdd" ) ;
  
  //récupération des valeurs des champs:
  //nom:
  mysql_real_escape_string($login);
  //code postal:
  mysql_real_escape_string($cp);
  //ville:
  mysql_real_escape_string($ville);
  //pays:
  mysql_real_escape_string($pays);
  //création de la requête SQL:
  $sql = "INSERT  INTO carte (login, cp, ville, pays)
            VALUES ( '$login', '$cp', '$ville', '$pays') " ;
 
  //exécution de la requête SQL:
  $requete = mysql_query($sql, $cnx) or die( mysql_error() ) ;
 
  //affichage des résultats, pour savoir si l'insertion a marchée:
  if($requete)
  {
    echo("L'insertion a été correctement effectuée") ;
  }
  else
  {
    echo("L'insertion à échouée") ;
  }
?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

10 oct. 2010, 11:18

A la base, include a pour but de te permettre d'inclure n'importe quel autre page. Sauf que certains fichiers ne doivent être inclus qu'une seule fois (les classes ou les déclarations de fonction par exemple). Avec include tu peux inclure un fichier A et un fichier B à ton script, mais chacun de ces fichier (A et B) peuvent également inclure un même fichier C.

Ceci fonctionne quand tu inclus uniquement A ou uniquement B, mais si tu inclus A et B, le fichier C sera inclut deux fois. La fonction include_once permet, quand tu n'es pas sur de ce que tu inclus, de laisser php tester si le fichier a déjà été inclut (et donc de ne pas l'inclure à nouveau)

Concernant les injections SQL, il te faut quand même indiquer d'où provient la valeur que tu récupères (donc de $_POST), par exemple :
$login = mysql_real_escape_string($_POST['login']);
Tu peux ainsi utiliser ta variable $login dans tes requêtes sql sans t'inquiéter du code sql que pourrait rajouter un utilisateur malveillant :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 17 Messages

10 oct. 2010, 12:16

Bon, j'ai fais ce qu'il y a en dessous, le script s'exécute, mais je n'ai aucune données enregistrées dans ma table !

:oops: Wesh :oops:
<?php
  //connection au serveur
include '../config/settings.php';  
  //récupération des valeurs des champs:
  //nom:
  $login = mysql_real_escape_string($_POST['login']);
  //code postal:
  $cp = mysql_real_escape_string($_POST['cp']);
  //ville:
  $ville = mysql_real_escape_string($_POST['ville']);  
  //pays:
  $pays = mysql_real_escape_string($_POST['pays']); 
  //création de la requête SQL:
  $sql = "INSERT  INTO carte (login, cp, ville, pays)
            VALUES ( '$login', '$cp', '$ville', '$pays') " ;
 
  //exécution de la requête SQL:
  $requete = mysql_query($sql, $cnx) or die( mysql_error() ) ;
 
  //affichage des résultats, pour savoir si l'insertion a marchée:
  if($requete)
  {
    echo("L'insertion a été correctement effectuée") ;
  }
  else
  {
    echo("L'insertion à échouée") ;
  }
?>
Modifié en dernier par weshpub le 10 oct. 2010, 13:07, modifié 1 fois.

Eléphanteau du PHP | 17 Messages

10 oct. 2010, 12:50

Je pense que ça vient de la requête SQL

Code : Tout sélectionner

//exécution de la requête SQL: $requete = mysql_query($sql, $cnx) or die( mysql_error() ) ;

Code : Tout sélectionner

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /mnt/164/sdb/c/7/htdocs/carte/install/insertion.php on line 6 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /mnt/164/sdb/c/7/htdocs/carte/install/insertion.php on line 8 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /mnt/164/sdb/c/7/htdocs/carte/install/insertion.php on line 10 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /mnt/164/sdb/c/7/htdocs/carte/install/insertion.php on line 12 Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in /mnt/164/sdb/c/7/htdocs/carte/install/insertion.php on line 18

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

10 oct. 2010, 14:08

As-tu déplacé le bloc de connexion/choix de la bdd dans ton fichier settings ? Il faut soit les déplacer soit les laisser dans ton script, sinon il va effectivement manquer la connexion pour que php puisse exécuter la requête chez mysql :)
  //connection au serveur
  $cnx = mysql_connect( "localhost", "root", "password" ) ;
 
  //sélection de la base de données:
  $db  = mysql_select_db( "bdd" ) ;
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

ViPHP
ViPHP | 5462 Messages

10 oct. 2010, 15:00

hello, t'as quelle version de PHp ?

Eléphanteau du PHP | 17 Messages

10 oct. 2010, 15:06

Ok, alors j'ai ça dans insertion.php
<?php
  //connection au serveur
include '../config/settings.php';  
  //récupération des valeurs des champs:
  //nom:
  $login = mysql_real_escape_string($_POST['login']);
  //code postal:
  $cp = mysql_real_escape_string($_POST['cp']);
  //ville:
  $ville = mysql_real_escape_string($_POST['ville']);  
  //pays:
  $pays = mysql_real_escape_string($_POST['pays']); 
  //création de la requête SQL:
  $sql = "INSERT  INTO carte (login, cp, ville, pays)
            VALUES ( '$login', '$cp', '$ville', '$pays') " ;
 
  //exécution de la requête SQL:
  $requete = mysql_query($sql, $hote, $utilisateur, $motDePasse) or die( mysql_error() ) ;
 
  //affichage des résultats, pour savoir si l'insertion a marchée:
  if($requete)
  {
    echo("L'insertion a été correctement effectuée") ;
  }
  else
  {
    echo("L'insertion à échouée") ;
  }
?>
et ça dans settings.php
// Paramètres de la base de données
    
$hote = "localhost" ;               // Nom de votre serveur SQL
$utilisateur = "root" ;        // Nom d'utilisateur SQL
$baseDeDonnees = "bdd" ;      // Nom de la base de données
$motDePasse = "password" ;             // Mot de passe SQL
$tableUtilisee = "carte" ;        // Nom de la table utilisée (par défaut "carte")

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
// Paramètres de champs
// Nom des champs de votre base

$champId = 'id';
$champNom = 'login';    
$champCodePostal = 'cp';
$champVille = 'ville';
$champPays = 'pays';
Modifié en dernier par weshpub le 10 oct. 2010, 16:58, modifié 1 fois.

Eléphanteau du PHP | 17 Messages

10 oct. 2010, 15:13

Pour répondre à stealth35, ma version PHP est 5.1.3RC4-dev

ViPHP
ViPHP | 5462 Messages

10 oct. 2010, 15:18

Pour répondre à stealth35, ma version PHP est 5.1.3RC4-dev
chez free :wink:

Eléphanteau du PHP | 17 Messages

10 oct. 2010, 16:03

Oui, chez free pour le moment, et si mon script fonctionne bien, il sera hébergé chez 1and1.

ViPHP
ViPHP | 5462 Messages

10 oct. 2010, 16:18

chez 1and1 t'aura PDO, donc niveau amélioration et sécurité ca sera beaucoup mieux

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

10 oct. 2010, 16:30

Bonjour,
Tu as oublié d'ouvrir la connexion au serveur, c'est à dire ce bloc:
//connection au serveur
  $cnx = mysql_connect( "localhost", "root", "password" ) ;
 
  //sélection de la base de données:
  $db  = mysql_select_db( "bdd" ) ;
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène