Page 1 sur 2

Problème existence id

Posté : 06 oct. 2015, 16:09
par Larker
Bonjour,

J'ai un système de news qui fonctionne correctement sauf en ce qui concerne l'url.
Elle s'affiche comme suit : monsite.com/accueil/?mod=news&id=1
Sauf que lorsque j'enlève le numéro de la news et que je mets une lettre ça m'envoie un message d'erreur donc j'aimerais savoir ce qu'il faut faire pour corriger ce problème s'il vous plait ?
Voici mon code :
<?php
// Stats visite news
$id_news = $_GET['id'];
$visitIpQuery = $bdd->query("SELECT ip FROM visite_news WHERE id_news=$id_news AND ip='".$_SERVER['REMOTE_ADDR']."'");
$visitIp = $visitIpQuery->fetch();
if($visitIpQuery->rowCount() == 0) {
	$bdd->query("INSERT INTO visite_news VALUE('', $id_news, '".$_SERVER['REMOTE_ADDR']."','".date('d\-n\-Y')."')");
	$newIpQuery = $bdd->query("SELECT * FROM visite_news WHERE ip='".$_SERVER['REMOTE_ADDR']."'");
}
?>

<div class="container_12">
	<div id="news-wrapper">
		<div id="news" class="page-news">    					
<?php
$getNewsQuery = $bdd->query("SELECT id, titre, posteur, resume, img, contenu, DATE_FORMAT(date, '%d/%m/%Y') AS date, active FROM `news` WHERE active=1 AND id=".$_GET['id']);
$getNews = $getNewsQuery->fetch();
?><?php if ($getNews['active'] == "1")
{
    echo '<h4 class="news-title">'.$getNews['titre'].'</h4>
				<div class="contenunewsviews">
					<div id="news-date">
						<i>Ajout&eacute; le '.$getNews['date'].', Par <strong>'.$getNews['posteur'].'</strong></i>
					</div>
					<div id="news-contenu">
					<span style="font-style:italic;padding-right:8px;">'.nl2br(stripslashes($getNews['resume'])).'</span>
					<div style="margin-top:-72px;line-height:normal;">
							'.nl2br(stripslashes($getNews['contenu'])).'					
					</div>
					</div>
				</div>
			
		'; 
}
else // SINON
{
echo '<script language="Javascript">
<!--
document.location.replace(\'?mod=accueil\');
// -->
</script>';
 } ?>	
	</div>
	</div>
</div>
Et voici l'erreur :
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'jhjhj' in 'where clause'' in /public_html/accueil/modules/module-news.php:4 Stack trace: #0 /public_html/accueil/modules/module-news.php(4): PDO->query('SELECT ip FROM ...') #1 /public_html/accueil/html_base/page_html.php(338): require('/public_html/ac...') #2 /public_html/accueil/index.php(69): require('/public_html/ac...') #3 {main} thrown in /public_html/accueil/modules/module-news.php on line 4

Merci d'avance à ceux qui m'aideront.

Re: Problème existence id

Posté : 06 oct. 2015, 16:17
par or 1
dans un tel cas, il vaux mieux utiliser les requetes préparées de pdo, ainsi plus besoin de vérifier que $id_news est bien un entier, car c'est sujet aux injections sql.

Re: Problème existence id

Posté : 06 oct. 2015, 16:29
par Larker
On me parle souvent de requête préparé, tu peux me donner un exemple stp car je ne vois pas trop ce que ça signifie.

Merci

Re: Problème existence id

Posté : 06 oct. 2015, 20:45
par @rthur
On me parle souvent de requête préparé, tu peux me donner un exemple stp car je ne vois pas trop ce que ça signifie.
Google est ton ami :-)
Ou la doc PHP sinon : http://php.net/manual/fr/pdo.prepared-statements.php

Re: Problème existence id

Posté : 08 oct. 2015, 22:00
par Larker
D'accord merci.
Par contre je croyais que les requêtes préparées étaient uniquement valable pour l'envoie de formulaire avec insertion dans la bdd. Je ne vois pas exactement comment faire pour sélectionner dans une table ?

Re: Problème existence id

Posté : 09 oct. 2015, 00:19
par @rthur
Il y a pourtant un exemple dans la doc dont je t'ai donné le lien avec un SELECT ;-)

Re: Problème existence id

Posté : 09 oct. 2015, 13:45
par Larker
Ah oui donc si je comprends bien, ceci est une requête préparée ?
<?php
$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?");
if ($stmt->execute(array($_GET['name']))) {
  while ($row = $stmt->fetch()) {
    print_r($row);
  }
}
?>
Si je l'applique à la requête de ma news :
<?php
$getNewsQuery = $bdd->query("SELECT id, titre, posteur, resume, img, contenu, DATE_FORMAT(date, '%d/%m/%Y') AS date, active FROM `news` WHERE active=1 AND id=".$_GET['id']);
$getNews = $getNewsQuery->fetch();
?>
<?php
$stmt = $bdd->prepare(" id, titre, posteur, resume, img, contenu, DATE_FORMAT(date, '%d/%m/%Y') AS date, active FROM `news` WHERE active=1 AND id=".$_GET['id']);
if ($stmt->execute(array($_GET['id']))) {
  while ($row = $stmt->fetch()) {
    print_r($row);
  }
}
?>
Concrètement, je ne vois pas quoi mettre dans l'array présent dans le execute ?

Re: Problème existence id

Posté : 09 oct. 2015, 15:15
par Larker
Plutôt comme ça.
<?php
    $stmt = $bdd->prepare("SELECT id, titre, posteur, resume, img, contenu, DATE_FORMAT(date, '%d/%m/%Y') AS date, active FROM news WHERE active=1 AND id = :id");
    $stmt->bindValue(':id',$_GET['id'],PDO::PARAM_INT);
    if (!$stmt->execute()) {
        echo 'ERREUR';
        exit; //pas obligatoire
    }
?>
Est ce que ça vous parait correct ?

Re: Problème existence id

Posté : 09 oct. 2015, 16:47
par @rthur
Teste là pour vérifier qu'elle fonctionne, mais c'est tout à fait ça.

Re: Problème existence id

Posté : 09 oct. 2015, 16:58
par Larker
Oui ça fonctionne ! :)

Maintenant j'essaie pour l'envoie de formulaire mais je galère un peu je dois dire.

Voici ma requête actuelle :
$id_news = $_GET['id'];
$visitIpQuery = $bdd->query("SELECT ip FROM visite_news WHERE id_news=$id_news AND ip='".$_SERVER['REMOTE_ADDR']."'");
$visitIp = $visitIpQuery->fetch();
if($visitIpQuery->rowCount() == 0) {
	$bdd->query("INSERT INTO visite_news VALUE('', $id_news, '".$_SERVER['REMOTE_ADDR']."','".date('d\-n\-Y')."')");
	$newIpQuery = $bdd->query("SELECT * FROM visite_news WHERE ip='".$_SERVER['REMOTE_ADDR']."'");
}
?>
Et voici en requête préparée :
$id_news = $_GET['id'];
    $visitIpQuery = $bdd->prepare("SELECT ip FROM visite_news WHERE id_news = :id AND ip='".$_SERVER['REMOTE_ADDR']."'");
    $visitIpQuery->bindValue(':id',$_GET['id'],PDO::PARAM_INT);
    if (!$visitIpQuery->execute()) {
        echo 'ERREUR';
        exit; //pas obligatoire
    }
    $visiteur = $visitIpQuery->fetch();
    $visitIpQuery->closeCursor;
if($visitIpQuery->rowCount() == 0) {
    $stmt= $bdd->prepare("INSERT INTO visite_news (id_news, ip, date) VALUES (?, ?, ?)");
    $stmt->bindParam(1, $id_news);
    $stmt->bindParam(2, $ip);
    $stmt->bindParam(3, $date);
    // insertion d'une ligne
    $id_news = $_GET['id'];
    $value = 1;
    $stmt->execute();
    // insertion d'une autre ligne avec différentes valeurs
    $ip = $_SERVER['REMOTE_ADDR'];
    $value = 2;
    $stmt->execute();
    // insertion d'une autre ligne avec différentes valeurs
    $date = date('d\-n\-Y');
    $value = 3;
    $stmt->execute();
?>

Re: Problème existence id

Posté : 09 oct. 2015, 17:02
par @rthur
et ?

Re: Problème existence id

Posté : 09 oct. 2015, 17:07
par Larker
Je voulais savoir si c'était correct car ça me parait un peu bizarre ?

Re: Problème existence id

Posté : 09 oct. 2015, 18:58
par @rthur
Bah teste le... et tu verras bien si ça marche.
Si ça ne marche pas, dis nous ce qui te parait bizarre.

Re: Problème existence id

Posté : 09 oct. 2015, 19:05
par Larker
Au niveau du code ça te parait correct ?

Quand je le teste ça me retourne une erreur : Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'ip' cannot be null' in /public_html/accueil/modules/module-news.php:24 Stack trace: #0 /public_html/accueil/modules/module-news.php(24): PDOStatement->execute() #1 /public_html/accueil/html_base/page_html.php(338): require('/public_html/ac...') #2 /public_html/accueil/index.php(69): require('/public_html/ac...') #3 {main} thrown in /public_html/accueil/modules/module-news.php on line 24

Re: Problème existence id

Posté : 10 oct. 2015, 20:02
par Larker
Du coup j'ai corrigé pour quelque chose qui fonctionne à part que ça m'insère 2 fois la news qui est consulté dans la table :
$id_news = $_GET['id'];
    $visitIpQuery = $bdd->prepare("SELECT ip FROM visite_news WHERE id_news = :id AND ip='".$_SERVER['REMOTE_ADDR']."'");
    $visitIpQuery->bindValue(':id',$_GET['id'],PDO::PARAM_INT);
    if (!$visitIpQuery->execute()) {
        echo 'ERREUR';
        exit; //pas obligatoire
    }
    $visiteur = $visitIpQuery->fetch();
	$visitIpQuery->closeCursor;
if($visitIpQuery->rowCount() == 0) {
$req = $bdd->prepare('INSERT INTO visite_news(id_news, ip, date) VALUES(:id_film, :ip, :date)');
$req->execute(array(
	'id_news' => $id_news,
	'ip' => $_SERVER['REMOTE_ADDR'],
	'date' => date('d\-n\-Y')
    ));
}