Bnojour,
il faut que chaque ligne soit identifiée (et identifiable) de façon UNIQUE.
remplace ton champ "numero" par un champ ""id" ou "id_article" AUTO-INCREMENTE, donc unique.
Bnojour,
il faut que chaque ligne soit identifiée (et identifiable) de façon UNIQUE.
remplace ton champ "numero" par un champ ""id" ou "id_article" AUTO-INCREMENTE, donc unique.
Manifestement tu confonds les champs id et numero. Je pense qu'il y en a un qui fait double emploi.
Je pense aussi qu'on va avoir besoin de voir tous les messages d'erreur potentiels si on veut être efficaces. Ajoute cette ligne au début de ton script PHP :
(voir http://php.net/manual/fr/function.error-reporting.php)
Code : Sélectionner tout - Visualiser dans une fenêtre à part error_reporting(-1);
Et celle-ci juste après avoir initialisé $bdd :
(voir http://php.net/manual/fr/pdo.setattribute.php)
Code : Sélectionner tout - Visualiser dans une fenêtre à part $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Je voudrais voir :
- Les changements que tu as faits quand tu as essayé de remplacer id par numero
- Le type de la colonne ID (y compris les attributs, le type de clé, etc. en bref tout ce que tu vois avec la commande DESCRIBE)
- Une description (ou une capture) de ce que tu vois quand tu navigues à l'adresse article.php?id=99
- idem avec article.php?id=79
La FAQ JavaScript – Les cours JavaScript
Touche F12 = la console → l’outil indispensable pour développer en JavaScript !
Je n'obtient aucune erreur en insérant le code error_reporting, donc je pense que pour ça c'est bon.
Après avoir inséré tes deux bouts de codes, j'ai crée une page 987 et une page 988 (dans les numéros), ce qui correspond aux ID 81 et 82 dans ma table, l'article le plus récent étant l'article 988/82
Pour ma colonne ID ça donne :
-Type : int(11)
-Null : NO
-Key : PRI
-Default : NULL
-Extra : auto_increment
C'est ma seule colonne avec une clé primary et ayant l'auto_increment activé.
-----------
Maintenant, quand je change id par numero, en sélectionnant le champ numero dans ma requête sql, j'obtient un message "Pas d’id, pas d’article !".
J'obtient le même résultat si je ne sélectionne pas numero dans ma requête SQL.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 <?php error_reporting(-1); if (isset($_GET['numero'])) { // je vérifie que l'id a été fourni $numero = (int) $_GET['numero']; // je transtype en nombre entier pour éviter les attaques les plus simples } else { // message d'erreur, à adapter... echo '<p>Pas did, pas darticle !</p>'; exit; } $statement = $bdd->prepare('SELECT article, numero FROM article WHERE numero = :numero LIMIT 0,1'); $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $statement->execute(array(':numero'=> $numero)); $donnees = $statement->fetch(PDO::FETCH_ASSOC); echo stripslashes($donnees['article']); ?>
Bonjour,
tant que tu mélangeras "id" et "numero", tu n'arriveras à rien de cohérent.
Seul "id" est auto-incrémenté, donc UNIQUE.
LUI SEUL peut identifier chaque ligne à coup sûr.
Donc, arrête de modifier tes bouts de code sans comprendre ce que tu fais.
Prends du recul pour avoir une vue d'ensemble, et sois cohérent d'un bout à l'autre.
N.B. Et je répète que " LIMIT 0,1" ne sert à rien ici.
Bon, j'ai supprimé la table numero, ça sera beaucoup plus simple.
Ceci ne change pas mon problème, mais quand j'envoie le formulaire, j'ai cette ligne de code pour la redirection :
Sauf que ça me donne cette url : article.php?id=
Code : Sélectionner tout - Visualiser dans une fenêtre à part header('location: article.php?id='.$_POST['id'].''); exit;
Sans numéro a la fin. Il faudrait que je récupère l'id qui a été généré automatiquement, mais comment m'y prendre ?
Le code de ajouterarticle_post.php, que j'utilise pour transmettre les informations :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 <?php // Connexion à la base de données try { $bdd = new PDO(xxxxxxxxxx); } catch(Exception $e) { die('Erreur : '.$e->getMessage()); } // Insertion de l'article $req = $bdd->prepare('INSERT INTO article (article, imageun, imagedeux, titre, date, auteur, categorie, scores) VALUES(?, ?, ?, ?, ?, ?, ?, ?)'); $req->execute(array($_POST['article'], $_POST['imageun'], $_POST['imagedeux'], $_POST['titre'], $_POST['date'], $_POST['auteur'], $_POST['categorie'], $_POST['scores'])); // Redirection header('location: article.php?id='.$_GET['id'].''); exit; ?>
Bonsoir,
Nulle part je n'ai vu le code de ton formulaire donc je vais faire des suppositions. D'abord je te rappelle que $_POST et $_GET ne contiennent des données que quand le formulaire a été soumis avec la méthode idoine. Il peut y avoir des données dans les deux quand tu ajoutes des paramètres à l'URL en plus de soumettre un formulaire POST, mais ce n'est pas une pratique que je conseille : on s'embrouille vite. Dans ton dernier code tu utilises les deux. C'est volontaire ?
Ensuite, attention à la terminologie : numero était une colonne, pas une table.
Enfin, si tu veux rediriger l'utilisateur vers l'article nouvellement inséré, il faut que tu récupères l'id de cet article. Comme il est auto-increment, c'est la base de données qui te le fournit, il ne peut pas venir de l'utilisateur. Si ta base est MySQL, tu peux utiliser lastInsertId. Sinon, fais une requête SELECT MAX(ID) FROM article;.
D'autre part, en utilisant la donnée $_POST['id'] sans la nettoyer dans ton header, tu réinjectes dans l'URL du client une donnée provenant du client. C'est potentiellement une vulnérabilité XSRF.
Je m'étonne de ne pas te l'avoir encore dit, mais en PHP il faut retenir ce principe de sécurité : on n'utilise jamais telles quelles les données qui viennent du client ($_GET ou $_POST), il faut les « nettoyer » avant, c'est-à-dire faire un certain nombre de vérifications dessus pour s'assurer qu'elles ne peuvent pas contenir quelque chose de dangereux.
Quelques exemples :
- Si la variable est supposée être un nombre, c'est facile : tu la castes en nombre, et ça élimine tout code malicieux potentiel.
- Si elle est censée avoir seulement un certain nombre de valeurs possibles, vérifie qu'elle a bien une de ces valeurs par exemple avec in_array.
- Si elle est destinée à être affichée dans une page web, désamorce le code HTML avec htmlspecialchars ou strip_tags.
- etc.
La FAQ JavaScript – Les cours JavaScript
Touche F12 = la console → l’outil indispensable pour développer en JavaScript !
Bonjour,
pour récupérer l'id juste après une requête INSERT :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 <?php // Insertion de l'article $req = $bdd->prepare('INSERT INTO article (article, imageun, imagedeux, titre, date, auteur, categorie, scores) VALUES(?, ?, ?, ?, ?, ?, ?, ?)'); $req->execute(array($_POST['article'], $_POST['imageun'], $_POST['imagedeux'], $_POST['titre'], $_POST['date'], $_POST['auteur'], $_POST['categorie'], $_POST['scores'])); // ----------------- // id de la dernière fiche créée $articleId = $bdd->lastInsertId('id'); // ----------------- // Redirection header('location: article.php?id=' . $articleId); exit;
Dernière modification par Invité ; 27/02/2015 à 22h59.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager