Modification d'enregistrements sous Mysql

Eléphant du PHP | 250 Messages

29 mars 2010, 15:15

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 !';
    }
}
?>
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Mammouth du PHP | 672 Messages

29 mars 2010, 15:33

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...

Eléphant du PHP | 250 Messages

29 mars 2010, 15:43

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 !
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Eléphant du PHP | 250 Messages

29 mars 2010, 15:47

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.
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Eléphant du PHP | 250 Messages

29 mars 2010, 15:53

Où dois-je mettre les mysql_real_escape_string ?
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Mammouth du PHP | 672 Messages

29 mars 2010, 15:56

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:

Eléphant du PHP | 250 Messages

29 mars 2010, 18:30

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.
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Mammouth du PHP | 985 Messages

29 mars 2010, 18:46

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
Modifié en dernier par Dr@ke le 29 mars 2010, 18:50, modifié 1 fois.
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Eléphant du PHP | 250 Messages

29 mars 2010, 18:50

ç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:
Modifié en dernier par diabless6 le 29 mars 2010, 18:59, modifié 1 fois.
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Eléphant du PHP | 250 Messages

29 mars 2010, 18:57

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:
Modifié en dernier par diabless6 le 29 mars 2010, 19:26, modifié 1 fois.
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Mammouth du PHP | 985 Messages

29 mars 2010, 19:08

Ok mais c'était surtout pour t'expliquer pourquoi cela ne fonctionnait pas :wink:
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Eléphant du PHP | 250 Messages

29 mars 2010, 19:35

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:
Modifié en dernier par diabless6 le 29 mars 2010, 21:16, modifié 1 fois.
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Eléphant du PHP | 250 Messages

29 mars 2010, 21:10

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;
}
?>
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Mammouth du PHP | 985 Messages

29 mars 2010, 21:23

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.
Modifié en dernier par Dr@ke le 29 mars 2010, 21:30, modifié 2 fois.
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
AB
ViPHP | 5818 Messages

29 mars 2010, 21:28

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.