8795 sujets

Développement web côté serveur, CMS

Bonjour à tous et à toutes,
Je suis actuellement sur la création d'un forum, et je suis confronté à un problème,
lors du post d'un message un message d'erreur s'affiche :


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


Voici ma page postvalider :


<?php session_start(); ?>
<?php require_once 'connexioninscription.inc.php'; ?>
<?php
//On récupère la valeur de la variable action
$action = (isset($_GET['action']))?htmlspecialchars($_GET['action']):'';
 
// Si le membre n'est pas connecté, il est arrivé ici par erreur
?>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="description" content="Afficher le forum." />
<meta name="keywords" content="Forum" />
<title>Forum</title>
<link rel="shortcut icon" sizes="32x32" title="forum" 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="corpspostvalide">
<div id="formpostvalide">
<?php
$id = ($_SESSION['membre_id']);
if ($id==0) erreur(ERR_IS_CO);

switch($action)
{
    //Premier cas : nouveau topic
    case "nouveautopic":
    //On passe le message dans une série de fonction
    $message = $_POST['message'];
    $mess = $_POST['mess'];
 
    //Pareil pour le titre
    $titre = $_POST['titre'];
 
    //ici seulement, maintenant qu'on est sur qu'elle existe, on récupère la valeur de la variable f
    $forum = (int) $_GET['f'];
    $temps = time();
 
    if (empty($message) || empty($titre))
    {
        echo'<p class="textesimple">Votre message ou votre titre est vide, 
        cliquez <a href="./poster.php?action=nouveautopic&amp;f='.$forum.'">ici</a> pour recommencer</p>';
    }
    else //Si jamais le message n'est pas vide
    {
		  //On entre le topic dans la base de donnée en laissant
        //le champ topic_last_post à 0
        $query=$bdd->prepare('INSERT INTO forum_topic
        (forum_id, topic_titre, topic_createur, topic_vu, topic_time, topic_genre) VALUES (:forum, :titre, :id, 1, :temps, :mess)');
        $query->bindValue(':forum', $forum, PDO: [langue]ARAM_INT);
        $query->bindValue(':titre', $titre, PDO: [langue]ARAM_STR);
        $query->bindValue(':id', $id, PDO: [langue]ARAM_INT);
        $query->bindValue(':temps', $temps, PDO: [langue]ARAM_INT);
        $query->bindValue(':mess', $mess, PDO: [langue]ARAM_STR);
        $query->execute();
 
 
        $nouveautopic = $bdd->lastInsertId(); //Notre fameuse fonction !
        $query->CloseCursor(); 
 
        //Puis on entre le message
        $query=$bdd->prepare('INSERT INTO forum_post (post_createur, post_texte, post_time, topic_id, post_forum_id)
        VALUES (:id, :mess, :temps, :nouveautopic, :forum)');
        $query->bindValue(':id', $id, PDO: [langue]ARAM_INT);
        $query->bindValue(':mess', $message, PDO: [langue]ARAM_STR);
        $query->bindValue(':temps', $temps,PDO: [langue]ARAM_INT);
        $query->bindValue(':nouveautopic', (int) $nouveautopic, PDO: [langue]ARAM_INT);
        $query->bindValue(':forum', $forum, PDO: [langue]ARAM_INT);
        $query->execute();
 
 
        $nouveaupost = $bdd->lastInsertId(); //Encore notre fameuse fonction !
        $query->CloseCursor(); 
 
 
        //Ici on update comme prévu la valeur de topic_last_post et de topic_first_post
        $query=$bdd->prepare('UPDATE forum_topic SET topic_last_post = :nouveaupost, topic_first_post = :nouveaupost WHERE topic_id = :nouveautopic');
        $query->bindValue(':nouveaupost', (int) $nouveaupost, PDO: [langue]ARAM_INT);    
        $query->bindValue(':nouveautopic', (int) $nouveautopic, PDO: [langue]ARAM_INT);
        $query->execute();
        $query->CloseCursor();
 
        //Enfin on met à jour les tables forum_forum et forum_membres
        $query=$bdd->prepare('UPDATE forum_forum SET forum_post = forum_post + 1 ,forum_topic = forum_topic + 1, forum_last_post_id = :nouveaupost WHERE forum_id = :forum');
        $query->bindValue(':nouveaupost', (int) $nouveaupost, PDO: [langue]ARAM_INT);    
        $query->bindValue(':forum', (int) $forum, PDO: [langue]ARAM_INT);
        $query->execute();
        $query->CloseCursor();
     
        $query=$bdd->prepare('UPDATE membres SET membre_post = membre_post + 1 WHERE membre_id = :id');
        $query->bindValue(':id', $id, PDO: [langue]ARAM_INT);    
        $query->execute();
        $query->CloseCursor();
 
        //Et un petit message
        echo'<p class="textesimple">Votre message a bien été ajouté!<br /><br />Cliquez <a href="./forum.php">ici</a> pour revenir à l index du forum<br />
        Cliquez <a href="./affichertopic.php?t='.$nouveautopic.'">ici</a> pour le voir</p>';
    }
    break; //Houra !
?>
<?php
    //Deuxième cas : répondre
    case "repondre":
    $message = $_POST['message'];
 
    //ici seulement, maintenant qu'on est sur qu'elle existe, on récupère la valeur de la variable t
    $topic = (int) $_GET['t'];
    $temps = time();
 
    if (empty($message))
    {
        echo'<p class="textesimple">Votre message est vide, cliquez <a href="./poster.php?action=repondre&amp;t='.$topic.'">ici</a> pour recommencer</p>';
    }
    else //Sinon, si le message n'est pas vide
    {
 
        //On récupère l'id du forum
        $query=$bdd->prepare('SELECT forum_id, topic_post FROM forum_topic WHERE topic_id = :topic');
        $query->bindValue(':topic', $topic, PDO: [langue]ARAM_INT);    
        $query->execute();
        $data=$query->fetch();
        $forum = $data['forum_id'];
 
        //Puis on entre le message
        $query=$bdd->prepare('INSERT INTO forum_post (post_createur, post_texte, post_time, topic_id, post_forum_id) VALUES(:id,:mess,:temps,:topic,:forum)');
        $query->bindValue(':id', $id, PDO: [langue]ARAM_INT);   
        $query->bindValue(':mess', $message, PDO: [langue]ARAM_STR);  
        $query->bindValue(':temps', $temps, PDO: [langue]ARAM_INT);  
        $query->bindValue(':topic', $topic, PDO: [langue]ARAM_INT);   
        $query->bindValue(':forum', $forum, PDO: [langue]ARAM_INT); 
        $query->execute();
 
        $nouveaupost = $bdd->lastInsertId();
        $query->CloseCursor(); 
 
        //On change un peu la table forum_topic
        $query=$bdd->prepare('UPDATE forum_topic SET topic_post = topic_post + 1, topic_last_post = :nouveaupost WHERE topic_id =:topic');
        $query->bindValue(':nouveaupost', (int) $nouveaupost, PDO: [langue]ARAM_INT);   
        $query->bindValue(':topic', (int) $topic, PDO: [langue]ARAM_INT); 
        $query->execute();
        $query->CloseCursor(); 
 
        //Puis même combat sur les 2 autres tables
        $query=$bdd->prepare('UPDATE forum_forum SET forum_post = forum_post + 1 , forum_last_post_id = :nouveaupost WHERE forum_id = :forum');
        $query->bindValue(':nouveaupost', (int) $nouveaupost, PDO: [langue]ARAM_INT);   
        $query->bindValue(':forum', (int) $forum, PDO: [langue]ARAM_INT); 
        $query->execute();
        $query->CloseCursor(); 
 
        $query=$bdd->prepare('UPDATE membres SET membre_post = membre_post + 1 WHERE membre_id = :id');
        $query->bindValue(':id', $id, PDO: [langue]ARAM_INT); 
        $query->execute();
        $query->CloseCursor(); 
 
        //Et un petit message
        $nombreDeMessagesParPage = 15;
        $nbr_post = $data['topic_post']+1;
        $page = ceil($nbr_post / $nombreDeMessagesParPage);
        echo'<p class="textesimple">Votre message a bien été ajouté!<br /><br />
        Cliquez <a href="./forum.php">ici</a> pour revenir à l index du forum<br />
        Cliquez <a href="./affichertopic.php?t='.$topic.'&amp;page='.$page.'#p_'.$nouveaupost.'">ici</a> pour le voir</p>';
    }//Fin du else
    break;
?>

<?php
case "repondremp": //Si on veut répondre
 
    //On récupère le titre et le message
    $message = $_POST['message'];
    $titre = $_POST['titre'];
    $temps = time();
 
    //On récupère la valeur de l'id du destinataire
    $dest = (int) $_GET['dest'];
 
    //Enfin on peut envoyer le message
 
    $query=$bdd->prepare('INSERT INTO forum_mp (mp_expediteur, mp_receveur, mp_titre, mp_text, mp_time, mp_lu) VALUES (:id, :dest, :titre, :txt, :tps, "0")'); 
    $query->bindValue(':id',$id,PDO: [langue]ARAM_INT);   
    $query->bindValue(':dest',$dest,PDO: [langue]ARAM_INT);   
    $query->bindValue(':titre',$titre,PDO: [langue]ARAM_STR);   
    $query->bindValue(':txt',$message,PDO: [langue]ARAM_STR);   
    $query->bindValue(':tps',$temps,PDO: [langue]ARAM_INT);   
    $query->execute();
    $query->CloseCursor(); 
 
    echo'<p class="textesimple">Votre message a bien été envoyé!<br />
    <br />Cliquez <a href="./index.php">ici</a> pour revenir à l index du   
    forum<br />
    <br />Cliquez <a href="./messagesprives.php">ici</a> pour retourner
    à la messagerie</p>';
 
    break;
?>
<?php
    case "nouveaump": //On envoie un nouveau mp
 
    //On récupère le titre et le message
    $message = $_POST['message'];
    $titre = $_POST['titre'];
    $temps = time();
    $dest = $_POST['to'];
 
    //On récupère la valeur de l'id du destinataire
    //Il faut déja vérifier le nom
 
    $query=$bdd->prepare('SELECT membre_id FROM membres WHERE LOWER(membre_pseudo) = :dest');
    $query->bindValue(':dest',strotolower($dest),PDO: [langue]ARAM_STR);
    $query->execute();
    if($data = $query->fetch())
    {
        $query=$bdd->prepare('INSERT INTO forum_mp (mp_expediteur, mp_receveur, mp_titre, mp_text, mp_time, mp_lu) VALUES (:id, :dest, :titre, :txt, :tps, :lu)'); 
        $query->bindValue(':id',$id,PDO: [langue]ARAM_INT);   
        $query->bindValue(':dest',(int) $data['membre_id'],PDO: [langue]ARAM_INT);   
        $query->bindValue(':titre',$titre,PDO: [langue]ARAM_STR);   
        $query->bindValue(':txt',$message,PDO: [langue]ARAM_STR);   
        $query->bindValue(':tps',$temps,PDO: [langue]ARAM_INT);   
        $query->bindValue(':lu','0',PDO: [langue]ARAM_STR);   
        $query->execute();
        $query->CloseCursor(); 
 
       echo'<p class="textesimple">Votre message a bien été envoyé!
       <br /><br />Cliquez <a href="./index.php">ici</a> pour revenir à l index du
       forum<br />
       <br />Cliquez <a href="./messagesprives.php">ici</a> pour retourner à
       la messagerie</p>';
    }
    //Sinon l'utilisateur n'existe pas !
    else
    {
        echo'<p class="textesimple">Désolé ce membre n existe pas, veuillez vérifier et
        réessayez à nouveau.</p>';
    }
    break;
?>
<?php
    default;
    echo'<p class="textesimple">Cette action est impossible</p>';
} //Fin du Switch
?>
</div>
</div>
<?php
include ("footer.inc.php");
?>
</div>
</body>
</html>


et voici ma page post :


<?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="Poster votre message." />
<meta name="keywords" content="Poster" />
<title>poster</title>
<link rel="shortcut icon" sizes="32x32" title="crl" type="image/png" href="mafavicon.png" />
<link href="css1.css" rel="stylesheet" type="text/css"/>
<script>
function bbcode(bbdebut, bbfin)
{
var input = window.document.formulaire.message;
input.focus();
if(typeof document.selection != 'undefined')
{
var range = document.selection.createRange();
var insText = range.text;
range.text = bbdebut + insText + bbfin;
range = document.selection.createRange();
if (insText.length == 0)
{
range.move('character', -bbfin.length);
}
else
{
range.moveStart('character', bbdebut.length + insText.length + bbfin.length);
}
range.select();
}
else if(typeof input.selectionStart != 'undefined')
{
var start = input.selectionStart;
var end = input.selectionEnd;
var insText = input.value.substring(start, end);
input.value = input.value.substr(0, start) + bbdebut + insText + bbfin + input.value.substr(end);
var pos;
if (insText.length == 0)
{
pos = start + bbdebut.length;
}
else
{
pos = start + bbdebut.length + insText.length + bbfin.length;
}
input.selectionStart = pos;
input.selectionEnd = pos;
}
  
else
{
var pos;
var re = new RegExp('^[0-9]{0,3}$');
while(!re.test(pos))
{
pos = prompt("insertion (0.." + input.value.length + "):", "0");
}
if(pos > input.value.length)
{
pos = input.value.length;
}
var insText = prompt("Veuillez taper le texte");
input.value = input.value.substr(0, pos) + bbdebut + insText + bbfin + input.value.substr(pos);
}
}
function smilies(img)
{
window.document.formulaire.message.value += '' + img + '';
}
</script>
</head>
<body>
<div id="container">
<?php
include ("header.inc.php");
include ("menus.inc.php");
include("debut.php");
?>
<div id="corpsposter">
<div id="misenformeposter">
<?php
//Qu'est ce qu'on veut faire ? poster, répondre ou éditer ?
$action = (isset($_GET['action']))?htmlspecialchars($_GET['action']):'';
 
//Il faut être connecté pour poster !
$id = ($_SESSION['membre_id']);
if ($id==0) erreur(ERR_IS_CO);
 
//Si on veut poster un nouveau topic, la variable f se trouve dans l'url,
//On récupère certaines valeurs
if (isset($_GET['f']))
{
    $forum = (int) $_GET['f'];
    $query= $bdd->prepare('SELECT forum_name, auth_view, auth_post, auth_topic, auth_annonce, auth_modo FROM forum_forum WHERE forum_id =:forum');
    $query->bindValue(':forum',$forum,PDO: [langue]ARAM_INT);
    $query->execute();
    $data=$query->fetch();
    echo '<p class="textesimple"><i>Vous êtes ici</i> : <a href="./forum.php">Index du forum</a> --> 
    <a href="./afficherforum.php?f='.$data['forum_id'].'">'.stripslashes(htmlspecialchars($data['forum_name'])).'</a>
    --> Nouveau topic</p>';
 
  
}
  
//Sinon c'est un nouveau message, on a la variable t et
//On récupère f grâce à une requête
elseif (isset($_GET['t']))
{
    $topic = (int) $_GET['t'];
    $query=$bdd->prepare('SELECT topic_titre, forum_topic.forum_id,
    forum_name, auth_view, auth_post, auth_topic, auth_annonce, auth_modo
    FROM forum_topic LEFT JOIN forum_forum ON forum_forum.forum_id = forum_topic.forum_id WHERE topic_id =:topic');
    $query->bindValue(':topic',$topic,PDO: [langue]ARAM_INT);
    $query->execute();
    $data=$query->fetch();
    $forum = $data['forum_id'];  
 
    echo '<p class="textesimple"><i>Vous êtes ici</i> : <a href="./forum.php">Index du forum</a> --> 
    <a href="./afficherforum.php?f='.$data['forum_id'].'">'.stripslashes(htmlspecialchars($data['forum_name'])).'</a>
    --> <a href="./'.$topic.'">'.stripslashes(htmlspecialchars($data['topic_titre'])).'</a>
    --> Répondre</p>';
}
  
//Enfin sinon c'est au sujet de la modération(on verra plus tard en détail)
//On ne connait que le post, il faut chercher le reste
elseif (isset ($_GET['p']))
{
    $post = (int) $_GET['p'];
    $query=$bdd->prepare('SELECT post_createur, forum_post.topic_id, topic_titre, forum_topic.forum_id, forum_name, auth_view, auth_post, auth_topic, auth_annonce, auth_modo FROM forum_post
    LEFT JOIN forum_topic ON forum_topic.topic_id = forum_post.topic_id
    LEFT JOIN forum_forum ON forum_forum.forum_id = forum_topic.forum_id
    WHERE forum_post.post_id =:post');
    $query->bindValue(':post',$post,PDO: [langue]ARAM_INT);
    $query->execute();
    $data=$query->fetch();
 
    $topic = $data['topic_id'];
    $forum = $data['forum_id'];
  
    echo '<p class="textesimple"><i>Vous êtes ici</i> : <a href="./forum.php">Index du forum</a> --> <a href="./afficherforum.php?f='.$data['forum_id'].'">'.stripslashes(htmlspecialchars($data['forum_name'])).'</a> --> <a href="./'.$topic.'">'.stripslashes(htmlspecialchars($data['topic_titre'])).'</a> --> Modérer un message</p>';
}
$query->CloseCursor();  
?>
<?php
switch($action)
{
case "repondre": //Premier cas : on souhaite répondre
?>
<h1 class="textesimple">Poster une réponse</h1>
  
<form method="post" action="postvalide.php?action=repondre&amp;t=<?php echo $topic ?>" name="formulaire">
  
<fieldset><legend><h3 class="textesimple">Mise en forme</h3></legend>
<input type="button" id="gras" name="gras" value="Gras" onClick="javascript:bbcode('[g]', '[/g]');return(false)" />
<input type="button" id="italic" name="italic" value="Italic" onClick="javascript:bbcode('[i]', '[/i]');return(false)" />
<input type="button" id="souligné" name="souligné" value="Souligné" onClick="javascript:bbcode('[s]', '[/s]');return(false)" />
<input type="button" id="lien" name="lien" value="Lien" onClick="javascript:bbcode('[url]', '[/url]');return(false)" />
<br /><br />
<img src="./images/smileys/heureux.gif" title="heureux" alt="heureux" onClick="javascript:smilies(':D');return(false)" />
<img src="./images/smileys/lol.gif" title="lol" alt="lol" onClick="javascript:smilies(':lol:');return(false)" />
<img src="./images/smileys/triste.gif" title="triste" alt="triste" onClick="javascript:smilies(':triste:');return(false)" />
<img src="./images/smileys/cool.gif" title="cool" alt="cool" onClick="javascript:smilies(':frime:');return(false)" />
<img src="./images/smileys/rire.gif" title="rire" alt="rire" onClick="javascript:smilies('XD');return(false)" />
<img src="./images/smileys/confus.gif" title="confus" alt="confus" onClick="javascript:smilies(':s');return(false)" />
<img src="./images/smileys/choc.gif" title="choc" alt="choc" onClick="javascript:smilies(':o');return(false)" />
<img src="./images/smileys/question.gif" title="interrogation" alt="interrogation" onClick="javascript:smilies(':interrogation:');return(false)" />
<img src="./images/smileys/exclamation.gif" title="exclamation" alt="exclamation" onClick="javascript:smilies(':exclamation:');return(false)" />
</fieldset>
  
<fieldset><legend><h3 class="textesimple">Message</h3></legend><textarea cols="80" rows="8" id="message" name="message"></textarea></fieldset>
  
<input type="submit" name="submit" value="Envoyer" />
<input type="reset" name = "Effacer" value = "Effacer"/>
</p></form>
<?php
break;
  
case "nouveautopic": //Deuxième cas : on souhaite créer un nouveau topic
?>
<h1 class="textesimple">Nouveau topic</h1>
<form method="post" action="postvalide.php?action=nouveautopic&amp;f=<?php echo $forum ?>" name="formulaire">
  
<fieldset><legend><h3 class="textesimple">Titre</h3></legend>
<input type="text" size="80" id="titre" name="titre" /></fieldset>
  
<fieldset><legend><h3 class="textesimple">Mise en forme</h3></legend>
<input type="button" id="gras" name="gras" value="Gras" onClick="javascript:bbcode('[g]', '[/g]');return(false)" />
<input type="button" id="italic" name="italic" value="Italic" onClick="javascript:bbcode('[i]', '[/i]');return(false)" />
<input type="button" id="souligné" name="souligné" value="Souligné" onClick="javascript:bbcode('[s]', '[/s]');return(false)" />
<input type="button" id="lien" name="lien" value="Lien" onClick="javascript:bbcode('[url]', '[/url]');return(false)" />
<br /><br />
<img src="./images/smileys/heureux.gif" title="heureux" alt="heureux" onClick="javascript:smilies(':D');return(false)" />
<img src="./images/smileys/lol.gif" title="lol" alt="lol" onClick="javascript:smilies(':lol:');return(false)" />
<img src="./images/smileys/triste.gif" title="triste" alt="triste" onClick="javascript:smilies(':triste:');return(false)" />
<img src="./images/smileys/cool.gif" title="cool" alt="cool" onClick="javascript:smilies(':frime:');return(false)" />
<img src="./images/smileys/rire.gif" title="rire" alt="rire" onClick="javascript:smilies('XD');return(false)" />
<img src="./images/smileys/confus.gif" title="confus" alt="confus" onClick="javascript:smilies(':s');return(false)" />
<img src="./images/smileys/choc.gif" title="choc" alt="choc" onClick="javascript:smilies(':o');return(false)" />
<img src="./images/smileys/question.gif" title="interrogation" alt="iinterrogation" onClick="javascript:smilies(':interrogation:');return(false)" />
<img src="./images/smileys/exclamation.gif" title="exclamation" alt="exclamation" onClick="javascript:smilies(':exclamation:');return(false)" /></fieldset>
  
<fieldset><legend><h3 class="textesimple">Message</h3></legend>
<textarea cols="80" rows="8" id="message" name="message"></textarea>

<label><input type="radio" name="mess" value="Annonce" />Annonce</label>
<label><input type="radio" name="mess" value="Message" checked="checked" />Topic</label>
</fieldset>
<p class="textesimple">
<input type="submit" name="submit" value="Envoyer" />
<input type="reset" name = "Effacer" value = "Effacer" /></p>
</form>
<?php
break;
  
//D'autres cas viendront s'ajouter là plus tard [langue]
  
default: //Si jamais c'est aucun de ceux-là, c'est qu'il y a eu un problème :o
echo'<p class="textesimple">Cette action est impossible</p>';
  
} //Fin du switch
?>
</div>
</div>
<?php
include ("footer.inc.php");
?>
</div>
</body>
</html>


Merci vraiment pour votre attention et votre aide...
Hello,

le message d'erreur signifie que le champ topic_genre ne peut pas être NULL or il est alimenté avec la variable mess... qui n'existe que dans le deuxième élément FORM et pas dans le premier. Smiley cligne
Un conseil de vieux, ouais bon j'ai que 31 ans mais déjà 10 ans de web derrière moi.
J'ai fait de tout pas de fonctions, des fonctions, du procédural mais l'objet c'est cool. Les classes c'est cool.

Ça permet de centraliser les éléments php et de les séparer correctement du texte et je te jure que quand tu reprend ton code 6/12 mois après ça peux te sauver le cerveau.

Smiley cligne