[RESOLU] Afficher les erreurs ( PDO )

Eléphant du PHP | 79 Messages

03 mai 2013, 16:25

Bonjour à tous,
Voici mon problème, j'essaye actuellement de créer une pagination pour une galerie d'image ( php mysql (pdo)) et pour cela j'aurais besoin d'afficher mes erreurs.
Je pense être casiment sur qu'il faut que j'utilise la méthode try {} catch{} ( que je sais utiliser pour une connexion ) mais je ne pense pas l'avoir bien placé dans la situation suivante :
<?php
require_once("connexiondessins.inc.php");
  try
{
$imageparpage=12;
$retour = $bdd->prepare('SELECT COUNT(*) AS nb_images FROM dessins');
}
catch (Exception $e)
{
        die('Erreur : ' . $e->getMessage());
}
$retour->execute();

$dessins = $retour->fetch(PDO::FETCH_ASSOC);
$totaldesimages = $dessins['nb_images'];
 
$nombredepage  = ceil($totaldesimages/$imageparpage);
echo 'Page : ';
for ($i = 1 ; $i <= $nombredepage ; $i++)
{
    echo '<a href="sps.php?page=' . $i . '">' . $i . '</a> ';
}
if (isset($_GET['page']) && !is_numeric($_GET['page']))
{
        $page = intval($_GET['page']);
}
else
{
        $page = 1;
}
  try
{
$premiereimageafficher = $page* $imageparpage - $imageparpage;

$reponse = $bdd->prepare('SELECT id,categorie,titre,image,description FROM dessins WHERE categorie= :category ORDER BY id DESC LIMIT :offset, :nbimages');
}
catch (Exception $e)
{
        die('Erreur : ' . $e->getMessage());
}
$reponse->bindValue(':category', 'sps');
$reponse->bindParam(':nbimages', $imageparpage);
$reponse->bindParam(':offset', $premiereimageafficher);
 
$reponse->execute();
?>
<?php while ($dessins = $reponse->fetch()) { ?>
<div class="cat1">
  <?php echo '<span class="classtext1v">'.htmlspecialchars($dessins['categorie']).'</span>'; ?>
  <br />
  <?php echo '<span class="classtext2v">'.htmlspecialchars($dessins['titre']).'</span>'; ?>
  <br />
  <a href="selectionsps.php?id=<?php echo htmlspecialchars($dessins['id']); ?>"><img src="images/<?php echo htmlspecialchars($dessins['image']);?>" width="200" height="250" /></a>
</div>

<?php } $reponse->closeCursor(); ?> 
Un petit coup de main ne serais pas de refus :/ je suis perdu.
merci pour votre aide.
Sincèrement.
Créateur du site www.crobara2bal.com.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

03 mai 2013, 18:06

salut,


ajoute les execute, bind ou query dans les try

et ne met pas de die dans les catch, ils sont la pour récupérer l'excection et te permettre d'afficher correctement l'erreur.

dans ton cas, même si c'est pas super, tu peux très bien mettre un try { en première et le }catch .... après le close cursor.

dès que php rencontre une exception va dans le bloc catch sans exécuter le code après la ligne source d'erreur.

tu trouvera des exemple dans la doc http://php.net/manual/fr/language.exceptions.php, ainsi qu'un peu d'info sur le bloc finally qui sera disponible a partir de php 5.5


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 79 Messages

03 mai 2013, 18:29

Re merci pour ton aide moogli,
Je suis retourné sur le lien que tu ma donné, mais même après avoir corriger, les erreurs ne s'affiche toujours pas :/.
<?php
require_once("connexiondessins.inc.php");
  try
{
$imageparpage=12;
$retour = $bdd->prepare('SELECT COUNT(*) AS nb_images FROM dessins');

$retour->execute();
}
catch (Exception $e)
{
        echo 'Erreur : ',  $e->getMessage();
}
$dessins = $retour->fetch(PDO::FETCH_ASSOC);
$totaldesimages = $dessins['nb_images'];
 
$nombredepage  = ceil($totaldesimages/$imageparpage);
echo 'Page : ';
for ($i = 1 ; $i <= $nombredepage ; $i++)
{
    echo '<a href="sps.php?page=' . $i . '">' . $i . '</a> ';
}
if (isset($_GET['page']) && !is_numeric($_GET['page']))
{
        $page = intval($_GET['page']);
}
else
{
        $page = 1;
}
  try
{
$premiereimageafficher = $page* $imageparpage - $imageparpage;

$reponse = $bdd->prepare('SELECT id,categorie,titre,image,description FROM dessins WHERE categorie= :category ORDER BY id DESC LIMIT :offset, :nbimages');

$reponse->bindValue(':category', 'sps');
$reponse->bindParam(':nbimages', $imageparpage);
$reponse->bindParam(':offset', $premiereimageafficher);

$reponse->execute();
 }
catch (Exception $e)
{
        echo 'Erreur : ',  $e->getMessage();
}
?>
<?php while ($dessins = $reponse->fetch()) { ?>
<div class="cat1">
  <?php echo '<span class="classtext1v">'.htmlspecialchars($dessins['categorie']).'</span>'; ?>
  <br />
  <?php echo '<span class="classtext2v">'.htmlspecialchars($dessins['titre']).'</span>'; ?>
  <br />
  <a href="selectionsps.php?id=<?php echo htmlspecialchars($dessins['id']); ?>"><img src="images/<?php echo htmlspecialchars($dessins['image']);?>" width="200" height="250" /></a>
</div>

<?php } $reponse->closeCursor(); ?> 
Merci pour ton attention.
Sincèrement.
Créateur du site www.crobara2bal.com.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

03 mai 2013, 19:16

Et il y a des erreurs ? ;)

Tu peux essayer ce code
<?php
try {
throw new Exception (' exception test ');
}
catch (Exception $e) {
Echo 'erreur : '. $e->getMessage();
}
@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 79 Messages

04 mai 2013, 13:00

Bonjour moogli,
Tu peux essayer ce code
<?php
try {
throw new Exception (' exception test ');
}
catch (Exception $e) {
Echo 'erreur : '. $e->getMessage();
}
Ce code fonctionne !!
une erreur s'affiche effectivement ^^, Merci beaucoup pour ton aide moogli :) .
Sincèrement.
Créateur du site www.crobara2bal.com.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

04 mai 2013, 14:36

Donc du coup tu a une version de php qui connais le try catch ;)



Si rien ne s'affiche c'est que tu n'as pas de données ?


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 79 Messages

04 mai 2013, 16:32

Re,
Pourtant si il y a bien des données ^^, pour te donner la visualisation des données que je souhaite mettre (12 par 12 en pagination) voici mon une page de mon site contenant des les infos : http://crobara2bal.com/politique.php ( de la catégorie selection ) au total il y a 9 catégorie, je travail sur la page (catégorie) sps pour ne pas tout chambouler ^^.
Créateur du site www.crobara2bal.com.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

05 mai 2013, 17:36

ton code semble fonctionnel.

Perso je ferais plutot ainsi afin de limiter le code utilisé en cas d'erreur
<?php
require_once("connexiondessins.inc.php");
try {
	$imageparpage=12;
	$retour = $bdd->prepare('SELECT COUNT(*) AS nb_images FROM dessins');

	$retour->execute();

	$dessins = $retour->fetch(PDO::FETCH_ASSOC);
	$totaldesimages = $dessins['nb_images'];

	$nombredepage  = ceil($totaldesimages/$imageparpage);
	echo 'Page : ';
	for ($i = 1 ; $i <= $nombredepage ; $i++) {
		echo '<a href="sps.php?page=' . $i . '">' . $i . '</a> ';
	}
	if (isset($_GET['page']) && !is_numeric($_GET['page'])) {
		$page = intval($_GET['page']);
	}
	else {
		$page = 1;
	}

	$premiereimageafficher = $page* $imageparpage - $imageparpage;

	$reponse = $bdd->prepare('SELECT id,categorie,titre,image,description FROM dessins WHERE categorie= :category ORDER BY id DESC LIMIT <img src="http://forum.phpfrance.com/images/smilies/icon_surprised.gif" alt=":o" title="Surprised" />ffset, :nbimages');

	$reponse->bindValue(':category', 'sps');
	$reponse->bindParam(':nbimages', $imageparpage);
	$reponse->bindParam(':offset', $premiereimageafficher);

	$reponse->execute();

	while ($dessins = $reponse->fetch()) {

		echo '<div class="cat1">
		<span class="classtext1v">'.htmlspecialchars($dessins['categorie']).'</span>
		<br />
		<span class="classtext2v">'.htmlspecialchars($dessins['titre']).'</span>
		<br /> <a
		href="selectionsps.php?id='.htmlspecialchars($dessins['id']).'">
		<img src="images/'. htmlspecialchars($dessins['image']).' " width="200" height="250" /> </a>
		</div>';

	}
	$reponse->closeCursor();

}
catch (Exception $e) {
	echo 'Erreur : ',  $e->getMessage();
}
@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 79 Messages

05 mai 2013, 19:53

re,

Effectivement je pensais aussi au début utiliser try { une seul fois, mais il n'y à aucune erreur qui s'affiche, pourtant mes informations provenant de ma bdd ne s'affiche pas, je pense que s'en ai une :/( d'erreur ^^ ).

Merci pour ton soutien moogli,
Sincèrement.
Créateur du site www.crobara2bal.com.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

05 mai 2013, 20:46

Ton code semble bon :/


Si tu me donne les structures des tables et un jeux de données minimal je pourrais tester.

Est ce que la barre de navigation s'affiche ? (Le nombre de page et les liens).


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 79 Messages

06 mai 2013, 16:46

Bonjour moogli :),
Est ce que la barre de navigation s'affiche ? (Le nombre de page et les liens).
Oui, voici le lien de la page concerné : http://crobara2bal.com/sps.php?page=1 la pagination s'affiche sous la forme suivante : " Page : 123 ".
Si tu me donne les structures des tables et un jeux de données minimal je pourrais tester.
Voici la structure de ma tables dessins :
Structure de la table `dessins`
--

CREATE TABLE IF NOT EXISTS `dessins` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `categorie` varchar(100) NOT NULL,
  `titre` varchar(100) NOT NULL,
  `image` varchar(100) NOT NULL DEFAULT 'formationspsv.jpg',
  `description` text NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=119 ;
Concernant le code de ma page, j'ai repéré quelque petite erreur que j'ai corrigé, comme ['nb_images'] qui ne correspondait pas avec la seconde requête ['nbimage']

Voici mon code actuelle :
<?php
require_once("connexiondessins.inc.php");
try {

$retour=$bdd->prepare('SELECT COUNT(*) AS nbimages FROM dessins WHERE categorie="sps"');

$retour->execute();
$imageparpage=12;
$dess=$retour->fetch(PDO::FETCH_ASSOC);
$totaldesimages=$dess['nbimages'];
$nombredepage=ceil($totaldesimages/$imageparpage);

echo 'Page : ';
for ($i=1;$i<= $nombredepage;$i++)
{
    echo '<a href="sps.php?page=' . $i . '">' . $i . '</a> ';
}
if (isset($_GET['page']) && is_numeric($_GET['page']) && $_GET['page']>0 && $_GET['page']<= $nombredepage)
{
        $page=intval($_GET['page']);
}
else
{
        $page=1;
}

$premiereimageafficher=$page*$imageparpage-$imageparpage;

$reponse=$bdd->prepare('SELECT id,categorie,titre,image,description FROM dessins WHERE categorie= :category ORDER BY id DESC LIMIT :offset, :nbimages');

$reponse->bindValue(':category', 'sps');
$reponse->bindParam(':nbimages', $imageparpage);
$reponse->bindParam(':offset', $premiereimageafficher);

$reponse->execute();

?>
<?php while ($dessins=$reponse->fetch()) { ?>
<div class="cat1">
  <?php echo '<span class="classtext1v">'.htmlspecialchars($dessins['categorie']).'</span>'; ?>
  <br />
  <?php echo '<span class="classtext2v">'.htmlspecialchars($dessins['titre']).'</span>'; ?>
  <br />
  <a href="selectionsps.php?id=<?php echo htmlspecialchars($dessins['id']); ?>"><img src="images/<?php echo htmlspecialchars($dessins['image']);?>" width="200" height="250" /></a>
</div>

<?php  
}
        $reponse->closeCursor();

}
catch (Exception $e) {
        echo 'Erreur : ',  $e->getMessage();
} 
?>
Merci pour ton attention et de ton aide.
Sincèrement.
Créateur du site www.crobara2bal.com.

Eléphant du PHP | 79 Messages

07 mai 2013, 16:25

Bonjour,
Pour ma connexion, j'ai rajouter :
PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));
Ce qui ma déclenché une nouvelle erreur : Erreur : SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''0', '12'' at line 1

Ma ligne 1 dans ma page de code correspond au <!DOCTYPEHTML> :/ sauf si la ligne 1 correspond à ma premiere ligne de code php, c'est ma : require_one(connexiondessins.ini.php); qui est l'erreur :/.

Voici sa structure actuelle :
<?php
try
{
	$dns = 'mysql:host=localhost;dbname=dbname';
  $utilisateur = 'nomusers';
  $motDePasse = 'mdp';
  $bdd = new PDO( $dns, $utilisateur, $motDePasse, array (PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES utf8',PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));
}
catch (Exception $e)
{
        die('Erreur : ' . $e->getMessage());
}
?> 
Merci pour l'aide.
Sincèrement.
Créateur du site www.crobara2bal.com.

Eléphant du PHP | 79 Messages

08 mai 2013, 15:18

Bonjour à tous.
Je pense que l'erreur du coté code pagination suite à ce qu'il m'affiche sur la page : ''0', '12'' au lieu de '0,12' :/ un peu d'aide ne serais pas de refus ^^.
Merci pour votre attention et votre aide.
Créateur du site www.crobara2bal.com.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

08 mai 2013, 16:11

tu as un problème dû a l'utilisation intempestive des requêtes préparées.

dans ton code tu as
<?php
 $sql = 'SELECT id,categorie,titre,image,description FROM dessins
    WHERE categorie= :category ORDER BY id DESC LIMIT :offset, :nbimages';
    $reponse = $bdd->prepare($sql);

    $reponse->bindValue(':category', 'sps');
    $reponse->bindParam(':nbimages', $imageparpage);
    $reponse->bindParam(':offset', $premiereimageafficher);

    $reponse->execute();
or par défaut PDO bind des chaines de caractères donc le bindParam utilise '0' et '12' pour les paramètres de la limite qui n'accepte que des entiers du coup il y a une erreur.

J'ai juste ajouté une ligne dans le catch histoire d'avoir un peu plus d'info. mais le message d'erreur indiqué une erreur SQL.
<?php
 $sql = 'SELECT id,categorie,titre,image,description FROM dessins
    WHERE categorie= :category ORDER BY id DESC LIMIT :offset, :nbimages';
    $reponse = $bdd->prepare($sql);

    $reponse->bindValue(':category', 'sps');
    $reponse->bindParam(':nbimages', $imageparpage, \PDO::PARAM_INT);
    $reponse->bindParam(':offset', $premiereimageafficher, \PDO::PARAM_INT);

    $reponse->execute();
tu peux utiliser bindValue pour les 3 paramètres.

pour la première requête utilise query() directement plutôt qu'une requête préparée.

par exemple
<?php
require_once("connexiondessins.inc.php");
try {
    $dns = 'mysql:host=localhost;dbname=test';
    $utilisateur = 'test';
    $motDePasse = 'test';
    $bdd = new PDO($dns, $utilisateur, $motDePasse, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    $retour = $bdd->query('SELECT COUNT(*) AS nbimages FROM dessins WHERE categorie="sps"');
    $imageparpage = 12;
    $dess = $retour->fetch(PDO::FETCH_ASSOC);
    $totaldesimages = $dess['nbimages'];
    $nombredepage = ceil($totaldesimages / $imageparpage);

    echo 'Page : ';
    for ($i = 1; $i <= $nombredepage; $i++) {
        echo '<a href="sps.php?page=' . $i . '">' . $i . '</a> ';
    }
    if (isset($_GET['page']) && is_numeric($_GET['page']) && $_GET['page'] > 0 && $_GET['page'] <= $nombredepage) {
        $page = intval($_GET['page']);
    } else {
        $page = 1;
    }

    $premiereimageafficher = $page * $imageparpage - $imageparpage;
    $sql = 'SELECT id,categorie,titre,image,description FROM dessins
    WHERE categorie= :category ORDER BY id DESC LIMIT :offset, :nbimages';
    $reponse = $bdd->prepare($sql);

    $reponse->bindValue(':category', 'sps');
    $reponse->bindParam(':nbimages', $imageparpage, \PDO::PARAM_INT);
    $reponse->bindParam(':offset', $premiereimageafficher, \PDO::PARAM_INT);

    $reponse->execute();
    while ($dessins = $reponse->fetch()) {
        echo '
        <div class="cat1">
            <span class="classtext1v">' . htmlspecialchars($dessins['categorie']) . '</span>';
        echo '<br/>';
        echo '<span class="classtext2v">' . htmlspecialchars($dessins['titre']) . '</span>';
        echo '<br/>
            <a href="selectionsps.php?id=' . htmlspecialchars($dessins['id']) . '"><img
                    src="images/' . htmlspecialchars($dessins['image']) . '" width="200" height="250"/></a>
        </div>';

    }
    $reponse->closeCursor();

} catch (Exception $e) {
    echo 'Erreur : ', $e->getMessage();
    echo '<br />';
    echo $e->getTraceAsString();
}
?>
 
@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 79 Messages

08 mai 2013, 18:02

Moogli comment te dire..., ça fait 3 semaines que je galère là dessus,et la deuxième fois que tu interviens, et me trouve une solution :).
Dommage qu'on ne puisse pas noter les réponses. +1 ^^
Un grand Merci encore une fois !!
Sincèrement.
Créateur du site www.crobara2bal.com.