Activation des erreur PDO [Résolu/Fermé]

flo39400 586 Messages postés mardi 8 avril 2008Date d'inscription 10 décembre 2017 Dernière intervention - 19 oct. 2016 à 15:18 - Dernière réponse : flo39400 586 Messages postés mardi 8 avril 2008Date d'inscription 10 décembre 2017 Dernière intervention
- 20 oct. 2016 à 15:50
Bonjour,

Je viens d'activé les erreur PDO mais la je bloque je sais pas pourquoi sa bloque la dessus.

Merci d'avance de votre réponse.

<?php
include("CObdd.php");
include_once('cookieconnect.php');
include('/ban_site/bann_ip.php');
$message_site = $bdd->query("SELECT * FROM site WHERE id = 1");
$mess = $message_site->fetch();
?>
<!DOCTYPE html>

<html>
 <head>
  <title>Bienvenue <?php if(!empty($_SESSION['id'])) { echo $_SESSION['pseudo']; } else {?> uttilisateur <?php } ?></title>
  <link rel="stylesheet" type="text/css" href="style.css">
  <meta charset="utf-8">
 </head>
<?php
if($statut['statut_ip'] == 1)
{
 include("menu.php");
?>
 <body>

 <header class="message">
 <h1><?= $mess['sujet'] ?></h1>
 </header>


 
<?php
include('baspage.php');
?>

<?php
}
else
{
?>
<p align="center"><br/><br/>L'adresse <a href="https://fr.wikipedia.org/wiki/Adresse_IP" rel="nofollow noopener noreferrer" target="_blank">IP</a> de votre <a href="https://fr.wikipedia.org/wiki/Fournisseur_d%27acc%C3%A8s_%C3%A0_Internet" rel="nofollow noopener noreferrer" target="_blank">FAI</a> a était bloquer,<br/> a cause d'un problème grave contre notre site internet.<br/><br/><br/>
Si cela vous semble être une erreur veuilliez contacter l'administrateur a cette adresse:<br/> <a href="mailto:?to=xxxxx@gmail.com" rel="nofollow noopener noreferrer" target="_blank" />xxxxx@gmail.com</a></p>
<?php
}
  
?>
 
 </body>
</html>


Code afficher: Fatal error: Cannot use object of type stdClass as array in C:\wamp64\www\2017\index.php on line 17

Donc surement la variable $statut['statut_ip'] donc voila le ficher qui définie celle-ci:

<?php
$user_ip = $_SERVER['REMOTE_ADDR'];


$req_ip_exist = $bdd->prepare('SELECT * FROM bann_ip WHERE uttilisateur_ip = ?');
$req_ip_exist->execute(array($user_ip));
$ip_existe = $req_ip_exist->rowCount();

if($ip_existe == 0)
{
 $add_ip = $bdd->prepare('INSERT INTO bann_ip(uttilisateur_ip, date_time_co) VALUES(?, NOW())');
 $add_ip->execute(array($user_ip));
}
else
{
 $update_ip = $bdd->prepare('UPDATE bann_ip SET date_time_co = NOW() WHERE uttilisateur_ip = ?');
 $update_ip->execute(array($_SERVER['REMOTE_ADDR']));
} 

$req_statut = $bdd->prepare('SELECT statut_ip FROM bann_ip WHERE uttilisateur_ip = ?');
$req_statut->execute(array($user_ip));

$statut = $req_statut->fetch();


/* if($statut['statut_ip'] == 1)
{
 echo "Adresse IP normal";
}
else
{
 echo "Votre IP est banni ! Contacter l'administrateur !";
} */

?>




Afficher la suite 
586Messages postés mardi 8 avril 2008Date d'inscription 10 décembre 2017 Dernière intervention

17 réponses

jordane45 19214 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - 19 oct. 2016 à 15:25
0
Utile
Plusieurs choses :

Que contient ton fichier include("CObdd.php"); ?

Pense aussi à ajouter les bloc TRY/CATCH à chaque requête

et surtout .....

N'utilise pas rowCount()

--
Cordialement, 
Jordane                                                                 
flo39400 586 Messages postés mardi 8 avril 2008Date d'inscription 10 décembre 2017 Dernière intervention - 19 oct. 2016 à 15:31
0
Utile
2
D'après ce que je voie je me dit que l'erreur viens de la:

$req_statut = $bdd->prepare('SELECT statut_ip FROM bann_ip WHERE uttilisateur_ip = ?');
$req_statut->execute(array($user_ip));

$statut = $req_statut->fetch();
jordane45 19214 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - 19 oct. 2016 à 15:34
sûrement...
Mais tu n'as pas répondu (pris en compte) mes autres questions/remarques ...
flo39400 586 Messages postés mardi 8 avril 2008Date d'inscription 10 décembre 2017 Dernière intervention - 19 oct. 2016 à 15:38
Si mais j'ai répondu avant de voir votre réponse... désolé :/
flo39400 586 Messages postés mardi 8 avril 2008Date d'inscription 10 décembre 2017 Dernière intervention - Modifié par flo39400 le 19/10/2016 à 15:36
0
Utile
Try/Catch ? J'ai jamais utiliser ça.

J'ai utiliser rowCount() car sur les tuto que je regarde il l’utilise voila pourquoi vu que le code fonctionner je me suis dit super ça marche.

Alors j'ai mis pleins de truc comme ça partout...

La galère alors...

CObdd.php donc la je me connecte a ma base de données.

<?php
session_start();
try{
$bdd = new PDO('mysql:host=127.0.0.1;dbname=ma_base_news; charset=utf8', 'root', '');
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
} catch(PDOException $e) {
	die('Erreur : ' . $e->getMessage());
}

?>
jordane45 19214 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - 19 oct. 2016 à 15:43
0
Utile
1

J'ai utiliser rowCount() car sur les tuto que je regarde il l’utilise voila pourquoi vu que le code fonctionner je me suis dit super ça marche.

Alors j'ai mis pleins de truc comme ça partout...

... dans ta question précédente... (que nous venons de traiter....) il était déjà question de ça.
http://www.commentcamarche.net/forum/affich-34010808-compte-le-nombre-de-commentaire#1

Ce n'est pas parce-que certaines personnes ne savent pas lire le manuel PHP et marquent n'importe quoi dans leurs pseudo tutos qu'il faut bêtement faire les mêmes erreurs....


Try/Catch ? J'ai jamais utiliser ça.

C'est dans le lien sur l'activation des erreurs PDO que je t'ai donné...
http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs

et puis... si il y a quelque chose que tu ne sais pas faire (ou ne comprend pas).. tu as la possibilité de trouver les infos dans le manuel php :
Par exemple : http://php.net/manual/fr/language.exceptions.php

Vu qu'on en est aux bonnes pratiques.... un bloc IF / ELSE .. la norme PSR2 propose de l'écrire comme ceci :
if(condition){
  //action si vrai

}else{
  //action si faux

}

Ce n'est pas une obligation bien sûr... mais je trouve ça plus lisible...
Lien vers la norme PS2 : http://www.php-fig.org/psr/psr-2/
flo39400 586 Messages postés mardi 8 avril 2008Date d'inscription 10 décembre 2017 Dernière intervention - 19 oct. 2016 à 16:14
J'arrive a utiliser if et else.
Mais je les écrit souvent comme ça:

if(condition)
{
// action si vrai
}
else
{
//action si faux
}


Après si vous me dites que sais mieux de faire comme ça bas je le ferrai.


Donc TRY/CATCH sert a traquer les erreur dans le code.

Si un des bloque pose problème ça m'indiquera un message associé, comme ça je saurai d’où vient l'erreur directement .
flo39400 586 Messages postés mardi 8 avril 2008Date d'inscription 10 décembre 2017 Dernière intervention - 19 oct. 2016 à 15:44
0
Utile
2
Donc si j'ai bien compris le rowCount() je le remplace par fetchColumn() et avant je met un query(SELECT COUNT(*)
jordane45 19214 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - 19 oct. 2016 à 15:48
par exemple.

Tu peux aussi faire un fetchAll
puis faire un COUNT dessus

par exemple :

$sql = "SELECT * FROM tatable WHERE tesconditions..";
try{
   $prep  = $bdd->prepare($sql);
   $prep->execute();
}catch(Exception $e){
  echo "Erreur : ".$e->getMessage();
}

$result = $prep->fetchAll();
$nbRows = count($result);


flo39400 586 Messages postés mardi 8 avril 2008Date d'inscription 10 décembre 2017 Dernière intervention - 19 oct. 2016 à 16:08
Merci pour tous cela, mais je doit me documenté sur l’utilisation des prepare, query et les requêtes associé car je sais pas quand les utiliser.

Et aussi savoir quand utiliser fetch, fetchAll, fetchColumn(), execute,.....

Car vraiment c'est handicapent de devoir a chaque fois demander de l'aide et comme sais compliquer de trouver des choses a jours.

Le manuel Php le problème sais que je comprend pas les exemple données donc je suis souvent a la rue :/
flo39400 586 Messages postés mardi 8 avril 2008Date d'inscription 10 décembre 2017 Dernière intervention - 20 oct. 2016 à 14:40
0
Utile
6
Bonjour, voila je viens de travailler sur mon code voici les modifications apporter:

<?php
$user_ip = $_SERVER['REMOTE_ADDR'];
$sql1 = "SELECT * FROM bann_ip WHERE uttilisateur_ip = ?";
try{
   $prep1  = $bdd->prepare($sql1);
   $prep1->execute(array($user_ip));
}catch(Exception $e1){
  echo "Erreur : ".$e1->getMessage();
}

$result1 = $prep1->fetchAll();
$ip_existe = count($result1);


if($ip_existe == 0)
{
	
	$sql2 = "INSERT INTO bann_ip(uttilisateur_ip, date_time_co) VALUES(?, NOW())";
	try{
		$prep2 = $bdd->prepare($sql2);
		$prep2->execute(array($user_ip));
		}catch(Exception $e2){
		echo "Erreur : ".$e2->getMessage();
		}
}
else
{
	$update_ip = "UPDATE bann_ip SET date_time_co = NOW() WHERE uttilisateur_ip = ?";
	try{
		$update_ip_prep = $bdd->prepare($update_ip);
		$update_ip_prep->execute(array($_SERVER['REMOTE_ADDR']));
	}catch(Exception $e3){
		echo "Erreur : ".$e3->getMessage();
		}
} 


$req_statut = "SELECT statut_ip FROM bann_ip WHERE uttilisateur_ip = ?";
try{
	$prep_req_statut = $bdd->prepare($req_statut);
	$prep_req_statut->execute(array($user_ip));
}catch(Exception $e4){
		echo "Erreur : ".$e4->getMessage();
		}
$statut = $prep_req_statut->fetch();
?>
flo39400 586 Messages postés mardi 8 avril 2008Date d'inscription 10 décembre 2017 Dernière intervention - 20 oct. 2016 à 15:07
A ok merci, euh sais bon j'ai trouvé le problème ça vient de fetch, la je suis trop contant car j'ai trouvé en cherchant tout seul :D

<?php
$user_ip = $_SERVER['REMOTE_ADDR'];

$sql1 = "SELECT * FROM bann_ip WHERE uttilisateur_ip = ?";
try{
   $prep1  = $bdd->prepare($sql1);
   $prep1->execute(array($user_ip));
}catch(Exception $e1){
  echo "Erreur : ".$e1->getMessage();
}

$result1 = $prep1->fetchAll();
$ip_existe = count($result1);


if($ip_existe == 0)
{
	
	$sql2 = "INSERT INTO bann_ip(uttilisateur_ip, date_time_co) VALUES(?, NOW())";
	try{
		$prep2 = $bdd->prepare($sql2);
		$prep2->execute(array($user_ip));
		}catch(Exception $e2){
		echo "Erreur : ".$e2->getMessage();
		}
	
}
else
{
	$update_ip = "UPDATE bann_ip SET date_time_co = NOW() WHERE uttilisateur_ip = ?";
	try{
		$update_ip_prep = $bdd->prepare($update_ip);
		$update_ip_prep->execute(array($_SERVER['REMOTE_ADDR']));
	}catch(Exception $e3){
		echo "Erreur : ".$e3->getMessage();
		}
	
} 


$req_statut = "SELECT statut_ip FROM bann_ip WHERE uttilisateur_ip = ?";
try{
	$prep_req_statut = $bdd->prepare($req_statut);
	$prep_req_statut->execute(array($user_ip));
}catch(Exception $e4){
		echo "Erreur : ".$e4->getMessage();
		}
$statut = $prep_req_statut->fetch(PDO::FETCH_ASSOC);


?>


Donc faut ajouter ça: PDO::FETCH_ASSOC a la méthode fetch je sais pas ce que sais mais ça fonctionne mieux car pu de message d'erreur.
jordane45 19214 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention > flo39400 586 Messages postés mardi 8 avril 2008Date d'inscription 10 décembre 2017 Dernière intervention - 20 oct. 2016 à 15:25
Il suffisait de le modifier ici (dans la connexion à ta BDD)
$bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ)

par :
$bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC)
flo39400 586 Messages postés mardi 8 avril 2008Date d'inscription 10 décembre 2017 Dernière intervention > jordane45 19214 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - 20 oct. 2016 à 15:47
je vais tester ça bon je me heurte a un autre problème... :/
flo39400 586 Messages postés mardi 8 avril 2008Date d'inscription 10 décembre 2017 Dernière intervention > jordane45 19214 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - 20 oct. 2016 à 15:50
Merci pour ce complément de réponse ça ma beaucoup aider :)
Bon je modifie tous le code avec des try et catch.

Normalement ça devrait aller maintenant.
flo39400 586 Messages postés mardi 8 avril 2008Date d'inscription 10 décembre 2017 Dernière intervention - 20 oct. 2016 à 15:16
Pour info:

PDO::FETCH_BOTH (mode par défaut) équivaut à mysql_fetch_array : chaque valeur d'une ligne est présente deux fois sous deux clés différentes : le nom de la colonne correspondante et son index dans le jeu de résultat (0 pour la première, 1 pour la seconde, etc)
PDO::FETCH_ASSOC équivaut à mysql_fetch_assoc : chaque valeur d'une ligne n'est présente qu'une fois via le nom de la colonne correspondante
PDO::FETCH_NUM équivaut à mysql_fetch_row : les valeurs d'une ligne ne sont que numériquement indexées