Signaler

Activation des erreur PDO [Résolu]

Posez votre question flo39400 352Messages postés mardi 8 avril 2008Date d'inscription 22 novembre 2016 Dernière intervention - Dernière réponse le 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 
Utile
+0
moins plus
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                                                                 
Ajouter un commentaire
Utile
+0
moins plus
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 15406Messages postés mercredi 22 octobre 2003Date d'inscription ModérateurStatut 5 décembre 2016 Dernière intervention - 19 oct. 2016 à 15:34
sûrement...
Mais tu n'as pas répondu (pris en compte) mes autres questions/remarques ...
Répondre
flo39400 352Messages postés mardi 8 avril 2008Date d'inscription 22 novembre 2016 Dernière intervention - 19 oct. 2016 à 15:38
Si mais j'ai répondu avant de voir votre réponse... désolé :/
Répondre
Ajouter un commentaire
Utile
+0
moins plus
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());
}

?>
Ajouter un commentaire
Utile
+0
moins plus

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 352Messages postés mardi 8 avril 2008Date d'inscription 22 novembre 2016 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 .
Répondre
Ajouter un commentaire
Utile
+0
moins plus
Donc si j'ai bien compris le rowCount() je le remplace par fetchColumn() et avant je met un query(SELECT COUNT(*)
jordane45 15406Messages postés mercredi 22 octobre 2003Date d'inscription ModérateurStatut 5 décembre 2016 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);


Répondre
flo39400 352Messages postés mardi 8 avril 2008Date d'inscription 22 novembre 2016 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 :/
Répondre
Ajouter un commentaire
Utile
+0
moins plus
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 352Messages postés mardi 8 avril 2008Date d'inscription 22 novembre 2016 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.
Répondre
jordane45 15406Messages postés mercredi 22 octobre 2003Date d'inscription ModérateurStatut 5 décembre 2016 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)
Répondre
flo39400 352Messages postés mardi 8 avril 2008Date d'inscription 22 novembre 2016 Dernière intervention - 20 oct. 2016 à 15:47
je vais tester ça bon je me heurte a un autre problème... :/
Répondre
flo39400 352Messages postés mardi 8 avril 2008Date d'inscription 22 novembre 2016 Dernière intervention jordane45 - 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.
Répondre
flo39400 352Messages postés mardi 8 avril 2008Date d'inscription 22 novembre 2016 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
Répondre
Ajouter un commentaire

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !