8719 sujets

Développement web côté serveur, CMS

Pages :
Bonjour,

Voici MON premier message sur ce forum et donc VOTRE premier défis (hé hé) ...

J'ai un formulaire de recherche FORM_RECHERCHE.PHP:


<form method="POST" action="../Cherche.php">

Entrez un mot clé:<br>

<input type="text" name="Mot" size="15">

<input type="submit" value="Rechercher" alt="Lancer la recherche!">

</form>


Qui transmets la variable à CHERCHE.PHP:

<?php
session_start();?>

<?php include("../Connexion_bdd.php"); ?>
<?php
// ..................... mon code ici ................

//Puis on boucle le tout pour tout afficher
$i=1;
while($row = mysql_fetch_array($result)) 
{ 
    echo '<div id="Contenu'.$i.'"><a href="../../Fonctions/Affichage_contenu.php?titre_article=
'.$row['up_titre_article'].'&amp;up_id_recherche='.$row['up_id'].'" target="_blank">'.$row['up_titre_article'].'<a></div>';
	$i++ ;
}
            mysql_free_result($result);
}
}

// on ferme la base
mysql_close();

?>


Et pour finir la page d'affichage du contenu de l'article rechercher AFFICHAGE_CONTENU.PHP:

<?php include("../Fonctions/Connexion_bdd.php");?>
<?php
// On fait la requête pour afficher la liste des news concernant la rubrique "concernée"
$_GET['titre_article'] = $row['up_titre_article'];
$_GET['up_id_recherche'] = $row['up_id'];

$article = $_GET['titre_article'];
$id = $_GET['up_id_recherche'];

$requete_contenu = mysql_query("SELECT up_description FROM upload_fichier ORDER BY up_id DESC LIMIT 0, 10");

//Puis on boucle le tout pour tout afficher
while($row = mysql_fetch_array($requete_contenu)) 
{
    echo '<div id="News">'.$row['up_description'].'<a></div>'; 
}

// on ferme la base
mysql_close();
?>


Je n'arrive pas à lui faire afficher uniquement le contenu de l'article selectionné.

Que faut-il changer dans cette ligne là ?

$requete_contenu = mysql_query("SELECT up_description FROM upload_fichier ORDER BY up_id DESC LIMIT 0, 10");


Je pensais rajouter un truc du genre:

$requete_contenu = mysql_query("SELECT up_description FROM upload_fichier WHERE up_id = '.$id.'");


En me servant de mes déclarations de variables précédentes mais rien n'y fait:

$_GET['titre_article'] = $row['up_titre_article'];
$_GET['up_id_recherche'] = $row['up_id'];

$article = $_GET['titre_article'];
$id = $_GET['up_id_recherche']; 


Ca m'affiche tjs une page blanche ... j'ai essayé plusieurs écritures du code WHERE up_id = mais ça ne fonctionne jamais ...

Sauriez-vous d'ou cela peut venir ?
Modifié par Jackisback (23 Oct 2008 - 10:21)
Hello Jackisback,

Le mieux serait de poster directement sur un forum d'entraide php car ta demande est très spécifique et je ne sais pas s'il y a beaucoup de pro en php sur Alsacreations.

En tout cas moi je ne le suis pas Smiley lol

@+
Il le manque une requete SQL dans cherche.php

Où est ce que tu gères la sélection des données dans ton fichier avec la variable $_POST['Mot'] ? Je ne vois rien là.
Il nous manque une requete sql ici:

// ..................... mon code ici ................



//Puis on boucle le tout pour tout afficher

$i=1;

while($row = mysql_fetch_array($result)) 


Ce serait bien que tu nous la montre, histoire qu'on sache quel type de recherche tu veux effectuer..
Bonjour,

Voici le code complet de CHERCHE.PHP:

<?php
if(isset($_POST["Mot"])) $Mot = mysql_real_escape_string($_POST['Mot']);
else $Mot = "";

echo "
<html>
<head>
<title>Résultat de la recherche</title>
</head>
<body>";

if (($Mot == "")||($Mot == "%")) 
	{echo "Veuillez entrer un mot clé s'il vous plaît!<p>";}
// Si aucun mot clé n'a été saisi,
// le script demande à l'utilisateur
// de bien vouloir préciser un mot clé

else {
// On selectionne les enregistrements contenant le mot clé
// dans les keywords ou le titre
	$requete = "SELECT distinct count(up_lien) FROM upload_fichier
	WHERE inscr_pseudo LIKE \"%$Mot%\"
	OR up_titre_article LIKE \"%$Mot%\"
	OR up_rubrique LIKE \"%$Mot%\"
	OR up_description LIKE \"%$Mot%\"
	OR up_finalname LIKE \"%$Mot%\"
	";

	$result = mysql_query($requete);
	$row = mysql_fetch_row($result);
	$Nombre = $row[0];

// Si aucun enregistrement n'est retourné,
// on affiche un message adéquat
if ($Nombre == "0") 
	{echo "<h3>Aucun résultat ne correspond à  votre recherche</h3><p>";}

// Sinon, on affiche le nombre d'enregistrements correspondant
// et les résultats eux-mêmes
else {
	$requete = "SELECT distinct inscr_pseudo, up_titre_article, up_rubrique, up_description, up_lien FROM upload_fichier
	WHERE inscr_pseudo LIKE \"%$Mot%\"
	OR up_titre_article LIKE \"%$Mot%\"
	OR up_rubrique LIKE \"%$Mot%\"
	OR up_description LIKE \"%$Mot%\"
	OR up_finalname LIKE \"%$Mot%\"
	ORDER by up_titre_article ASC";

	$result = mysql_query($requete);

	// Si un seul enregistrement est trouvé on affiche un message au singulier
	if ($Nombre == "1") 
	{echo "<a name=\"#resultat\"><h2>Résultat: Un article trouvé</h2></a><p>";}

	// Dans le cas contraire le message est au pluriel...
	else 
	{echo "<a name=\"#resultat\"><h2>Résultat: $Nombre articles trouvés</h2></a><p>";}

//Puis on boucle le tout pour tout afficher
$i=1;
while($row = mysql_fetch_array($result)) 
{ 
    // echo '<div id="Contenu'.$i.'"><a href="../../Fonctions/Affichage_contenu.php?voir_contenu='.$row['up_id'].'" target="_blank">'.$row['up_titre_article'].'<a></div>';
    echo '<div id="Contenu'.$i.'"><a href="../../Fonctions/Affichage_contenu.php?titre_article='.$row['up_titre_article'].'&up_id_recherche='.$row['up_id'].'" target="_blank">'.$row['up_titre_article'].'<a></div>';
	$i++ ;
}

            mysql_free_result($result);
}
}

// on ferme la base
mysql_close();

?>


Merci de votre aide ...

Je ne sais pas effectivement si beaucoup de gens pourront m'aider ici mais on ne sait jamais ...

Ce que je demande n'est peut etre pas compliqué pour certains.

Bonne journée.
Salut,

Si ça ne marche pas, il faut débugger ton code ... Que renvoie la fonction mysql_query(), à quoi ressemblent tes requêtes SQL une fois que les variables ont été remplacées par leur valeur ? etc.

Sinon, il y a une requête inutile dans ton script. Tu peux très bien faire le deuxième SELECT directement, et utiliser mysql_num_rows() pour déterminer le nombre de résultats renvoyés.
$query = 'SELECT distinct inscr_pseudo, up_titre_article, up_rubrique, up_description, up_lien FROM upload_fichier
	WHERE inscr_pseudo LIKE "%'.$Mot.'%"
	OR up_titre_article LIKE "%'.$Mot.'%"
	OR up_rubrique LIKE "%'.$Mot.'%"
	OR up_description LIKE "%'.$Mot.'%"
	OR up_finalname LIKE "%'.$Mot.'%"
	ORDER by up_titre_article ASC';
[#red]var_dump($query);  # debug[/#]

$result = mysql_query($query) [#red]or die(mysql_error());  # debug[/#];

$num_results = mysql_num_rows($result);

if ($num_results == 0)
{
    echo 'Aucun résultat.';
}
else
{
    if ($num_results == 1) 
    {
         echo '1 résultat';
    }
    else
    {
        echo $num_results.' résultats';
    }
    while ($array = mysql_fetch_array($result))
    {
        [#red]var_dump($array)  # debug[/#]
        # Affichage des résultats ...
    }
}
Juste une question comme ça, en passant...
<a href="../../Fonctions/Affichage_contenu.php?voir_contenu='.[b]$row['up_id'][/b].'" target="_blank">


Comment veux tu récupérer la valeur de $row['up_id'] s'il n'est pas dans la requête?
$requete = "SELECT distinct
    inscr_pseudo,
    up_titre_article,
    up_rubrique,              [b]<== Il est où "up_id" ??[/b]
    up_description,
    up_lien
FROM upload_fichier
WHERE ...
Quand j'écris:

var_dump($array);  # debug


Et que je fais une recherche il m'affiche NULL.

Pour ce qui est de l'oubli de UP_ID et bien comment dire ... euh ... je vois que tu es attentif je te donne 1 bon point... continue comme ça ...

Non j'avais complètement pas fait attention à ça ...

Je l'ai ajouté et quand je fais une recherche lorsque j'approche le curseur du resultat trouvé il m'affiche .......up_id=xxx (ou xxx et la bonne valeur de l'article) Donc là c'est nickel ...

Par contre maintenant quand je clique sur le resultat il m'affiche tjs la même chose mais la je pense que ça se passe dans la page AFFICHAGE_CONTENU.PHP ... je vais regarder de nouveau ma requete ....

En tout cas merci déjà beaucoup pour votre aide ...

Pour rappel voici le script d'affichage_contenu.php:

<?php
// On fait la requête pour afficher la liste des news concernant la rubrique "concernée"
$_GET['titre_article'] = $row['up_titre_article'];
$_GET['up_id_recherche'] = $row['up_id'];

$article = $_GET['titre_article'];
$id = $_GET['up_id_recherche'];

$requete_contenu = mysql_query("SELECT up_description FROM upload_fichier WHERE up_id = '.$id.' ORDER BY up_id DESC LIMIT 0, 10");

//Puis on boucle le tout pour tout afficher
while($row = mysql_fetch_array($requete_contenu)) 
{
    echo '<div id="News">'.$row['up_description'].'<a></div>'; 
}

// on ferme la base
mysql_close();
?>


J'ai ajouté
WHERE up_id = '.$id.'
et ça fonctionne différement maintenant ... il m'affiche une page blanche vierge ....
Modifié par Jackisback (21 Oct 2008 - 13:36)
Re.

Qu'est-ce que tu essaies de faire exactement avec les lignes suivantes ?
// On fait la requête pour afficher la liste des news concernant la rubrique "concernée"
$_GET['titre_article'] = $row['up_titre_article'];
$_GET['up_id_recherche'] = $row['up_id'];
Bah en fait pas grand chose c'était plus un essai que j'ai fait car avec ou sans le resultat est le même donc je dirais que je peux les enlever ...

Ca ne sert à rien car pour
$row['up_id']
, il n'y a aucune requete avant donc ......

J'avais du lire ça quelque part et j'avais voulu essayé ....

Je vais les enlever ...

Il n'y a que
$_GET['titre_article']
qui est transmise ...
Modifié par Jackisback (21 Oct 2008 - 13:47)
Thomas D. a écrit :
Re.

Qu'est-ce que tu essaies de faire exactement avec les lignes suivantes ?
// On fait la requête pour afficher la liste des news concernant la rubrique "concernée"
$_GET['titre_article'] = $row['up_titre_article'];
$_GET['up_id_recherche'] = $row['up_id'];



J'allais poser la même question. J'étais en train de me demander ce qu'il avait mis comme requête avant Smiley langue

Sinon Jacki, travaille avec:
error_reporting(E_ALL|E_STRICT);

(place cette ligne dès le début de ton fichier php, de bdd par exemple vu qu'il est en haut de tes pages, mais enlève -ou modifie- le plus tard)
Ca te permettra de débusquer ce genre d'erreur stupide, et tu éviteras de laisser passer certains bug que l'on aurait pas vu.
Cela ne corrige pas le problème je sais, mais au moins ça en prévient d'autre.
Exemple:
// On fait la requête pour afficher la liste des news concernant la rubrique "concernée"
$_GET['titre_article'] = $row['up_titre_article'];
$_GET['up_id_recherche'] = $row['up_id'];


Dans le code, vu que $row n'existait pas (il n'y a pas de requête avant, tu l'as dit) il t'aurait affiché une erreur.


Qu'est ce qui ne va pas exactement avec ton script maintenant?
Le fait qu'il n'y ait que $_GET['titre_article'] qui soit transmis?
Ah ouais nickel j'ai essayé de remettre les deux variables et ça me met un message d'erreur ...

Je vais essayé sur mes autres pages ...

Et bien en fait ce qui ne va pas maintenant c'est que je n'arrive pas à lui faire afficher le contenu de la news cliquée ...

J'ai modifié un peu le code en ajoutant var_dump, le voici:

<?php include("../Fonctions/Connexion_bdd.php");?>
<?php
error_reporting(E_ALL);

// On fait la requête pour afficher la liste des news concernant la rubrique "concernée"
$article = $_GET['titre_article'];
$id = $_GET['up_id_recherche'];

echo $id;
echo $article;

$requete_contenu = "SELECT up_description FROM upload_fichier WHERE up_id = '.$id.' AND up_titre_article = '.$article.'";
var_dump($requete_contenu);  # debug

$result = mysql_query($requete_contenu) or die(mysql_error());  # debug;

//Puis on boucle le tout pour tout afficher
while($row = mysql_fetch_row($result))
{
var_dump($row);  # debug
	echo '<div id="News">'.$row['up_description'].'<a></div>';
}

// on ferme la base
mysql_close();
?>


Et il m'affiche ceci:

80article genial 21111string(110) "SELECT up_description FROM upload_fichier WHERE up_id = '.80.' AND up_titre_article = '.article genial 21111.'" 


80 -> ID de l'article
article genial 21111 -> Titre de l'article
string(110) "SELECT up_description FROM upload_fichier WHERE up_id = '.80.' AND up_titre_article = '.article genial 21111.'" -> Bah la requete (comme tu l'aurais compris)

Et je ne vois pas ou ça coince ...

Je lui dis tu me selectionnes up_description dans ma BDD ou l'id = x et le titre = y et il ne m'affiche aucun contenu ..

Et OUI il y a un contenu dans mon article en BDD, j'ai pensé à regarder ....
Je donne une première solution, ensuite je t'explique:
Remplace:

$requete_contenu = "SELECT up_description FROM upload_fichier WHERE up_id = '.$id.' AND up_titre_article = '.$article.'";

par

$requete_contenu = "SELECT up_description FROM upload_fichier WHERE up_id = '$id' AND up_titre_article = '$article'";


Ici, tu mes dans ta variable, une chaîne de caractère entre double quote ( "..." ) donc les variable qu'il y a dedans sont analysées.
Avant de lire la suite de ma réponse, je t'invite à lire ceci








C'est bon?










Tu as lu?







Revoila le lien au cas où






Bon, tant pis... Smiley lol




Maintenant, on va coder un peu plus proprement.
Ce que j'ai dit de remplacer tout à l'heure, tu le remplace par ça:
$requete_contenu = sprintf("SELECT up_description FROM upload_fichier WHERE up_id = '%i' AND up_titre_article = '%s'", $id, mysql_real_escape_string($article));


Ceci pour prévenir toute attaque par injection

A la place de "mysql_real_escape_string" tu pourrais utiliser cette fonction, trouvée sur le site de php:

function mysql_prep($value){
    $magic_quotes_active = get_magic_quotes_gpc();
    $new_enough_php = function_exists("mysql_real_escape_string");
    // i.e PHP >= v4.3.0
    if($new_enough_php){
    //undo any magic quote effects so mysql_real_escape_string can do the work
    if($magic_quotes_active){
        $value = stripslashes($value);
    }
    $value = mysql_real_escape_string($value);
    }else{ // before PHP v4.3.0
        // if magic quotes aren't already on this add slashes manually
        if(!$magic_quotes_active){
            $value = addslashes($value);
        } //if magic quotes are avtive, then the slashes already exist
    }
    return $value;
}


N'oublie pas de placer cette fonction dans un de tes fichiers header, qu'elle soit disponible partout.




(je sais pas pourquoi, mais je vais devoir réexpliquer là non? Smiley cligne )
Alors ...

J'ai lu une partie mais pas tout, il y en a un peu trop pour le temps que j'ai de dispo tout de suite.

La première fois ou tu m'as demandé de remplacer le code, ça fonctionnait, il m'affichait le contenu de l'article selectionné un peu plutot.

Par contre à la fin quand tu m'as dis "Maintenant, on va coder un peu plus proprement.
Ce que j'ai dit de remplacer tout à l'heure, tu le remplace par ça:"

Je l'ai fais et effectivement pour etre plus propre c'est plus propre ---> Il m'affiche une page blanche ..... snif ....

Et sinon pour le code que tu m'as donné tout à la fin, celui pour me proteger des méchantes injections et tout et tout, je peux l'utiliser tel quel, parceque je ne vois rien à modifier ?
Autant pour moi, ce n'était pas %i mais %d (qu'est ce qui m'est passé par la tête -_-)

Donc, ce n'est pas:
$requete_contenu = sprintf("SELECT up_description FROM upload_fichier WHERE up_id = '%i' AND up_titre_article = '%s'", $id, mysql_real_escape_string($article));

Mais:
$requete_contenu = sprintf("SELECT up_description FROM upload_fichier WHERE up_id = '%d' AND up_titre_article = '%s'", $id, mysql_real_escape_string($article));


Pour ce qui est de la fonction mysql_prep que je t'ai filée dans mon post plus haut, tu la place dans connexion_bdd.php par exemple.
Ensuite, au lieu d'utiliser "mysql_real_escape_string" (dans le code que je viens de te filer ) utilise "mysql_prep".

Déjà, va jusque là voir si ça marche.
Je te préviens que tu auras peut-être des " \\\' " qui vont apparaitre dans tes champs, mais c'est très facilement règlable Smiley cligne
Bonjour,

J'ai fais la modif que tu m'as conseillée plus haut et ça fonctionne nickel ...

Par contre je n'ai pas regardé pour l'histoire des "mysql_prep".

J'ai quand meme un soucis, quand je fais une recherche et que je tombe sur un article qui à pour titre "L\'ORGANISATION" (par ex) et bien il m'affiche une page vierge alors que pour les autres il m'affiche le contenu.

Tu avais raison j'ai des \\\ .

N'y aurait-il pas un rapport avec des addslashes ou un truc comme ça ? certainement une fonction a ajouter qui supprime les slashes ou qui formate le texte avant de l'afficher ? c'est ça non ???

-----------------

EDIT:

Il parait q'il faut eviter les addslashes ? est-ce vrai ...

J'ai lu de regarder plutot ceci:

http://php.developpez.com/faq/?page=securite#securite-injection

et non pas :

http://fr.php.net/manual/fr/function.addslashes.php

Qu'en penses-tu ?

---------------------

RE-EDIT:

Tu me conseilles de mettre ton code avec le "mysql_prep" dans connexion_bdd.php car il est en début de page mais dans toute mes autres pages il n'est pas en début de code ... est-ce important ? car j'ai au moins le session_start et ensuite le DOCTYPE et après un j'ai connexion_bdd.php ...
Modifié par Jackisback (22 Oct 2008 - 08:11)
Oui, et c'est exactement ce que je t'ai fait faire Smiley cligne

En fait, mysql_real_escape_string n'est apparue que dans la version 4.3 de php si je ne me trompe. Ne sachant pas quelle version tu utilise, je t'ai proposé une méthode plus sure.

Sinon, pour les truc des \\\ :

Lorsque tu récupère tes données texte...


Arf merde, je viens de voir ce qui cloche -_-

Lorsque tu as enregistré tes articles, tu n'as pas nettoyé leur nom.
Du coup, il y en a qui ont des quillemets simple et ça plante...

A toi de voir, deux possibilités:
- Abandonner le "mysql_real_escape_string" ou "mysql_prep" et donc prendre le risque de te faire hacker facilement. Je pense que je n'ai pas besoin de te dire que je te le déconseille...
- Ajouter une colonne dans ta table Articles, où tu met le nom de l'article nettoyé (tout espace ou caractère spécial remplacé par _ )
-
En fait j'avais déjà fait une colonne qui s'appelle "up_finalname" mais c'était pour les noms des fichiers uploadés ...

Je vais en rajouter une pour le titre de l'article ...

Par contre dans le contenu de l'article ça risque de faire pareil à l'affichage ???

---------------

EDIT:

Euh ouais dans ma BDD, dans ma colonne "up_titre_article", pour ex, j'en ai un qui s'intitule "L\'histoire de la vie" ... effectivement il y a les \
Modifié par Jackisback (22 Oct 2008 - 11:05)
Pages :