Problème existence id

Eléphant du PHP | 283 Messages

06 oct. 2015, 16:09

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.

Mammouth du PHP | 2703 Messages

06 oct. 2015, 16:17

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.

Eléphant du PHP | 283 Messages

06 oct. 2015, 16:29

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

06 oct. 2015, 20:45

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
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 283 Messages

08 oct. 2015, 22:00

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 ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

09 oct. 2015, 00:19

Il y a pourtant un exemple dans la doc dont je t'ai donné le lien avec un SELECT ;-)
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 283 Messages

09 oct. 2015, 13:45

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 ?

Eléphant du PHP | 283 Messages

09 oct. 2015, 15:15

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 ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

09 oct. 2015, 16:47

Teste là pour vérifier qu'elle fonctionne, mais c'est tout à fait ça.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 283 Messages

09 oct. 2015, 16:58

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();
?>

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

09 oct. 2015, 17:02

et ?
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 283 Messages

09 oct. 2015, 17:07

Je voulais savoir si c'était correct car ça me parait un peu bizarre ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

09 oct. 2015, 18:58

Bah teste le... et tu verras bien si ça marche.
Si ça ne marche pas, dis nous ce qui te parait bizarre.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 283 Messages

09 oct. 2015, 19:05

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

Eléphant du PHP | 283 Messages

10 oct. 2015, 20:02

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')
    ));
}