8797 sujets

Développement web côté serveur, CMS

Salut à tous,

J'aurais besoin de votre aide car je n'arrive pas à faire prendre en compte des modifications sur une base de données (hébergées chez 1&1). Pourtant tout fonctionne bien en local (Wampserver).

J'ai rapidement supprimé les lignes de code qui ne concernent pas mon problème alors ne soyez pas étonné si il y a des erreurs mais le codage php est là :

La page modification2.php qui fait apparaitre quelques champs d'une table :


  <?php
    //connection au serveur:
    $cnx = mysql_connect( "xxx", "xxx", "xxx" ) ;
 
    //sélection de la base de données:
    $db = mysql_select_db( "xxx" ) ;
 
  //récupération de la variable d'URL,
  //qui va nous permettre de savoir quel enregistrement modifier
  $id  = $_GET["idnom"] ;
 
  //requête SQL:
  $sql = "SELECT *
            FROM restos
	    WHERE id = ".$id ;
 
  //exécution de la requête:
  $requete = mysql_query( $sql, $cnx ) ;
 
  //affichage des données:
  if( $result = mysql_fetch_object( $requete ) )
  {
  ?>
<html>
<head>
 <?php echo($result->nature) ;?> cacher <?php echo($result->nom) ;?> 
<form name="insertion" action="modification3.php" method="POST" >
<input type="hidden" name="id" value="<?php echo($id) ;?>">

<ul>
<li>Nom : <input type="text" id="nom" name="nom" value="<?php echo($result->nom) ;?>"></li>
</ul>


<div id="pave2">
<ul>
<li>Adresse : <input type="text" name="adr1" id="adresse" value="<?php echo($result->adr1) ;?>"></li>
<li>Code postal : <input name="cp" type="text" id="cp" value="<?php echo($result->cp) ;?>" maxlength="5"></li>
<li>Ville : <input type="text" name="ville" id="ville" value="<?php echo($result->ville) ;?>"></li>
<li>Pays : <input type="text" name="pays" id="pays" value="<?php echo($result->pays) ;?>"></li>
<li>Téléphone : <input type="text" name="tel" id="tel" value="<?php echo($result->tel) ;?>"></li>
<li>Fax : <input type="text" name="fax" id="fax" value="<?php echo($result->fax) ;?>"></li>
<li>Site web : <input type="text" name="site" id="site" value="<?php echo($result->site) ;?>"></li>
<li>Email : <input type="text" name="email" id="email" value="<?php echo($result->email) ;?>"></li>
<li>Nom du propriétaire : <input type="text" name="proprio" id="proprio" value="<?php echo($result->proprio) ;?>"></li>
</ul>
</div>

<div id="pave3">
<?php echo($result->nature) ;?>
</div>

<div id="pave4">
<ul><li><?php echo($result->cuisine) ;?> <?php echo($result->mot) ;?>"> </li> </ul>
</div>

<div id="pave5">
<ul><li><?php echo($result->type) ;?>"></li>
<li> <input type="text" name="lv" id="lv2" value="<?php echo($result->lv) ;?>"></li>
</ul>
</div>

<div id="pave6">
<li><input name="go" type="submit" id="go" value="Mettre à jour"> </li>
</div>
</form>
<?php echo($result->lien) ;?>
<?php
  }//fin if 
  ?>
</div>
</div>
<!-- FinPage2 -->
</div>
</div>
</div>
<!-- Fin Contenu animé -->
</div><br class="clear" />
</body>
</html>


La page modification3.php qui doit faire les mises à jour :


<?php
  //connection au serveur
 $cnx = mysql_connect( "xxx", "xxx", "xxx" ) ;
 
  //sélection de la base de données:
  $db  = mysql_select_db( "xxx" ) ;
  $nature       = $_POST["nature"] ;
  $nom     		= $_POST["nom"] ;
  $lien         = $_POST["lien"] ;
  $adr1         = $_POST["adr1"] ;
  $cp           = $_POST["cp"] ;
  $ville        = $_POST["ville"] ;
  $pays         = $_POST["pays"] ;
  $tel          = $_POST["tel"] ;
  $fax          = $_POST["fax"] ;
  $site         = $_POST["site"] ;
  $email        = $_POST["email"] ;
  $proprio      = $_POST["proprio"] ;
  $cuisine      = $_POST["cuisine"] ;
  $mot       	= $_POST["mot"] ;
  $lv       	= $_POST["lv"] ;
  $type         = $_POST["type"] ;
  $id           = $_POST["id"] ;
 
$sql = "UPDATE restos SET
nature 	= '$nature',
nom='$nom',
lien='$lien',
adr1='$adr1',
cp='$cp',
ville='$ville',
pays='$pays',
tel='$tel',
fax='$fax',
site 	= '$site',
email 	= '$email',
proprio 	= '$proprio',
cuisine 	= '$cuisine',
mot 	= '$mot',
lv 	= '$lv',
type 	= '$type',

WHERE id = '$id' " ;
 
  //exécution de la requête SQL:
  $requete = mysql_query($sql, $cnx) or die( mysql_error() ) ;
 
 
  //affichage des résultats, pour savoir si la modification a marchée:
  if($requete)
  {
    echo("La modification à été correctement effectuée") ;
  }
  else
  {
    echo("La modification à échouée") ;
  }
?>


Merci d'avance de votre aide Smiley biggrin
Bye Bye
Zed
Salut Zed -sympa ton pseudo Smiley langue -

Qu'est ce que la page te retourne ? "Modification correctement effectuée"/"Echec"/Autre ?

De manière générale, quand tu as un problème de ce type, simule le déroulement pas à pas de ton code pour savoir d'où ça peut venir. (ex.:
if(!mysql_connect(...)){echo "Probleme de connexion";}
)
Une fois que tu as trouvé, enlève ces vérificateurs pour ne pas aider d'éventuels hackers à pirater ton site.

Aussi, pour ton code, sécurise les données entrées par l'utilisateur (mysql_real_escape_string et co), et fais des vérifications sur le format des variables GET. Comme ça, tu seras moins vulnérable aux injections sql.
Je te retourne Smiley biggrin le compliment pour ton pseudo Smiley biggrin ...

Pour le message d'erreur, en fait il n' y en a pas, cela m'indique bien que :"La modification à été correctement effectuée" alors que non Smiley fache
Tu peux faire un
echo $sql;

avant la requête pour voir ce que contient la chaine. Puis copie / colle le résultat dans PhpMyAdmin et regarde si ça marche.

Pour un peu plus de propreté, tu peux plutôt faire :


$buffer = '';

foreach ($_POST as $k => $v)
{
      if ($k !== 'id') 
      {
            $buffer .= $k.' = '.$v.',';
      }
}

$sql = 'UPDATE restos SET '.substr($buffer, 0, -1).' WHERE id = '.$_POST["id"]; 
J'ai re-vérifié mes codes, et pour une raison qui m'échappe cela fonctionne ! Alors que j'ai simplement replacer la variable $id en tête (dans la page modification3.php) au moment de la sélection de la base de données Smiley ohwell

J'ai bien noter vos commentaires, notamment ce que tu disais Zed13 sur "sécurise les données entrées par l'utilisateur".
En fait, comment tu as pu le voir les champs des formulaires ne sont pas vide à l'état initial puisqu'ils affichent automatiquement le contenu de la table (bdd).

Je comptais plutôt sécuriser l'accès principal car je ne vois pas (sais pas) comment sécuriser l'entrée d'un champs de formulaire dont la "value" n'est pas nulle ! ? On peut le faire ?
A l'heure actuelle, un visiteur mal intentionné peut rentrer n'importe quel format de données dans ton formulaire; par exemple, dans l'input text "nature", s'il entre toto'--, tous les enregistrements de ta table verront leur champ nature être remplacé par toto, étant donné que ta requête lancée sera:
UPDATE restos SET nature='toto'--',nom='....' .... WHERE id = '$id'

Comme -- est le marqueur des commentaires SQL, la requête prise en compte sera donc
UPDATE restos SET nature='toto'
=> Ton système est vulnérable aux injections SQL.

Pour éviter ça, à chaque variable entrée par l'utilisateur, tu la fais passer dans la fonction mysql_real_escape_string pour échapper tous les caractères spéciaux, et ainsi colmater la faille.

Donc le code à rentrer serait, comme Vincent l'a dit:
$buffer = ''; 
 
foreach ($_POST as $k => $v) 
{ 
      if ($k !== 'id')  
      { 
            $buffer .= $k.' = '.mysql_real_escape_string($v).','; 
      } 
} 
 
$sql = 'UPDATE restos SET '.substr($buffer, 0, -1).' WHERE id = '.mysql_real_escape_string($_POST["id"]); 


Dans le même état d'esprit, quand tu récupères la variable GET 'idnom', il faut vérifier qu'il s'agit bien d'un entier.

Exemple:

if(isset($_GET['idnom'])
{
if(is_numeric($_GET['idnom']))
{
//Récupération de la variable
}
else
{
//Traitement alternatif: un petit malin essaie de rentrer dans le système
//redirection, ou autre traitement...
}
}
else
{
//Redirection
}
Salut,

En développement je conseille de mettre le niveau d'alerte au maximum en utilisant error_reporting. Rien que ça permet de corrigé pas mal de bug.
error_reporting(E_ALL | E_STRICT);

On peux aussi transformer les erreurs en exception ErrorException (voir exemple). Ce qui aura pour effet d'arrêter le script si l'exception n'est pas catcher.

Au passage l'API mysqli est souvent plus adapter à celle de mysql (notez le i à la fin de mysql Smiley cligne )