salut
un souci avec update je n'arrive pas à modifier une entrée dans ma base voici le script:

if(!empty($_POST'id']))
{

try
{
//connection au serveur
$db = new PDO('mysql:host=localhost;dbname=madb', 'root', '', array(PDO::MYSQL_ATTR_INIT_COMMAND =>'SET NAMES UTF8'));
}catch(PDOException $e){
echo "Une erreur est survenue lors de la connexion a la BD!.";
echo '<br>'.$e->getMessage();
}

$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

$sql = "UPDATE fmail SET nom='?', email='?', numero='?' WHERE id='?'";
$sql->setFetchMode(PDO::FETCH_ASSOC);
$d = array(
$_POST'nom'],
$_POST'email'],
$_POST'numero'],
$_POST'id']);
$sql->execute($d);
// $d = null;

}

?>

merci de m'aider je cherche mais :-((
ps
"pour insert et delete select pas de souci ça marche mais là perdu!!!"

13 réponses


Yentia
Réponse acceptée

Salut,

Je vais peut être dire une betise, mais je pense que tu n'as pas besoin de mettre des ' ' avec un id ( int ).
si tu numero et ton id sont des Int, enleve les guillemets.

et je pense aussi que tu devrais changer
if(!empty($_POST'id'])) => if(isset($_POST'id']))

Yentia
Réponse acceptée

re, je pense que ta methode n'est pas bonne. essai :

$sql = "UPDATE fmail SET nom='?', email='?', numero='?' WHERE id='?'";
$req = $this->db->prepare($sql);
$d = array($_POST'nom'], $_POST'email'],$_POST'numero'], $_POST'id']);      
$req->execute($d);

le probleme viens peut etre du faite que tu n'utilise pas prepare.

tiens moi au courant.

Ramzz1994
Réponse acceptée

Bonjour,

Je pense qu'il est préférable d'utiliser ce qu'on appel des requêtes préparées. En fait, lorsqu'on passe des variables de l'utilisateur, c'est toujours préférable de valider s'il n'a pas tenter de créer une injection SQL. PDO permet d'ailleurs d'effectuer ce genre de validation, du moins, c'est l'objet qu'il retourne lorsqu'on prépare la requête.

<?php 
// Je considére que la variable $db a été initialiser plus haut et qu'il s'agit de l'object PDO.
//$db = new PDO(...);
$variableA = "variableA";
$variableB = 200;
// la méthode PDO::prepare(...) retourne un object PDOStatement. Il s'agit d'une requête préparée.
// D'ailleurs, nous allons initialiser une variable pour utiliser ce PDOStatement.
$PDOStatement = $db->prepare("UPDATE ma_table SET champsA = :variableA, champsB = :variableB");
// Édit: pense à inclure la clause WHERE. :D
// L'idée est de remplacer chaque mot préfixé par le caractère « : », par une valeur en utilisant 
// bindParam(nomVariable, valeurVariable), une méthode contenu dans notre instance de PDOStatement.
$PDOStatement->bindParam(":variableA", $variableA); // Tu pourrais spécifier le type en 3ième paramètre, 
                                                    // mais pour nous c'est inutile étant donné que le 
                                                    // notre base de données (plutôt, le SQL) parle en 
                                                    // chaîne de caractères... :-)
$PDOStatement->bindParam(":variableB", $variableB); 
// Tu as d'ailleurs la possibilité de remplacer des nomDeVariable par le numéro du paramètre et en 
// indiquant des points d'interrogation dans la chaîne de caractères de la requête.
// $PDOStatement = $db->prepare("UPDATE ma_table SET champsA = ?, champsB = ?");
// $PDOStatement->bindParam(1, $variableA);
// $PDOStatement->bindParam(2, $variableB);
// Ensuite, on peut exécuter cette requête préparer.
$PDOStatement->execute(); // Cette méthode retourne true ou false, indiquant si la requête a exécuté.
?>

La réponse de Darkney fait aussi partie de la solution proposé par PHP.net. Je te conseil de passer voir la document relative à PDO.

Edit: En fait, je réalise que c'est que tu as fait (la requête préparée, néanmoins, je laisse l'explication... :-) Cela dit, tu n'as pas besoin de changer le mode de récupération des données (PDOStatement::setFetchMode(...)) puisque ta requête UPDATE ne retourne pas de données.

http://php.net/manual/fr/book.pdo.php
http://php.net/manual/fr/class.pdostatement.php

Bonne chance,
Ramz.

Yentia
Réponse acceptée

je pense avoir compris ton erreur,

je pense que cela proviens de ton id.

pour chacun des champs tu fais $_POST'name du champ'],
or ton id se trouve sur le submit qui s'appelle submit et non pas id donc je pense que ton $_POST'id] dans ton tableau $d est vide car il n'existe pas.

après essai de faire un var_dump de $_POST pour voir si tu récupére bien toutes les données avant de faire ta requête update.

Moi je te conseillerai de faire un champ de type hidden pour stocker l'id et donc de mettre une bonne valeur a ton champ submit.

du genre :

<input type="hiddden" name="id" value="<?php echo $req'id']; ?>" >
    Nom: <input type="text" name="nom" value="<?php echo $req'nom']; ?>"> <br>
    ...
    Modifier : <input type="submit" name="submit" value="Modifier"><br><hr>
Ramzz1994
Réponse acceptée

Pense à faire des var_dump ou print_r :-)

<?php var_dump($_POST); ?>
<pre>
    <?php print_r($_POST); ?>
</pre>
Yentia
Réponse acceptée

Oui enleve $this désole c'est parce que moi je code en POO, toi utilise direct $db.

Donc ton formulaire récupère bien les données, et le var_dump en page d'update est bon, je comprend pas pourquoi ton update ne se fait pas

Yentia
Réponse acceptée

oui si tu veux choisir l'entrée a modifier, il faut que tu fasse une liste déroulante, ou une page avant ton formulaire pour sélectionner l'entrée.

car a l'heure actuelle, même si tu fais un "select * ..." , il va compléter ton form avec le dernier enregistrement.

jmch73
Auteur
Réponse acceptée

bien merci pour tous tes conseils c'est ce que je pensais je vais faire ceci
merci aussi à Ramzz1994

jmch73
Auteur

ok je vais essayer ceci et je te tiens au courant
merci sympa

jmch73
Auteur

salut j'ai essayé ta soluce Darkney ça ne marche pas rien ne change dans la base
j'ai pas d'erreur est ce que cela vient du formulaire:

PAGE FORMULAIRE
<?php
try{
$bdd = new PDO('mysql:host=localhost;dbname=arbin', 'root', '', array(PDO::MYSQL_ATTR_INIT_COMMAND =>'SET NAMES UTF8'));
}catch(PDOException $e){
echo "Une erreur est survenue lors de la connexion a la DB!.";
echo "<br>".$e->getMessage();
}

$bdd->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

?>
<form method="post" action="pdo2.php">
<?php
try
{
$sql = "SELECT * FROM fmail";

$rep = $bdd->query($sql);

?>

Nom: <input type="text" name="nom" value="<?php echo $req'nom']; ?>"> <br>
Mail: <input type="text" name="email" value="<?php echo $req'email']; ?>"><br>
Numero: <input type="text" name="numero" value="<?php echo $req'numero']; ?>">
<br>

<br>
Modifier : <input type="submit" name="submit" value="<?php echo $req'id']; ?>"><br><hr>

<?php
}

}catch(PDOException $e){
echo "Un probleme avec la(es) requete(s)";

}

?>
</form>

et donc PAGE MODIF (changé):

<?php

if(isset($_POST'id']))
{

try
{
//connection au serveur
$db = new PDO('mysql:host=localhost;dbname=arbin', 'root', '', array(PDO::MYSQL_ATTR_INIT_COMMAND =>'SET NAMES UTF8'));
}catch(PDOException $e){
echo "Une erreur est survenue lors de la connexion a la DB!.";
echo '<br>'.$e->getMessage();
}

$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

$sql = "UPDATE fmail SET nom='?', email='?', numero='?' WHERE id='?'";
$req = $this->db->prepare($sql);
$d = array($_POST'nom'], $_POST'email'],$_POST'numero'], $_POST'id']);
$req->execute($d);

}

?>

merci encore pour votre aide

jmch73
Auteur

Voila var-dump et print-r

array (size=5)
'id' => string '50' (length=2)
'nom' => string 'toto' (length=4)
'email' => string 'trest@trest.fr' (length=14)
'numero' => string '123' (length=3)
'submit' => string 'Modifier' (length=8)
array (size=5)
'id' => string '50' (length=2)
'nom' => string 'toto' (length=4)
'email' => string 'trest@trest.fr' (length=14)
'numero' => string '123' (length=3)
'submit' => string 'Modifier' (length=8)
Array
(
[id] => 50
[nom] => toto
[email] => trest@trest.fr
[numero] => 123
[submit] => Modifier
)

jmch73
Auteur

c'est la derniere insert qui apparait mais j'ai inserer 4 autres
qui n'apparaissent pas.

$this provoque une erreur dons je l'ai enlevé

jmch73
Auteur

je suis dans le flou complet aussi je peux modifier que ma derniere entrée
mais pas les autres merci encore