Suite à une mise à jours PHP chez OVH, Je me retrouve face à un problème concernant DELETE (et aussi Update sur mon site) j'avais une petite interface d'administration qui fonctionnait bien avec l'ancienne version où sous forme de tableau html je pouvais voir et administrer mes actualités, mes partenaires les modifier et les supprimer et cela sans passer par l'interface phpmyadmin
Je me suis donc lancé a refaire en PDO, comme conseillé sur le cour Openclassrooms J'arrive à me connecter et retrouve mes éléments à la base en utilisant
$bdd = new PDO('mysql:host .....
pour cela pas de problèmes je pense avoir compris
mais maintenant je n'arrive pas à utiliser par exemple la fonction DELETE dans mon tableau Fonction appelée sous forme de lien dans la dernière cellule de mon tableau
l'ancien code était de ce type :
$sql = 'Delete from partenaires where id ='.$id;
// on envoie la requete
$req = mysql_query($sql) or die('Erreur SQL !<br>' . $sql . '<br>' . mysql_error());
}
// on créer la requete SQL et on l'envoie
$sql = 'SELECT id,lien,adresse,ordre FROM partenaires ORDER BY ordre';
.....
je cliquais simplement sur le lien << sup >> et cela supprimais de la base l'id et le reste...
maintenant je teste avec cette nouvelle version POD mais je ne trouve pas la solution
<?php
try
{
// On se connecte à MySQL
$bdd = new PDO('mysql:host=*******;dbname=********;charset=utf8', '*******', '*******');
}
catch(Exception $e)
{
// En cas d'erreur, on affiche un message et on arrête tout
die('Erreur : '.$e->getMessage());
}
// Si tout va bien, on peut continuer
// On récupère tout le contenu de la table partenaires
$reponse = $bdd->query('SELECT * FROM partenaires');
// On affiche chaque entrée une à une
while ($donnees = $reponse->fetch())
{
?>
<tr bgcolor="#FFFFFF">
<td><?php echo $donnees['lien']; ?> - <?php echo $donnees['adresse']; ?> - <?php echo $donnees['ordre']; ?></td>
<td>Lien Modifier à venir </td>
<td><?php
$req = $bdd->exec('DELETE FROM `partenaires` WHERE `id` = $id');
echo '<a href="index.php?page=admin_liens2&id='.$donnees['id'].'" ><< sup >></a>'
?></td>
</tr>
<?php
}
$reponse->closeCursor(); // Termine le traitement de la requête
?>
</table>
voyez vous où peut se trouver le problème dans mon code ?
pour le moment je n'en suis qu'a DELETE j'espere que pour UPDATE cela sera dans le même style de correction ;-)
Pour vous dire que je débute et c'est assez dur en fait...
je ne vois pas où placer la fermeture de la première requête qui se termine si j'ai bien compris par un While... (et que nous sommes là sur la première requête...)
dont le but est l'affichage du tableau html
si je ferme, au niveau de la ligne 36 par exemple avec
$reponse->closeCursor(); // Termine le traitement de la requête
Mon tableau ne s'affichera pas,
j'y vais en tâtonnant , en testant .... merci encore
$donnees = $reponse->fetchAll(); // Cette fonction retourne un tableau contenant toutes les entrés trouvées
$reponse->closeCursor();
foreach ($donnees as $value) {
# code...
$req = $db->exec('DELETE FROM ... WHRE ID='.$id);
}
Mais la logique du code, je le comprends pas car normalement, tu devais d'abord cliquer sur "sup" pour exécuter la requête
-
Edit: Ou j'ai pas bien vu ?
- Edité par bechir_ 13 août 2015 à 12:37:51
Making functional apps for digital products @NEOTIC
Il ne reste que ton delete à corriger et c'est vraiment simple. Tout ce qu'il faut fairem comme hatll l'a mentionné plus tôt, c'est de légèrement modifier l'appel de la requête SQL pour s'assurer que la variable $id est bien passée et que la ligne est supprimer. Pour cela, il y a deux méthodes.
La première, celle qui est la plus simple à appliquer : remplacer les simple quotes ( ' ) par des double quotes ( " ). Exemple :
$req = $bdd->exec("DELETE FROM `partenaires` WHERE `id` = $id");
La seconde méthode, consiste à sortir $id de la chaine et de le concaténer à la chaine. Exemple :
$req = $bdd->exec('DELETE FROM `partenaires` WHERE `id` = '.$id);
Une requête DELETE avec PDO retour un entier du nombre d'entrées qui a été supprimé ou false si aucune entrée n'a été supprimé. Tu peux utiliser cette valeur pour afficher le message que si la suppression a eu lieu. Exemple :
if ( !$req ) {
echo 'La suppression n\'a pas eu lieu';
} else {
echo 'L\'entrée '.$id.' a été supprimée';
}
Un dernier problème que j'ai remarqué, c'est que ta requête n'est pas correctement positionnée dans ton fichier. La suppression devrait avoir lieu que si la page à reçu l'identifiant de la ligne à supprimer par $_GET. Donc la requête devrait être placé avant ta boucle et être dans une condition if. Exemple :
if ( isset($id) ) {
$req = $bdd->exec('DELETE FROM `partenaires` WHERE `id` = '.$id);
if ( !$req ) {
echo 'Erreur de suppression';
} else {
echo 'Entrée '.$id.' supprimée';
}
}
- Edité par Youmy001 13 août 2015 à 15:24:24
N'oubliez pas la mention +1 si je vous ai aidé | APIne Framework
Maintenant je vais essayer de m'attaquer à l'Update et là c'est une autre paires de manches....
le but dans mon tableau html est de cliquer sur modifier (voir copie ecran plus haut) > d’atterrir sur une page avec un formulaire qui aura récupéré les valeurs > de modifier sur ce formulaire > de cliquer sur envoyer"updater" tout cela via une requête et du code compliqué > ce qui mettra à jour les éléments de ma base de données partenaires -.... allez rock'n'roool
Bonsoir tout l'monde. Bon, j'arrive après la bataille, mais il y a pas mal de trucs depuis le début du topic qui tendent à me hérisser les poils, donc je vais les adresser ici.
hatll a écrit:
Salut,
Deux remarque dans ton code:
La première, tu n'a pas fermé la première requête avec la fonction closeCursor;
Ce n'est en rien une obligation, sauf rare cas particulier (et aucun exemple ne me vient à l'esprit au moment où j'écris ces lignes, c'est dire si ces cas particuliers sont rares). La destruction de l'objet PDOStatement entrainera un appel automatique de la méthode PDOStatement::closeCursor().
hatll a écrit:
tu peux le faire autrement:
$donnees = $reponse->fetchAll(); // Cette fonction retourne un tableau contenant toutes les entrés trouvées
$reponse->closeCursor();
foreach ($donnees as $value) {
# code...
$req = $db->exec('DELETE FROM ... WHRE ID='.$id);
}
Cette utilisation de foreach() n'apporte rien, autant foreach $reponse directement (oui c'est possible).
Par ailleurs, aucun contrôle sur $id ? C'est là qu'utiliser une requête préparée PDO avec un typage adapté serait préférable.
Youmy001 a écrit:
[...]
$req = $bdd->exec("DELETE FROM `partenaires` WHERE `id` = $id");
[...]
$req = $bdd->exec('DELETE FROM `partenaires` WHERE `id` = '.$id);
[...]
if ( isset($id) ) {
$req = $bdd->exec('DELETE FROM `partenaires` WHERE `id` = '.$id);
if ( !$req ) {
echo 'Erreur de suppression';
} else {
echo 'Entrée '.$id.' supprimée';
}
}
Même problème ici, une requête préparée avec le typage adapté est préférable. PDO fait pour vous les contrôles et blindages adaptés, sous réserve que vous lui communiquiez le bon typage, pourquoi vous en priver ?
De plus, si le mode d'erreurs par exception était actif, ce qui est un must, ton if() à la fin serait inutile.
MarcDonnad a écrit:
il faut une deuxième page php que j'ai nommé delete1.php que l'on appelle dans le premier "echo" ci dessous de ma page principale
<?php
try
{
// On se connecte à MySQL
$bdd = new PDO('mysql:host=*****;dbname=*****;charset=utf8', '*****', '*****');
}
catch(Exception $e) {
die('erreur : ' . $e -> getMessage());
}
$reponse = $bdd -> query('SELECT * FROM partenaires ORDER BY id ASC');
while ($donnees = $reponse->fetch())
{
echo "<hr /><div><a href='delete1.php?id=" . $donnees['id'] . "'><< SUPPRIMER CE LIEN >></a><p>";
echo "<b>Lien :</b> " . $donnees['lien'] . "<br />";
echo "<b>Adresse :</b>" . $donnees['adresse'] . "<br />";
echo "</p></div><hr />";
}
?>
Hmm... ça fait beaucoup de fois le même code de connexion BDD, ne trouves-tu pas ?
Je vois une requête préparée, bien, mais tu insères ton paramètre id directement via PDOStatement::execute(). Ceci signifie qu'il va être traité comme étant typé string, avec le blindage de sécurité qui va avec, et l'encadrement de guillemets SQL qui va avec. Je sais pas pour toi, mais pour moi 1 et '1' ce n'est pas la même chose. Certains moteurs tolèreront et rattraperont cette erreur mais ça dépendra du contexte (bon courage avec un paramètre dans la clause LIMIT par exemple), d'autres moteurs ne voudront rien savoir. Tu peux en revanche insérer tes paramètres un à un avec PDOStatement::bindValue(), avec le bon type sous forme de constante (ici le type entier serait PDO::PARAM_INT par exemple), et ensuite seulement lancer PDOStatement::execute() à vide. Là ça marche.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Making functional apps for digital products @NEOTIC
-
Making functional apps for digital products @NEOTIC
-
{LVM}Plan de "partitions" pour machines virtuelles ? Carte de capture sous linux ? Erreur ACPI au boot ?