[RESOLU] Problème requètes PDO

Eléphant du PHP | 88 Messages

23 août 2014, 14:34

Bonjours à tous. Depuis quelque temps j'essaye de mettre en place un système de news sur mon site. Les news peuvent être ajouter depuis le navigateur par l'utilisateur après identification (.htaccess). Le problème n'est pas là. L'affichage marche très bien cependant ce sont les pages d'ajout/de modification et de listage des news qui ne marchent pas. Le problème : les requêtes PDO je suppose car lorsque je les met en commentaire et que j'actualise le site, il s'affiche. Voici donc les deux pages en questions :

La page de listage :
<!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($_POST['titre']) AND isset($_POST['contenu'])) {
				$titre = addslashes($_POST(['titre']);
				$contenu = addslashes($_POST(['contenu']);
				$q= array(
							'titre'=>$titre,
							'contenu'=>$contenu,
							'timestamp'=>time()
							);
				// modif ou non ???
				
				if ($_POST['id_news'] == 0) {
				// ce n est pas une modif
					$req = $cnx->prepare('INSERT INTO news (titre, contenu, timestamp) VALUES (:titre, :contenu, :timestamp) WHERE id='" . $_POST['id_news'] . "'');
					$req->execute($q);
				}
				//c'est une modif
				else{
					$_POST['id_news'] = addslashes($_POST['id_news']);
					$sql= 'UPDATE news SET titre="$titre",contenu="$contenu", timestamp="time()" WHERE id='" . $_POST['id_news'] . " ' ';
					$req2 = $cnx->prepare($sql);
					$req2->execute();
				}
			}*/
			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>
Ici la partie d'affichage fonctionne mais la vérification de modification et la modification ne fonctionnent pas (la partie en commentaire)

Et cette page est la page où l'on peut modifier ou ajouter les news(tout depend de la valeur de id_news envoyer par la page de listage). Le code également en commentaire et la source des erreurs :
<!DOCTYPE html PUBLIC>
	<html>
		<head>
			<title>Rédiger une news</title>
			<meta charset="utf-8">
			<style type="text/css">
			h3, form
			{
			text-align:center;
			}
			</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>';
			}/*
			if (isset($_GET['modifier_news'])) { // Si on demande de modifier une news.
			
				// On protège la variable « modifier_news » pour éviter une faille SQL.
				$_GET['modifier_news'] = htmlspecialchars($_GET['modifier_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.
				
			}
			else // C est qu on rédige une nouvelle news.*/
			{
				// Les variables $titre et $contenu sont vides, puisque c est une nouvelle news.
				$titre = '';
				$contenu = '';
				$id_news = 0; // La variable vaut 0, donc on se souviendra que ce n'est pas une modification.
			}
			?>
			
			<form action="liste_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>
Voila les pages en questions, je demande donc votre aide pour résoudre mon problème et me sortir de ma détresse. Merci d'avance et bonne journée :D
Le temps donne sa légitimité à l'existence...

ViPHP
xTG
ViPHP | 7331 Messages

23 août 2014, 16:28

// On protège la variable « modifier_news » pour éviter une faille SQL.
                                $_GET['modifier_news'] = htmlspecialchars($_GET['modifier_news']));
Mais quelle horreur...
Utilises PDO::quote() ou bien des requêtes préparées.
htmlspecialchars comme son nom l'indique ne protège pas contre les injections SQL mais contre les injections XSS (code HTML interprété) et ne sert donc qu'à l'affichage. ;)

Si tu obtiens une page blanche quand tu exécutes le code c'est que tu as une erreur mais que le niveau d'affichage des erreurs du php.ini désactive leur affichage.
Tu peux utiliser la fonction error_reporting(E_ALL) en début de code pour les voir.
Ou bien regarder le fichier de log de ton serveur Apache.

Eléphant du PHP | 88 Messages

23 août 2014, 18:05

Je n'est pas placer ma question dans "PHP Débutant" pour rien... C'est parce que je ne suis pas un as loin de là. Ensuite, ces code ne sont pas essentiellement de moi. Je m'en sert cependant. En ce qui concerne htmlspecialchars c'est de ma faute je n'ai pas fait attention merci de me le faire remarquer. Je vais donc essayé de modifié le code pour que celui-ci fonctionne. Et je vous tiens au courant. En ce qui concerne maintenant les erreur PHP, étant un debutant je ne sais pas comment les activer. Faut-il juste ajouter quelque part "error_reporting(E_ALL)" dans le code avec autre chose ou faire autrement je ne le sais pas non plus. Merci de bien me repondre et je vous tiens au courant des nouveautés, MERCI :)
Le temps donne sa légitimité à l'existence...

Eléphant du PHP | 88 Messages

23 août 2014, 18:12

Alors pour la page de rédaction, j'ai trouvé c'est une erreur (dsl d'employer cette expression) CONNE, j'avais oublié de refermer le while a la ligne 31. Cependant la page des liste ne fonctionne toujours pas entièrement et je ne sais pas pourquoi ???
Le temps donne sa légitimité à l'existence...

ViPHP
xTG
ViPHP | 7331 Messages

23 août 2014, 20:39

Pour l'affichage des erreurs :
- soit tu modifies ton fichier php.ini pour renseigner/décommenter la variable error_reporting
- soit tu rajoutes l'appel à la fonction error_reporting(E_ALL); en début de page pour l'activer pour cette page

Eléphant du PHP | 88 Messages

23 août 2014, 21:49

C'est quoi le code pour le faire (au debut de la page) ???
Le temps donne sa légitimité à l'existence...

ViPHP
xTG
ViPHP | 7331 Messages

24 août 2014, 10:57

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

Eléphant du PHP | 88 Messages

24 août 2014, 11:08

No rage c'est bon. Ça ne m'affiche rien et la page ne marche toujours pas.
Le temps donne sa légitimité à l'existence...

Eléphant du PHP | 88 Messages

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 ???
Le temps donne sa légitimité à l'existence...

Eléphant du PHP | 88 Messages

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 ???
Le temps donne sa légitimité à l'existence...

ViPHP
xTG
ViPHP | 7331 Messages

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.

Eléphant du PHP | 88 Messages

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 ;)
Le temps donne sa légitimité à l'existence...

Eléphant du PHP | 88 Messages

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: :!:
Le temps donne sa légitimité à l'existence...

ViPHP
xTG
ViPHP | 7331 Messages

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é. ;)

Eléphant du PHP | 88 Messages

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 ???
Le temps donne sa légitimité à l'existence...