8791 sujets

Développement web côté serveur, CMS

Bonjour à tous et à toutes,

Je créer actuellement un forum de discutions sur lequel j'ai rajouté l'option d'accéder directement au dernier message posté sur "tel sujet".

Je suis confronté à quelque soucis de définition de variable que je n'arrive pas à régler.

Voici le bout de code qui se trouve à l'index du forum permettant d’accéder au dernier message :


 <p class="textesimple"><a href="./affichertopic.php?t='.$data['topic_id'].'&amp;page='.$page.'#p_'.$data['post_id'].'"><img src="./images/go.gif" alt="go" /></a></p></td></tr>';


lorsque je clique sur ce code, cela m'envoie donc sur le dernier message posté par "x membre".

et j'obtient une erreur comme quoi le contenue de tv_forum_id est vide.....

a écrit :

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'tv_forum_id' cannot be null' in /home/crobar/public_html/affichertopic.php:65 Stack trace: #0 /home/crobar/public_html/affichertopic.php(65): PDOStatement->execute() #1 {main} thrown in /home/crobar/public_html/affichertopic.php on line 65


et voici le code qui à l'air de tout chambouler Smiley ohwell


<?php
//Topic déjà consulté ?
$query=$bdd->prepare('SELECT COUNT(*) FROM forum_topic_view WHERE tv_topic_id = :topic AND tv_id = :id');
$query->bindValue(':topic',$topic,PDO: [langue]ARAM_INT);
$query->bindValue(':id',$id,PDO: [langue]ARAM_INT);
$query->execute();
$nbr_vu=$query->fetchColumn();
$query->CloseCursor();
if ($nbr_vu == 0) //Si c'est la première fois on insère une ligne entière
{
    $query=$bdd->prepare('INSERT INTO forum_topic_view (tv_id, tv_topic_id, tv_forum_id, tv_post_id) VALUES (:id, :topic, :forum, :last_post)');
    $query->bindValue(':id',$id,PDO: [langue]ARAM_INT);
    $query->bindValue(':topic',$topic,PDO: [langue]ARAM_INT);
    $query->bindValue(':forum',$forum,PDO: [langue]ARAM_INT);
    $query->bindValue(':last_post',$data['topic_last_post'],PDO: [langue]ARAM_INT);
    $query->execute();
    $query->CloseCursor();
       
}
else //Sinon, on met simplement à jour
{
    $query=$bdd->prepare('UPDATE forum_topic_view SET tv_post_id = :last_post WHERE tv_topic_id = :topic AND tv_id = :id');
    $query->bindValue(':last_post',$data['topic_last_post'],PDO: [langue]ARAM_INT);
    $query->bindValue(':topic',$topic,PDO: [langue]ARAM_INT);
    $query->bindValue(':id',$id,PDO: [langue]ARAM_INT);
    $query->execute();
    $query->CloseCursor();
}
?>


un peu plus haut dans mon code : $forum=$data['forum_id']..

j'avoue m'être un peu perdu après avoir fait un break de 4 jours sur le développement du site.

Merci pour votre attention et votre aide pour m'aider à résoudre ce petit soucis Smiley ohwell .
Salut, pour résumer:
- pdo gueule parce que tu essayes d'insérer une valeur vide sur un champs qui est en non null
- la valeur d'insertion est nulle parce que ta variable $forum est null
- tu ne montres aucun bout de code ou cette valeur pourrait être définie. Ni dans le html en GET, ni dans le php

A partir de la, je ne peux pas beaucoup aider. Même si tu as mis une instruction $forum=$data['forum_id'] sans savoir ce que vaux $data et quand la variable est définie, c'est dur à dire d’où viens l'erreur.

Essayes d'afficher le contenu de forum et de data à différents endroits dans ton code, ca te donnera peut etre une piste.
Merci pour ton attention Sephitan

voici le code complet de ma page :


<?php session_start(); ?>
<?php require_once 'connexioninscription.inc.php'; ?>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="description" content="Afficher un topic." />
<meta name="keywords" content="Topic" />
<title>Topic </title>
<link rel="shortcut icon" sizes="32x32" title="crobar" type="image/png" href="mafavicon.png" />
<link href="css1.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="container">
<?php
include ("header.inc.php");
include ("menus.inc.php");
include("debut.php");
?>
<div id="corpstopic">
<a href="forum.php" title="retour à l'index du forum"><h1 class="titre1">Forum</h1></a>
<div id="formtopic">
<?php
//On récupère la valeur de t
$topic = (int) $_GET['t'];
  
//A partir d'ici, on va compter le nombre de messages pour n'afficher que les 15 premiers
$query=$bdd->prepare('SELECT topic_titre, topic_post, forum_topic.forum_id, topic_last_post, forum_name, auth_view, auth_topic, auth_post FROM forum_topic LEFT JOIN forum_forum ON forum_topic.forum_id = forum_forum.forum_id WHERE topic_id = :topic');
$query->bindValue(':topic',$topic,PDO: [langue]ARAM_INT);
$query->execute();
$data=$query->fetch();
$forum=$data['forum_id']; 
$totalDesMessages = $data['topic_post'] + 1;
$nombreDeMessagesParPage = 15;
$nombreDePages = ceil($totalDesMessages / $nombreDeMessagesParPage);
?>
<?php
if (!verif_auth($data['auth_view']))
{
    erreur(ERR_AUTH_VIEW);
}
?>
<?php
echo '<div id="vousetesici"><p class="boutonlienforum"><i>Vous êtes ici</i> : <a href="./forum.php">Index du forum</a> > 
<a href="./afficherforum.php?f='.$forum.'">'.stripslashes(htmlspecialchars($data['forum_name'])).'</a>
 > <a href="./affichertopic.php?t='.$topic.'">'.stripslashes(htmlspecialchars($data['topic_titre'])).'</a></p></div>';
 
echo '<div id="meftitrefor"><p class="textesimple"><b>Titre du sujet : </b><h2 class="textetitresujet">'.stripslashes(htmlspecialchars($data['topic_titre'])).'</h2></p></div>';
?>
<?php
//Topic déjà consulté ?
$query=$bdd->prepare('SELECT COUNT(*) FROM forum_topic_view WHERE tv_topic_id = :topic AND tv_id = :id');
$query->bindValue(':topic',$topic,PDO: [langue]ARAM_INT);
$query->bindValue(':id',$id,PDO: [langue]ARAM_INT);
$query->execute();
$nbr_vu=$query->fetchColumn();
$query->CloseCursor();
if ($nbr_vu == 0) //Si c'est la première fois on insère une ligne entière
{
    $query=$bdd->prepare('INSERT INTO forum_topic_view (tv_id, tv_topic_id, tv_forum_id, tv_post_id) VALUES (:id, :topic, :forum, :last_post)');
    $query->bindValue(':id',$id,PDO: [langue]ARAM_INT);
    $query->bindValue(':topic',$topic,PDO: [langue]ARAM_INT);
    $query->bindValue(':forum',$forum,PDO: [langue]ARAM_INT);
    $query->bindValue(':last_post',$data['topic_last_post'],PDO: [langue]ARAM_INT);
    $query->execute();
    $query->CloseCursor();
       
}
else //Sinon, on met simplement à jour
{
    $query=$bdd->prepare('UPDATE forum_topic_view SET tv_post_id = :last_post WHERE tv_topic_id = :topic AND tv_id = :id');
    $query->bindValue(':last_post',$data['topic_last_post'],PDO: [langue]ARAM_INT);
    $query->bindValue(':topic',$topic,PDO: [langue]ARAM_INT);
    $query->bindValue(':id',$id,PDO: [langue]ARAM_INT);
    $query->execute();
    $query->CloseCursor();
}
?>
<?php
//Nombre de pages

$page = (isset($_GET['page']))?intval($_GET['page']):1;
 
//On affiche les pages 1-2-3 etc...
echo '<p class="textesimple">Page : ';
for ($i = 1 ; $i <= $nombreDePages ; $i++)
{
    if ($i == $page) //On affiche pas la page actuelle en lien
    {
    echo $i;
    }
    else
    {
    echo '<p class="textesimple"><a href="affichertopic.php?t='.$topic.'&page='.$i.'">
    ' . $i . '</a></p>';
    }
}

  
$premierMessageAafficher = ($page - 1) * $nombreDeMessagesParPage;
 
if ($_SESSION['membre_id'])
{
 if ($data['topic_locked']==1) // Topic verrouillé !
{
	echo '<p class="textewarning">'."Ce topic à été verrouillé".'</p>';
}
	else
	{
echo '<div id="encadrenewrepondre">';
//On affiche l'image répondre

if (verif_auth($data['auth_post']))
{
echo'<div><a href="./poster.php?action=repondre&amp;t='.$topic.'">
<img src="./images/repondre.gif" alt="Répondre" title="Répondre à ce topic" /></a>';
}
  
//On affiche l'image nouveau topic
if (verif_auth($data['auth_topic']))
{
echo'<a href="./poster.php?action=nouveautopic&amp;f='.$data['forum_id'].'">
<img src="./images/nouveau.gif" alt="Nouveau topic" title="Poster un nouveau topic" /></a></div>';
}
	
echo '</div>';
}
}
$query->CloseCursor(); 
//Enfin on commence la boucle !
$query=$bdd->prepare('SELECT post_id, post_createur, post_texte, post_time,
membre_id, membre_pseudo, membre_inscription, membre_avatar, membre_localisation, membre_post, membre_signature FROM forum_post
LEFT JOIN membres ON membres.membre_id = forum_post.post_createur
WHERE topic_id =:topic ORDER BY post_id LIMIT [langue]remier, :nombre');
$query->bindValue(':topic',$topic,PDO: [langue]ARAM_INT);
$query->bindValue(':premier',(int) $premierMessageAafficher,PDO: [langue]ARAM_INT);
$query->bindValue(':nombre',(int) $nombreDeMessagesParPage,PDO: [langue]ARAM_INT);
$query->execute();
  
//On vérifie que la requête a bien retourné des messages
if ($query->rowCount()<1)
{
        echo'<p class="textesimple">Il n y a aucun post sur ce topic, vérifiez l url et reessayez</p>';
}
else
{
        //Si tout roule on affiche notre tableau puis on remplit avec une boucle
        ?><table>
        <tr>
        <th class="vt_auteur"><p class="titretablforum">Auteurs</p></th>             
        <th class="vt_mess"><p class="titretablforum">Messages</p></th>       
        </tr>
        <?php
        while ($data = $query->fetch())
        {
			//On commence à afficher le pseudo du créateur du message :
         //On vérifie les droits du membre
         //(partie du code commentée plus tard)
         echo'<tr><td><p class="pseudomembreforum"><strong>
         <a href="./voirprofil.php?m='.$data['membre_id'].'&amp;action=consulterprofil">'.stripslashes(htmlspecialchars($data['membre_pseudo'])).'</a></strong></p></td>';
            
         /* Si on est l'auteur du message, on affiche des liens pour
         Modérer celui-ci.
         Les modérateurs pourront aussi le faire, il faudra donc revenir sur
         ce code un peu plus tard ! */    
		$id = ($_SESSION['membre_id']);
         if ($id == $data['post_createur'])
         {
         echo'<td id=p_'.$data['post_id'].'><p class="textesimplegrisay">Posté à '.date('H\hi \l\e d M y',$data['post_time']).'<a href="./poster.php?p='.$data['post_id'].'&amp;action=delete"><img src="./images/supprimer.gif" alt="Supprimer" title="Supprimer ce message" /></a><a href="./poster.php?p='.$data['post_id'].'&amp;action=edit"><img src="./images/editer.gif" alt="Editer" title="Editer ce message" /></a></p></td></tr>';
         }
         else
         {
         echo'<td><p class="textesimplegrisay"><b>Posté à </b>'.date('H\hi \l\e d M y',$data['post_time']).'
         </p></td></tr>';
         }
        
         //Détails sur le membre qui a posté
         echo'<tr><td><p class="textesimple">
         <img src="./images/avatars/'.$data['membre_avatar'].'" class="imgavatar" alt="" /></p><p class="textesimplegrisay"><b>Inscrit depuis : </b>'.$data['membre_inscription'].'
         </p><p class="textesimplegrisay"><b>Messages : </b>'.$data['membre_post'].'</p><p class="textesimplegrisay"><b>Localisation : </b>'.stripslashes(htmlspecialchars($data['membre_localisation'])).'</p></td>';
                
         //Message
         echo'<td><p class="textesimplegrisay"><b> Message : </b></p><p class="textesimple">'.code(nl2br(stripslashes(htmlspecialchars($data['post_texte'])))).'
         </p><hr /><p class="textesimplegrisay"><b>Signature : </b>'.code(nl2br(stripslashes(htmlspecialchars($data['membre_signature'])))).'</p></td></tr>';
         } //Fin de la boucle ! \o/
         $query->CloseCursor();
?>
</table>
<?php
		
$query = $bdd->prepare('SELECT topic_locked FROM forum_topic WHERE topic_id = :topic');
$query->bindValue(':topic',$topic,PDO: [langue]ARAM_INT);
$query->execute();
$data=$query->fetch();
 if ($_SESSION['membre_id'])
	{
if ($data['topic_locked']==1) // Topic verrouillé !
{
	echo'<a href="./postvalide.php?action=unlock&t='.$topic.'">
    <img src="./images/unlock.gif" alt="deverrouiller" title="Déverrouiller ce sujet" /></a>';

}
else //Sinon le topic est déverrouillé !
{

    echo'<a href="./postvalide.php?action=lock&amp;t='.$topic.'">
    <img src="./images/lock.gif" alt="verrouiller" title="Verrouiller ce sujet" /></a>';
	}
}
$query->CloseCursor();


$query=$bdd->prepare('SELECT forum_id, forum_name FROM forum_forum WHERE forum_id <> :forum');
$query->bindValue(':forum',$forum,PDO: [langue]ARAM_INT);
$query->execute();
 
//$forum a été définie tout en haut de la page !
if ($_SESSION['membre_id'])
	{
echo'<p class="textesimple">Déplacer vers :</p>
<form method="post" action=postvalide.php?action=deplacer&amp;t='.$topic.'>
<select name="dest">';               
while($data=$query->fetch())
{
     echo'<option value='.$data['forum_id'].' id='.$data['forum_id'].'>'.$data['forum_name'].'</option>';
}

$query->CloseCursor();
echo'
</select>
<input type="hidden" name="from" value='.$forum.'>
<input type="submit" name="submit" value="Envoyer" />
</form>';

        //On ajoute 1 au nombre de visites de ce topic
        $query=$bdd->prepare('UPDATE forum_topic
        SET topic_vu = topic_vu + 1 WHERE topic_id = :topic');
        $query->bindValue(':topic',$topic,PDO: [langue]ARAM_INT);
        $query->execute();
        $query->CloseCursor();
	}
} //Fin du if qui vérifiait si le topic contenait au moins un message
echo '<p class="textesimple">Page : ';
        for ($i = 1 ; $i <= $nombreDePages ; $i++)
        {
                if ($i == $page) //On affiche pas la page actuelle en lien
                {
                echo $i;
                }
                else
                {
                echo '<a href="affichertopic.php?t='.$topic.'&amp;page='.$i.'">
                ' . $i . '</a> ';
                }
        }
        echo'</p>';
?> 

</div>
</div>
<?php
include 'footer.inc.php';
?>        
</div>
</body>
</html>
Juste avant $forum=$data['forum_id'];, tu peux faire un var_dump($data) stp? Et si tu ne vois rien de suspect, je veux bien que tu mettes le résultat du var_dump ici.
Re,
Bien sûr, merci encore pour ton aide et ton attention Smiley smile .
Après avoir rajouté un var_dump($data) le résultat affiche :
a écrit :
bool(false)
Muep, donc c'est ta requête juste au dessus qui chies. utilises errorInfo() au même endroit que le var_dump pour avoir plus de détails sur l'origine du problème.
Re,
J'ai effectuer un errorinfo() de la manière suivante :

echo print_r($bdd->errorInfo());


et j'obtient :

a écrit :

Array ( [0] => 00000 [1] => [2] => ) 1


( je ne suis pas sur, mais je pense que je soucis pourrais venir d'autre par Smiley ohwell ,
J'ai remarquer que le nombre de vu était forcément comptabilisé comme null ( donc 0 ) pour accéder à la condition :
if ($nbr_vu==0)


et pourtant mon sujet comptabilise plus de 80 vue Smiley ohwell pourrait-il y avoir une erreur avec cette fonction :
$nbr_vu=$query->fetchColumn();
?

merci pour encore pour ton aide sephitan, sincèrement.
Ce que tu décries est effectivement un problème.. mais je pense que ça en est un second en fait.

Le fait est que ta requete qui doit te permettre de récupérer le forum_id ne renvois rien... mais elle n'est pas fausse pour autant. Juste, elle ne renvois rien.

Juste après $topic = (int) $_GET['t'];, ajoutes

var_dump($topic);


Tu peux suivre la même méthodologie pour regarder d'ou viens le problème avec le nombre de vues, il y a probablement un problème avec la requête SQL.
Bon, beh voila. Les 2 erreurs viennent de la.

Donc bah la variable t ne doit pas passer en get, ou je ne sais pas ce qu'elle vaux mais ca doit etre assez simple à débuger. Au pire fais un var_dump de $_GET['t'] pour voir. mais elle n'st probablement pas définie.
résultat du var_dump($_GET['t']); :
a écrit :
string(0) ""


ok j'avoue être totalement larguer..... je ne trouve plus d'exemple dans mes code me permettant de définir $_GET['t'].... cela doit figurer dans une requête ?

Merci pour ton aide.. sincèrement.
Modifié par Reverb (23 Aug 2013 - 15:51)
Uep de rien. Mais non $_GET['t']doit etre définie dans ton url. http://example.com?t=5. Je crois que tu en parlais dans ton premier message, dans le lien html que tu avais donné. De toute façon regarde juste dans l'url de la page si t est défini ou pas, mais probablement que non.
Re,
Non justement Smiley ohwell , t ne semble pas définie, pourtant le système fonctionnait parfaitement avant que j'essaye d'y ajouter un système lu / non lu pour les messages du forum, j'ai tenté de reprendre le tuto que j'ai suivi mais je ne trouve aucune définition de ['t'] Smiley ohwell , et je ne trouve pas d'exemple Smiley decu .