Page 1 sur 4

Modification d'enregistrements sous Mysql

Posté : 29 mars 2010, 15:15
par diabless6
Bonjour,

Alors j'ai un petit soucis. Voici ce que j'ai tapé :

Ici j'affiche le contenu de ma base mysql et j'ai une form pour modifier le contenu si nécessaire en mettant un 'Id'.
<form action="modif.php" method="post" enctype="application/x-www-form-urlencoded">
<fieldset>
    <legend>Personne à modifier</legend>
<label>votre id:</label><input type="text" name="id" size="20"/>
<input type="submit" name="submit" value="Modifier"/>
</fieldset>
</form>
    
</body>
</html>
<!--Affichage des données triées de la BDD-->
<?php
include("mysqlconnex.inc.php");
$id_con=connexMysql("isis_bdd","paramconnex");
//requête
$requete="SELECT * FROM personne ORDER BY nom ASC";
$result=@mysql_query($requete,$id_con);
if(!$result)
{
    echo'Lecture impossible !';
}
else
{
    $nbcol=mysql_num_fields($result);
    $nblig=mysql_num_rows($result);
    echo"nombre colonnes = $nbcol (Id,nom,prenom,mail)<br/>";
    echo"nombre lignes = $nblig (entrées actuellement)<br/>";
    echo"Contenu :<br/>";
    while($tab_result=mysql_fetch_array($result,MYSQLI_ASSOC))
    {
        foreach($tab_result as $col=>$val)
        {
        echo"<ul><li>$col = $val</li></ul>";
        
        }
        echo"-----------------";
    }
}
mysql_free_result($result);
?>
Quand je clic, j'arrive dans mon autre script, qui m'affiche la form avec le contenu des données à modifier selon 'Id' que j'ai choisi dans le script avant. Je modifie un nom par exemple, mais je n'ai aucunes répercutions sur la base de donnée, même pas une erreur :x
Je pige pas :cry:
Merci
<body>
<?php
if(!empty($_POST["id"]))//vérifier si une saisie
{//connexion à la base de donnée
include("mysqlconnex.inc.php");
$id=mysql_escape_string($_POST["id"]);
//requête
$requete="SELECT * FROM personne WHERE id='$id'";
$id_con=connexMysql("isis_bdd","paramconnex");
$result=@mysql_query($requete,$id_con);
$coord=mysql_fetch_row($result);
mysql_close($id_con);
print_r($coord);
 
echo'<br/><br/>';
echo'<form action="'.$_SERVER['PHP_SELF'].'" method="post" enctype="application/x-www-form-urlencoded">';
echo'<fieldset><legend>Modification de l\'id: <b>'.$coord[0].' </b></legend>';
echo'Nom: &nbsp;&nbsp;<input type="text" name="nom" value="'.$coord[1].'" size="40"/><br/>';
echo'Prénom: &nbsp;&nbsp;<input type="text" name="prenom" value="'.$coord[2].'" size="40"/><br/>';
echo'Mail: &nbsp;&nbsp;<input type="text" name="mail" value="'.$coord[3].'" size="40"/><br/>';
echo'<input type="submit" name="submit" value="Modifier"/>';
echo'</fieldset></form>';
}

//enregistrement
if(isset($_POST["name"]) && isset($_POST["prenom"]) && isset($_POST["mail"]))
{
    include("mysqlconnex.inc.php");
    $nom=mysql_real_escape_string($_POST["nom"]);
    $prenom=mysql_real_escape_string($_POST["prenom"]);
    $mail=mysql_real_escape_string($_POST["mail"]);
    //requete
    $requete="UPDATE personne SET nom='$nom',prenom='$prenom',mail='$mail' WHERE id='$id'";
    $id_con=connexMysql("isis_bdd","paramconnex");
    $result=mysql_query($requete,$id_con);
    mysql_close($id_con);
    if(!$result)
    {
        echo mysql_error();
    }
    else
    {
        echo 'modifications enregistrées !';
    }
}
?>

Re: Modification d'enregistrements sous Mysql

Posté : 29 mars 2010, 15:33
par macgawel
Bonjour.

Tu as quoi comme affichage, exactement ?
'modifications enregistrées !' ?

Là comme ça, je dirais que l'instruction mysql_close() (qui n'est pas indispensable) doit interférer avec mysql_error()
Essaye en l'enlevant...

Re: Modification d'enregistrements sous Mysql

Posté : 29 mars 2010, 15:43
par diabless6
Bonjour,

Ben en faite au vu que je n'ai pas rajouté de else, j'ai juste un blanc. C'est comme si la partie enregistrement était ignorée et qu'aucune de mes variables existent alors que si. :roll:

J'ai déplacé le Mysql_close ici :
if(!$result)
    {
        echo mysql_error();
    }
    else
    {
        echo'modifications enregistrées !';
        mysql_close($id_con);
    }
Mais c'est pareil, rien et dans PHPmyAdmin aucune modification !

Re: Modification d'enregistrements sous Mysql

Posté : 29 mars 2010, 15:47
par diabless6
Arf, j'ai ... gaffé !
//enregistrement
if(isset($_POST["nom"])
J'ai maintenant des erreurs plus parlantes :

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'Système'@'localhost' (using password: NO) in C:\wamp\www\Php\mysql\modif.php on line 35

Faut que je vérifie si ma connexion est ouverte je pense.

Re: Modification d'enregistrements sous Mysql

Posté : 29 mars 2010, 15:53
par diabless6
Où dois-je mettre les mysql_real_escape_string ?

Re: Modification d'enregistrements sous Mysql

Posté : 29 mars 2010, 15:56
par macgawel
Pour le débuggage (à enlever impérativement avant la mise en production) :
1. Affiche la requête. Ca te permettra de la tester sous PHPMyAdmin.
2. Pour toutes tes fonctions Mysql, rajoute un or die (<nom de la fonction> : '.mysql_error()); qui 'taffichera les erreurs.

Là, le problème c'est que la fonction mysql_real_escape_string() nécessite une connexion ouverte. Sinon, elle tente d'en ouvrir une. Et si ça ne marche pas, elle renvoie un Warning...
Il faut donc demander les mysql_real_escape_string() après avoir ouvert la connexion :idea:

Re: Modification d'enregistrements sous Mysql

Posté : 29 mars 2010, 18:30
par diabless6
J'ai réglé le problème des connexions.

Pour vérifier ma requête j'ai :
echo $requete;
Notice: Undefined variable: id in C:\wamp\www\Php\2Jean Engels\mysql\modif.php on line 40

et ça me donne ça :

UPDATE personne SET nom='bambola',prenom='Mabrouk',mail='a remplir !' WHERE id=''

Je suppose que c'est un problème avec l'ID. C'est pourquoi il me met le notice. Mais pourtant ici : $id=mysql_escape_string($_POST["id"]);

Je l'ai bien défini ! Il faut que je le redéfinisse avec une nouvelle connexion ? Je pige pas là :roll:
Je me demande si faut pas que je mette un champ caché pour id.

Re: Modification d'enregistrements sous Mysql

Posté : 29 mars 2010, 18:46
par Dr@ke
Tu l'as défini avant ta première requête, redéfini le avant la deuxième requête.
Cela ne serait pas nécessaire si tu n'avais pas utilisé mysql_real_escape_string() pour le définir.
En général c'est plus simple de mettre mysql_real_escape_string() directement dans la requête (SELECT, UPDATE...).

Comme dans l'exemple 1 du manuel, a part qu'ils utilisent aussi sprintf() sinon c'est le même principe.
http://www.php.net/manual/fr/function.m ... string.php

Re: Modification d'enregistrements sous Mysql

Posté : 29 mars 2010, 18:50
par diabless6
ça yier ! j'ai réussie !!!!

j'ai rajouté un champs caché :
echo'<input type="hidden" name="id" value="'.$coord[0].'"/>';
J'ai rajouté dans les enregistrement le $id:
$id_con=connexMysql("isis_bdd","paramconnex");
    $id=mysql_real_escape_string($_POST["id"]);
 $nom=mysql_real_escape_string($_POST["nom"]);
j'y ai enlevé, l'appel de ma fonction car je l'ai déjà déclarer au dessus:
include("mysqlconnex.inc.php");
Et voilà, tout baigne :mrgreen:

Merci pour ton aide macgawel :wink:

Re: Modification d'enregistrements sous Mysql

Posté : 29 mars 2010, 18:57
par diabless6
Tu l'as défini avant ta première requête, redéfini le avant la deuxième requête.
Cela ne serait pas nécessaire si tu n'avais pas utilisé mysql_real_escape_string() pour le définir.
En général c'est plus simple de mettre mysql_real_escape_string() directement dans la requête (SELECT, UPDATE...).

Comme dans l'exemple 1 du manuel, a part qu'ils utilisent aussi sprintf() sinon c'est le même principe.
http://www.php.net/manual/fr/function.m ... string.php
ouai, mais j'apprends en fonction de ce qu'il y a dans mes bouquins. Après si je peux simplifier, je le ferai en fonction de mes connaissances acquises.

:wink:

Re: Modification d'enregistrements sous Mysql

Posté : 29 mars 2010, 19:08
par Dr@ke
Ok mais c'était surtout pour t'expliquer pourquoi cela ne fonctionnait pas :wink:

Re: Modification d'enregistrements sous Mysql

Posté : 29 mars 2010, 19:35
par diabless6
Par contre, je me demande si il est nécessaire de faire une vérification de l'enregistrement avec :

mysql_affected_rows()

Moi je trouve que c'est superflue :|

Euh! j'ai trouvé ça :
<?php
function safe($value){
   return mysql_real_escape_string($value);
}
?>

Then, when I am using my code, I simply use:

<?php
$name = safe($_POST["name"]);
$password = safe($_POST["password"]);
?>
ça va me faire des économies :mrgreen:

Re: Modification d'enregistrements sous Mysql

Posté : 29 mars 2010, 21:10
par diabless6
J'ai rajouté OR die... comme me la suggérer macgawel à ma fonction :

Mais bon avec le @ ça ne sert à rien ?
<?php
function connexMysql($bdd,$pcbdd)
{
//inclusion des paramètres de connexion
include_once("$pcbdd.inc.php");
//connexion au serveur Mysql avec les identifiants
$id_con=@mysql_connect(MYHOST,MYUSER,PASSWORD) OR die(mysql_error());
//sélection de la BDD
$id_base=@mysql_selectdb($bdd) OR die(mysql_error());
if(!$id_con|!$id_base)
{
    echo'<script type=text/javascript>';
    echo"alert('Connexion impossible à la base $bdd')</script>";
}
return $id_con;
}
?>

Re: Modification d'enregistrements sous Mysql

Posté : 29 mars 2010, 21:23
par Dr@ke
Il faut enlever tous les @, à part cas exceptionnel.

Moi personnellement, je pense que le die() (ou exit) est nécessaire, par contre le mysql_error() je l'enlèverais, car il est d'après moi utile surtout pour le debug.

Ensuite tu logs toutes les erreurs dans un fichier log, et tu désactives l'affichage des erreurs quand le développement du site est terminé.

Mais bon, c'est ce que je ferais moi, ça ne veut pas dire que c'est ce qu'il faut faire.

Re: Modification d'enregistrements sous Mysql

Posté : 29 mars 2010, 21:28
par AB
Le @ devant une fonction est un opérateur qui sert à masquer les erreurs. Ne l'employer qu'en cas de nécessité. Ici ça se justifie (c'est un cas exceptionnel) pour éviter qu'en cas d'erreur un visiteur puisse obtenir des infos qu'il n'a pas à savoir et qui aideraient au piratage.