[RESOLU] Problème requètes PDO

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Problème requètes PDO

Re: Problème requètes PDO

par hunomina972 » 25 août 2014, 18:43

C'est bon j'ai trouver je mettrai la solution plus tard là je suis sur ma tablette mais merci a tous et je vais essayer Xdebug merci ;-)

Re: Problème requètes PDO

par moogli » 25 août 2014, 10:48

salut,

je pense que tu devrais utiliser un debugguer c'est vraiment plus qu'utile ;)
Lorsque l'on développe il faut parfois utiliser quelque outils plus complexe que notepad++ mais c'est bigrement efficace et utile ;)

Tuto pour Xdebug : http://blog.pascal-martin.fr/post/xdebu ... clipse-pdt

coté configuration de php il te faut :
- error_reporting == E_ALL
- display_error = on

- est ce que tu n'aurais pas un "die()" (ou exit()) qui traine dans ton code ?
- Est ce qu'il y a plus d'info dans le log du serveur web (httpd)
Questions récurrente mais obligatoire pour avancer.

@+

Re: Problème requètes PDO

par xTG » 25 août 2014, 08:36

Tu as donc bien une erreur de syntaxe dans le PHP.
Vérifies le fichier de log d'Apache ou bien rajoutes error_reporting en haut de page pour trouver l'erreur. :)

Pour protéger les variables rien de mieux que la documentation de la fonction :
PDO::quote : http://fr2.php.net/manual/fr/pdo.quote.php
Son retour peut ensuite être concaténé dans une requête SQL.
Les requêtes préparées : http://fr2.php.net/manual/fr/pdo.prepare.php
(aucune variable injectée directement dans la requête, uniquement via execute)

Re: Problème requètes PDO

par hunomina972 » 24 août 2014, 21:57

J'ai d'ailleur essayer en enlevant tout le php et là les formulaire s'affiche !!! :!: :?: :!:

Re: Problème requètes PDO

par hunomina972 » 24 août 2014, 21:35

Merci pour le conseil mais je ne vois pas comment protéger l'id peut tu me montrer le code à ajouter s'il te plait ???
En ce qui conserne le code source comme tu m'a dit, ça m'affiche que ça sur la page
<!DOCTYPE html PUBLIC>
	<html>
		<head>
			<title>Rédiger une news</title>
			<meta charset="utf-8">
			<style type="text/css">
			h3, form
			{
			text-align:center;
			}
			a {
				text-decoration:underline;
				color:black;
			}
			a:hover{
				color:blue; 
			}
			</style>
		</head>
		<body>
			<h3><a href="liste_news.php">Retour à la liste des news</a></h3>
			
Je ne sais donc toujours pas comment résoudre mon problème de formulaire =( Cependant on peut voir sur le code source que la fin de mes codes n'est pas affiché (fermeture du body et du html avec les formulaire pour le coup qui ce trouve avec) A tu une autre idée ???

Re: Problème requètes PDO

par xTG » 24 août 2014, 20:30

Je suis d'accord mais mes deux requêtes sont déjà sous forme de PDO::prepare regarde
$sql2= "UPDATE news SET titre=?,contenu=?, timestamp=? WHERE id='" . $_POST['id_news'] . "' ";
$req2 = $cnx->prepare($sql2);
$req2->execute($q);
et
$req = $cnx->prepare('INSERT INTO news (titre, contenu, timestamp) VALUES (:titre, :contenu, :timestamp)');
$req->execute($q);
Oui mais le paramètre id n'est pas protégé.
N'importe qui en modifiant l'url peut faire ce qu'il veut avec ta base de données.
Notamment en faisant une chose du genre :

Code : Tout sélectionner

url.php?id=' OR 1=1
qui aura pour effet de mettre à jour tous les enregistrements de ta table à la fois.

Pour tes formulaires ils ne sont pas soumis à condition.
Ils devraient donc être visible.
Sauf si tu as une autre erreur PHP qui se cache dans le DOM HTML et n'est pas visible.
Tu peux faire un clic droit sur la page de ton navigateur et afficher le code source.
En navigant dedans tu pourras voir à la fin ce qu'il y a (le code du formulaire ? un message d'erreur ?).

Re: Problème requètes PDO

par hunomina972 » 24 août 2014, 20:24

Je suis d'accord mais mes deux requêtes sont déjà sous forme de PDO::prepare regarde
$sql2= "UPDATE news SET titre=?,contenu=?, timestamp=? WHERE id='" . $_POST['id_news'] . "' ";
$req2 = $cnx->prepare($sql2);
$req2->execute($q);
et
$req = $cnx->prepare('INSERT INTO news (titre, contenu, timestamp) VALUES (:titre, :contenu, :timestamp)');
$req->execute($q);
Alors ou et le problème ???
J'ai reussis a faire apparaître la page cependant les formulaires ne s'affichent pas (c'est la seul chose utile de la page), pourquoi ???
<!DOCTYPE html PUBLIC>
	<html>
		<head>
			<title>Rédiger une news</title>
			<meta charset="utf-8">
			<style type="text/css">
			h3, form
			{
			text-align:center;
			}
			a {
				text-decoration:underline;
				color:black;
			}
			a:hover{
				color:blue; 
			}
			</style>
		</head>
		<body>
			<h3><a href="liste_news.php">Retour à la liste des news</a></h3>
			<?php
			try {
				$cnx = new PDO('');
				$cnx-> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
			} 
			catch (PDOException $e) {
				echo '<code>'.$e->getMessage().'<br />'.$e->getTraceAsString(),'</code>';
			}
			$titre = $_POST(['titre']);
			$contenu = $_POST(['contenu']);					
			$time = time();
			$q = array(
					'titre'=>$titre,
					'contenu'=>$contenu,
					'timestamp'=>$time()
			);
			if (isset($_GET['modifier_news'])) { // Si on demande de modifier une news.
				
				// On récupère les informations de la news correspondante.
				$sql = $cnx->query('SELECT * FROM news WHERE id=\'' . $_GET['modifier_news'] . '\'');
				while($donnees = $sql->fetch()){
					// On place le titre et le contenu dans des variables simples.
					$titre = stripslashes($donnees['titre']);
					$contenu = stripslashes($donnees['contenu']);
					$id_news = $donnees['id']; // Cette variable va servir pour se souvenir que cest une modification.
				}
				if(isset($_POST['titre']) AND isset($_POST['contenu'])){
					$sql2= "UPDATE news SET titre=?,contenu=?, timestamp=? WHERE id='" . $_POST['id_news'] . "' ";
					$req2 = $cnx->prepare($sql2);
					$req2->execute($q);
				}
			}
			else {// on rédige une news
				if(isset($_POST['titre']) AND isset($_POST['contenu'])){
					$id_news = '';
					$req = $cnx->prepare('INSERT INTO news (titre, contenu, timestamp) VALUES (:titre, :contenu, :timestamp)');
					$req->execute($q);
				}
			}
			?>
			
			<form action="rediger_news.php" method="post">
			<p>Titre : <input type="text" size="30" name="titre" value="<?php echo $titre; ?>" /></p>
			<p>
			Contenu :<br />
			<textarea name="contenu" cols="50" rows="10">
			<?php echo $contenu; ?>
			</textarea><br />
			<input type="hidden" name="id_news" value="<?php echo $id_news; ?>" />
			<input type="submit" value="Envoyer" />
			</p>
			</form>
		</body>
	</html>
Pourquoi n'apparaissent-ils pas ???

Re: Problème requètes PDO

par xTG » 24 août 2014, 20:04

La coloration syntaxique est là pour aider. ;)
$sql2= 'UPDATE news SET "titre"=:titre,"contenu"=:contenu, "timestamp"=:timestamp WHERE id='" . $_POST['id_news'] . " ' ';
$sql2= 'UPDATE news SET "titre"=:titre,"contenu"=:contenu, "timestamp"=:timestamp WHERE id="' . $_POST['id_news'] . '"';
Cependant... Pourquoi injecter directement id_news et pas timestamp...
Pour question de sécurité tu devrais faire la même chose pour id_news.
Sinon ton site sera à la merci de n'importe quel méchant développeur.

Tu as PDO::quote() pour protéger les variables à injecter dans PDO::query.
Tu peux sinon utiliser des requêtes préparées (voir PDO::prepare dans la documentation).

C'est à appliquer sur toutes tes autres requêtes qui offrent le même niveau de vulnérabilité. ;)

Re: Problème requètes PDO

par hunomina972 » 24 août 2014, 16:59

Bon alors sur mon localhost, sa me met
Parse error: syntax error, unexpected '"' in C:\wamp\www\rediger_news2.php on line 50
et la ligne 50 et celle ci mais je ne vois pas l'erreur...
$sql2= 'UPDATE news SET "titre"=:titre,"contenu"=:contenu, "timestamp"=:timestamp WHERE id='" . $_POST['id_news'] . " ' ';
C'est une ligne assez chiante à écrire vu le nombre de guillemet d'ou l'erreur apparemment. Quelle est la solution et/ou peut-on remplacer la ligne par :
$sql2= 'UPDATE news SET "titre"=:titre,"contenu"=:contenu, "timestamp"=:timestamp WHERE id=$_POST["id_news"] ';

J'ai donc essayer et ça me met ça :
Fatal error: Function name must be a string in C:\wamp\www\rediger_news2.php on line 31
et la ligne 31 et ça :
$titre = $_POST(['titre']);
Franchement je ne comprend plus rien !!! Au secours !!! :!: :cry: :!:

Re: Problème requètes PDO

par hunomina972 » 24 août 2014, 16:42

Wamp je l'ai mais je n'est pas encore tester avec ce code (pas envie) mais je vais devoir le faire à ce qui parait. Je teste puis vous donne les erreurs si elles s'affiche ;)

Re: Problème requètes PDO

par xTG » 24 août 2014, 16:37

Je l'ai mis comme ça :
<?php function error_reporting(E_ALL); ?>
et comme ça :
<?php error_reporting(E_ALL); ?>
mais ça ne m'affiche rien. Comment je fais ???
La seconde écriture est correcte.
Si malgré le rajout de ce code tu n'as pas d'affichage d'erreur c'est que ton hébergeur a désactivé la fonction...
Et trouver des bugs sans les bons outils...

Installes toi un serveur de développement sur ton ordinateur pour tester ton code.
Tu peux trouver des solutions tout en un avec WAMP ou EasyPHP par exemple.

Re: Problème requètes PDO

par hunomina972 » 24 août 2014, 12:34

Bon alors, j'ai changer le code, les modification et les création sont maintenant appliquées a partir de rediger_news.php car c'etait un peu tirer par les cheveux de le faire comme ça donc maintenant ça donne :
rediger_news.php
<!DOCTYPE html PUBLIC>
	<html>
		<head>
			<title>Rédiger une news</title>
			<meta charset="utf-8">
			<style type="text/css">
			h3, form
			{
			text-align:center;
			}
			a {
				text-decoration:underline;
				color:black;
			}
			a:hover{
				color:blue; 
			}
			</style>
		</head>
		<body>
			<h3><a href="liste_news.php">Retour à la liste des news</a></h3>
			<?php
			try {
				$cnx = new PDO('');
				$cnx-> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
			} catch (PDOException $e) {
				echo '<code>'.$e->getMessage().'<br />'.$e->getTraceAsString(),'</code>';
			}
			$titre = $_POST(['titre']);
			$contenu = $_POST(['contenu']);					
			$time = time();
			$q = array(
					'titre'=>$titre,
					'contenu'=>$contenu,
					'timestamp'=>$time
			);
			if (isset($_GET['modifier_news'])) { // Si on demande de modifier une news.
				
				// On récupère les informations de la news correspondante.
				$sql = $cnx->query('SELECT * FROM news WHERE id=\'' . $_GET['modifier_news'] . '\'');
				while($donnees = $sql->fetch()){
					// On place le titre et le contenu dans des variables simples.
					$titre = stripslashes($donnees['titre']);
					$contenu = stripslashes($donnees['contenu']);
					$id_news = $donnees['id']; // Cette variable va servir pour se souvenir que cest une modification.
				}
				if(isset($_POST['titre']) AND isset($_POST['contenu'])){
					$sql2= 'UPDATE news SET "titre"=:titre,"contenu"=:contenu, "timestamp"=:timestamp WHERE id='" . $_POST['id_news'] . " ' ';
					$req2 = $cnx->prepare($sql2);
					$req2->execute($q);
				}
			}
			else {// C est qu'on rédige une nouvelle news.
				if(isset($_POST['titre']) AND isset($_POST['contenu'])){
					$id_news = 0;
					$req = $cnx->prepare('INSERT INTO news (titre, contenu, timestamp) VALUES (:titre, :contenu, :timestamp)');
					$req->execute($q);
				}
			}
			?>
			
			<form action="rediger_news.php" method="post">
			<p>Titre : <input type="text" size="30" name="titre" value="<?php echo $titre; ?>" /></p>
			<p>
			Contenu :<br />
			<textarea name="contenu" cols="50" rows="10">
			<?php echo $contenu; ?>
			</textarea><br />
			<input type="hidden" name="id_news" value="<?php echo $id_news; ?>" />
			<input type="submit" value="Envoyer" />
			</p>
			</form>
		</body>
	</html>
Il y a un assez gros bug, les formulaire ne s'affiche pas
Et liste_news.php devient :
<!DOCTYPE HTML>
	<html>
		<head>
			<meta charset="utf-8">
			<title>Liste news</title>
			<style type="text/css">
				th, td, table {
					border: 1px solid black; }
				a {
					text-decoration:underline;
					color:black;
				}
				a:hover{
					color:blue; 
				}
			</style>
		</head>
		<body>
		<center><h1><a href="rediger_news.php"> Ajouter une news </a></h1><hr/><br/><hr/><br/>
		
			<?php 
			try {
				$cnx = new PDO('');
				$cnx-> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
			} catch (PDOException $e) {
				echo '<code>'.$e->getMessage().'<br />'.$e->getTraceAsString(),'</code>';
			}
			if (isset($_GET['supprimer_news'])) {
				// Si l'on demande de supprimer une news.
				// Alors on supprime la news correspondante.
				// On protège la variable « id_news » pour éviter une faille SQL.
				$_GET['supprimer_news'] = addslashes($_GET['supprimer_news']);
				$req3 = $cnx->prepare('DELETE FROM news WHERE id=\'' .$_GET['supprimer_news'] . '\'');
				$req3->execute();
			}
			?>
			<table><tr>
			<th>Modifier</th>
			<th>Supprimer</th>
			<th>Titre</th>
			<th>Contenu</th>
			<th>Date</th>
			Liste des news du site !
			</tr>
			<?php
			$req4 = $cnx->query('SELECT * FROM news ORDER BY id DESC');
			while ($donnees = $req4->fetch()) // On fait une boucle pour lister les news.
			{
			?>
			<tr>
			<td><?php echo '<a href="rediger_news.php?modifier_news=' .
			$donnees['id'] . '">'; ?>Modifier</a></td>
			<td><?php echo '<a href="liste_news.php?supprimer_news=' .
			$donnees['id'] . '">'; ?>Supprimer</a></td>
			<td><?php echo stripslashes($donnees['titre']); ?></td>
			<td><?php echo stripslashes($donnees['contenu']); ?></td>
			<td><?php echo date('d/m/Y', $donnees['timestamp']); ?></td>
			</tr>
			<?php
			} // Fin de la boucle qui liste les news.
			?>
			</table>
			</center>
			</body>
			</html>
Elle marche apparement tres bien
Le probleme donc et que les formulaire de rediger_news.php ne s'affiche pas pourquoi ???

Re: Problème requètes PDO

par hunomina972 » 24 août 2014, 12:07

Je l'ai mis comme ça :
<?php function error_reporting(E_ALL); ?>
et comme ça :
<?php error_reporting(E_ALL); ?>
mais ça ne m'affiche rien. Comment je fais ???

Re: Problème requètes PDO

par hunomina972 » 24 août 2014, 11:08

No rage c'est bon. Ça ne m'affiche rien et la page ne marche toujours pas.

Re: Problème requètes PDO

par xTG » 24 août 2014, 10:57

Pour la troisième fois...
error_reporting(E_ALL);