soucis avec un fichier
le 16/01/2014 à 02:00
bigup
Bonjour, je suis le tuto comment creer un forum sur ce site;
mais j'ai une erreur au niveau du fichier insert_reponse.php
Voici l'erreur qui s'affiche :
( ! ) SCREAM: Error suppression ignored for ( ! ) Notice: Undefined index: numero_du_sujet in C:\wamp\www\dossiers\insert_reponse.php on line 71 Call Stack #TimeMemoryFunctionLocation 10.0013259272{main}( )..\insert_reponse.php:0 " method="post">
Je soupçonne la variable
mais je vois pas comment corriger. Je signal que je travail en local.
Merci de votre aide
Tu cherches à lire une variable 'numero_du_sujet' qui DOIT être présente dans l'URL de ta page. Or visiblement, ce n'est pas le cas.
A toi de voir comment tu es arrivé sur cette page, mais le lien ne devait surement pas contenir un paramètre 'numero_du_sujet'.
Il te faut corriger ce lien (ou bien ne plus utiliser la variable $_GET['numero_du_sujet']).
le 17/01/2014 à 02:44
bigup
Tu cherches à lire une variable 'numero_du_sujet' qui DOIT être présente dans l'URL de ta page. Or visiblement, ce n'est pas le cas.
A toi de voir comment tu es arrivé sur cette page, mais le lien ne devait surement pas contenir un paramètre 'numero_du_sujet'.
Il te faut corriger ce lien (ou bien ne plus utiliser la variable $_GET['numero_du_sujet']).
Merci de ta réponse. Mais voici les deux fichiers du site que j'utilise (pour le moment j'ai rien changé de dans sauf la connexion à la base)
1er : lire_sujet.php
<html>
<head>
<title>Lecture d'un sujet</title>
</head>
<body>
<?php
if (!isset($_GET['id_sujet_a_lire'])) {
echo 'Sujet non défini.';
}
else {
?>
<table width="500" border="1"><tr>
<td>
Auteur
</td><td>
Messages
</td></tr>
<?php
// on se connecte à notre base de données
$base = mysql_connect ('serveur', 'login', 'password');
mysql_select_db ('nom_base', $base) ;
// on prépare notre requête
$sql = 'SELECT auteur, message, date_reponse FROM forum_reponses WHERE correspondance_sujet="'.$_GET['id_sujet_a_lire'].'" ORDER BY date_reponse ASC';
// on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
// on va scanner tous les tuples un par un
while ($data = mysql_fetch_array($req)) {
// on décompose la date
sscanf($data['date_reponse'], "%4s-%2s-%2s %2s:%2s:%2s", $annee, $mois, $jour, $heure, $minute, $seconde);
// on affiche les résultats
echo '<tr>';
echo '<td>';
// on affiche le nom de l'auteur de sujet ainsi que la date de la réponse
echo htmlentities(trim($data['auteur']));
echo '<br />';
echo $jour , '-' , $mois , '-' , $annee , ' ' , $heure , ':' , $minute;
echo '</td><td>';
// on affiche le message
echo nl2br(htmlentities(trim($data['message'])));
echo '</td></tr>';
}
// on libère l'espace mémoire alloué pour cette reqête
mysql_free_result ($req);
// on ferme la connection à la base de données.
mysql_close ();
?>
<!-- on ferme notre table html -->
</table>
<br /><br />
<!-- on insère un lien qui nous permettra de rajouter des réponses à ce sujet -->
<a href="./insert_reponse.php?numero_du_sujet=<?php echo $_GET['id_sujet_a_lire']; ?>">Répondre</a>
<?php
}
?>
<br /><br />
<!-- on insère un lien qui nous permettra de retourner à l'accueil du forum -->
<a href="./index.php">Retour à l'accueil</a>
</body>
</html>
2eme : inserer_sujet.php
<?php
// on teste si le formulaire a été soumis
if (isset ($_POST['go']) && $_POST['go']=='Poster') {
// on teste le contenu de la variable $auteur
if (!isset($_POST['auteur']) || !isset($_POST['message']) || !isset($_GET['numero_du_sujet'])) {
$erreur = 'Les variables nécessaires au script ne sont pas définies.';
}
else {
if (empty($_POST['auteur']) || empty($_POST['message']) || empty($_GET['numero_du_sujet'])) {
$erreur = 'Au moins un des champs est vide.';
}
// si tout est bon, on peut commencer l'insertion dans la base
else {
// on se connecte à notre base de données
$base = mysql_connect ('serveur', 'login', 'password');
mysql_select_db ('nom_base', $base) ;
// on recupere la date de l'instant présent
$date = date("Y-m-d H:i:s");
// préparation de la requête d'insertion (table forum_reponses)
$sql = 'INSERT INTO forum_reponses VALUES("", "'.mysql_escape_string($_POST['auteur']).'", "'.mysql_escape_string($_POST['message']).'", "'.$date.'", "'.$_GET['numero_du_sujet'].'")';
// on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());
// préparation de la requête de modification de la date de la dernière réponse postée (dans la table forum_sujets)
$sql = 'UPDATE forum_sujets SET date_derniere_reponse="'.$date.'" WHERE id="'.$_GET['numero_du_sujet'].'"';
// on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());
// on ferme la connexion à la base de données
mysql_close();
// on redirige vers la page de lecture du sujet en cours
header('Location: lire_sujet.php?id_sujet_a_lire='.$_GET['numero_du_sujet']);
// on termine le script courant
exit;
}
}
}
?>
<html>
<head>
<title>Insertion d'une nouvelle réponse</title>
</head>
<body>
<!-- on fait pointer le formulaire vers la page traitant les données -->
<form action="insert_reponse.php?numero_du_sujet=<?php echo $_GET['numero_du_sujet']; ?>" method="post">
<table>
<tr><td>
[b]Auteur :[/b]
</td><td>
<input type="text" name="auteur" maxlength="30" size="50" value="<?php if (isset($_POST['auteur'])) echo htmlentities(trim($_POST['auteur'])); ?>">
</td></tr><tr><td>
[b]Message :[/b]
</td><td>
<textarea name="message" cols="50" rows="10"><?php if (isset($_POST['message'])) echo htmlentities(trim($_POST['message'])); ?></textarea>
</td></tr><tr><td><td align="right">
<input type="submit" name="go" value="Poster">
</td></tr></table>
</form>
<?php
if (isset($erreur)) echo '<br /><br />',$erreur;
?>
</body>
</html>
Voilà, mais ya cette erreur qui s'affiche toujours.
Merci de votre aide
le 31/01/2014 à 20:37
Erwin
Bonsoir,
Il y a un savant mélange dans ton script inserer_sujet.php. Il y est fait appel à des données reçues en GET et en POST en même temps. Ce n'est pas chose possible, ton script doit forcément être appelé d'une manière et d'une seule. Si ton script doit pouvoir supporter les deux, il te faut utiliser $_REQUEST au lieu de $_GET et $_POST.
Ton formulaire utilisant visiblement la méthode POST, tu devrais remplacer $_GET['numero_du_sujet'] par $_POST['numero_du_sujet'].
Quelques points :
- tu n'as pas protégé cette donnée dans ta requête SQL, la rendant ainsi vulnérable aux injections. Je présume qu'il s'agit d'un identifiant sous forme d'un nombre entier, tu devrais donc utiliser intval() pour sécuriser cette donnée.
- afficher la requête SQL complète en cas d'erreur dans tes die() est à proscrire. Tu donnes en effet trop d'informations utiles aux pirates.
- l'extension MySQL (mysql_connect, mysql_query, etc) est à présent obsolète et sera supprimée dans une prochaine version de PHP. Tu devrais songer à regarder MySQLi (très proche des fonctions mysql_*) et/ou PDO.
PHP Amateur
Erwin, tu es dans l'erreur. Malheureusement, en PHP, on met les paramètres de la search part dans un $_GET, ce qui conduit à ton erreur. Quelque soit la méthode HTTP, la search part est toujours explosée dans $_GET.
Conseiller d'utiliser $_REQUEST ne permet qu'une chose : encourager la confusion, puisque ce tableau fusionne tous les paramètres HTTP (search part, cookie, post data, à l'exception des fichiers en cas de transferts multiparts).
Sinon, globalement, je suis d'accord avec tes précisions.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Ecrire un message
Votre message vient d'être créé avec succès.
BB-Code
Pour insérer une URL clickable
Pour insérer une adresse E-mail
Pour annoter
Pour écrire du code
Pour faire un lien vers une fonction PHP
Pour écrire du texte préformaté
Pour écrire du texte en gras
Pour écrire du texte en italique
Pour écrire du texte souligné
Pour écrire du texte barré
Pour écrire un titre principal
Pour écrire un titre secondaire
Pour écrire une liste
Smiley
:bond:
:boxe:
:bsmile:
:bump:
:clap:
:coeur:
:cool:
:cry:
:eek:
:evil:
:fleur:
:fou2:
:fou:
:grin:
:grrr:
:hammer:
:hippy:
:hum:
:idee2:
:idee:
:kdo:
:king:
:ko:
:lol:
:love2:
:love:
:mad:
:maitre:
:noel:
:oops:
:raa:
:razz:
:roll:
:sad:
:skull:
:smile:
:timide:
:trink:
:vice:
:vomi:
:wink:
:zzz: