2 requètes

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : 2 requètes

par AB » 14 janv. 2008, 21:36

Et bien tant mieux :)

Un plus indispensable pour grandir plus vite est de connaitre les bonnes méthodes pour débugguer le code. Il doit y avoir déjà quelques sujets à ce propos sur le forum. Jettes-y un oeil (ou même les deux), tu ne perdras pas ton temps.

Je dis ça aussi parce que tu as bien de la chance que le code fonctionne tel quel puisqu'il à été écrit sans être testé. Souvent il faut faire quelques corrections ou ajustements ici et là :wink:

merci

par karenma » 14 janv. 2008, 14:47

salut

Merci à tous ça marche
grace à vous tous :
petit à petit je deviens moins petite :wink:

BYE!!

par Xenon_54 » 14 janv. 2008, 05:57

$sql= "SELECT texte FROM annonce WHERE categorie = '" . $quoi . "' AND departement = '" . $endroit . "'";
Pourquoi utiliser la concaténation alors que la chaîne interprète déjà les variables? :)
$sql= "SELECT texte FROM annonce WHERE categorie = '$quoi' AND departement = '$endroit'";
Je trouve personnellement que c'est beaucoup plus lisible et tout aussi valable. :P

par AB » 14 janv. 2008, 05:54

C'est vrai que c'est beaucoup plus élégant.

Et l'on peut encore simplifier pour l'ensemble
<?php

$liendb = mysql_connect("nomduserveur","identifiant","pass");
mysql_select_db ("nomdelabase");

function protection(&$value) {
$value = (get_magic_quotes_gpc())? mysql_real_escape_string(stripslashes(trim($value))) : mysql_real_escape_string(trim($value));
return $value;
}

$quoi = !empty($_POST['quoi'])? protection($_POST['quoi']) : '';
$endroit = !empty($_POST['endroit'])? protection($_POST['endroit']) : '';

$sql= "SELECT texte FROM annonce WHERE categorie = '" . $quoi . "' AND departement = '" . $endroit . "'"; 

if (empty($_POST['mot']) === FALSE) {
    
  $tab = explode(' ', $_POST['mot']);
  array_walk($tab, 'protection');
  $IN = implode("','", $tab);

  $sql .=  " AND motcle1 IN ('$IN')";
}


$resultat =mysql_query($sql) or die (mysql_error());
$nb_lignes = mysql_num_rows($resultat);
$nb_colonnes = mysql_num_fields($resultat); ?>

par Xenon_54 » 14 janv. 2008, 04:53

Ou encore plus court:
$sql = "SELECT texte FROM annonce WHERE categorie = '$quoi' AND departement = '$endroit'";

if (empty($_POST['mot']) === FALSE) {
    
  $tab = explode(' ', $_POST['mot']);
  array_walk($tab, create_function('&$v,$k', '$v = mysql_real_escape_string(stripgpc($v));'));
  $IN = implode("','", $tab);

  $sql .=  " AND motcle1 IN ('$IN')";
}
:)

par AB » 14 janv. 2008, 04:37

Ou tu pourrais également utiliser la clause WHERE... IN

Dans ce cas tes requêtes pourraient ressembler à
if (empty($_POST['mot']))  
$sql= "SELECT texte FROM annonce WHERE categorie = '" . $quoi . "' AND departement = '" . $endroit . "'";  
else  
{
$sql = "SELECT texte FROM annonce WHERE categorie= '" . $quoi . "' AND departement = '" . $endroit . "' AND motcle1 IN (";  

$tab = explode(' ', $_POST['mot']);
foreach ($tab as $key => $value) {
if ($key == 0) $sql .= '\'' . mysql_real_escape_string(stripgpc($value)) . '\'';
else
$sql .= ',\'' . mysql_real_escape_string(stripgpc($value)) . '\'';
}
$sql .= ")";
} 
et en optimisant un peu :
$sql = "SELECT texte FROM annonce WHERE categorie = '" . $quoi . "' AND departement = '" . $endroit . "'";

if (!empty($_POST['mot']))  {
$sql .= " AND motcle1 IN (";
$tab = explode(' ', $_POST['mot']);
foreach ($tab as $key => $value) {
if ($key == 0) $sql .= '\'' . mysql_real_escape_string(stripgpc($value)) . '\'';
else
$sql .= ',\'' . mysql_real_escape_string(stripgpc($value)) . '\'';
}
$sql .= ")";
}

par AB » 13 janv. 2008, 23:15

Sur le principe tu fais un explode sur la valeur envoyée par le champ texte
$tab = explode(' ', $_POST['tex']);

Tu liste les éléments tu tableau $tab et en fonction du résultat tu crée ta requête de façon dynamique comme te l'a montré Ryle (son exemple va te servir plus vite que prévu ) :wink:

pour obtenir
WHERE voiture = 'renault' OR voiture ='peugeot' etc.

2 ou 3 mots differents

par karenma » 13 janv. 2008, 12:22

Salut

Un grand merci pour vos réponses ça marche et aussi merci pour l'infos concernant l'apostrophe.

j'ai essayé le code suivant et ça marche.
<?php 

function stripgpc($value) { 
if(get_magic_quotes_gpc()) $value = stripslashes($value); 
return $value; 
} 

$liendb = mysql_connect("nomduserveur","identifiant","pass"); 
mysql_select_db ("nomdelabase"); 

$quoi = !empty($_POST['quoi'])? mysql_real_escape_string(stripgpc($_POST['quoi'])) : ''; 
$endroit = !empty($_POST['endroit'])? mysql_real_escape_string(stripgpc($_POST['endroit'])) : ''; 
$mot = !empty($_POST['mot'])? mysql_real_escape_string(stripgpc($_POST['mot'])) : ''; 

if (empty($_POST['mot']))  
$sql= "SELECT texte FROM annonce WHERE categorie = '" . $quoi . "' AND departement = '" . $endroit . "'";  
else  
$sql = "SELECT texte FROM annonce WHERE categorie= '" . $quoi . "' AND departement = '" . $endroit . "' AND motcle1 = '" . $mot . "'"; 

$resultat =mysql_query($sql) or die (mysql_error()); 
$nb_lignes = mysql_num_rows($resultat); 
$nb_colonnes = mysql_num_fields($resultat); ?> 
Mais je me demandais aussi par exemple si dans le champs texte on tape 2 ou 3 mots clés comme
peugeot renault opel comment faire afficher tout les résultats de requète et pas la requète qui contient les 3 mots clés.
je ne sais pas si c'est possible et si oui comment faire?
Merci d'avance pour votre réponse.

par AB » 11 janv. 2008, 18:21

Oulà ! et si tu nous montre tout ton code il y a d'autres fautes.. Tu ne définis pas tes variables $quoi , $departement et $mot avant de les utiliser dans tes requêtes #-o

Une fois corrigé la partie requête cela devrait donner quelque chose comme ça
<?php

function stripgpc($value) {
if(get_magic_quotes_gpc()) $value = stripslashes($value);
return $value;
}

$liendb = mysql_connect("nomduserveur","identifiant","pass");
mysql_select_db ("nomdelabase");

$quoi = !empty($_POST['quoi'])? mysql_real_escape_string(stripgpc($_POST['quoi'])) : '';
$endroit = !empty($_POST['endroit'])? mysql_real_escape_string(stripgpc($_POST['endroit'])) : '';
$mot = !empty($_POST['mot'])? mysql_real_escape_string(stripgpc($_POST['mot'])) : '';

if (empty($_POST['mot'])) 
$sql= "SELECT texte FROM annonce WHERE categorie = '" . $quoi . "' AND departement = '" . $endroit . "'"; 
else 
$sql = "SELECT texte FROM annonce WHERE categorie= '" . $quoi . "' AND departement = '" . $endroit . "' AND motcle1 = '" . $mot . "'";

$resultat =mysql_query($sql) or die (mysql_error());
$nb_lignes = mysql_num_rows($resultat);
$nb_colonnes = mysql_num_fields($resultat); ?>
Pourquoi j'ai ajouté une petite fonction stripgpc ? La réponse ici http://www.phpfrance.com/forums/voir_re ... php#228257

Cela te permettras de pouvoir inclure des mots avec apostrophe (ex: cote d'or) sans rencontrer de pb de configuration de serveur. Chez free par exemple, get_magic_quotes_gpc() est activé donc sans cette petite fonction, ta requête échouaierait puisque le mot recherché serait : cote d\'or

par AB » 11 janv. 2008, 18:10

Ton code de plus haut avec les les variables extraites donne ça.
<?php
$liendb = mysql_connect("nomduserveur","identifiant","pass");
mysql_select_db ("nomdelabase");
if (empty($_POST['mot']))
$sql= "SELECT texte FROM annonce WHERE categorie = '" . mysql_real_escape_string($quoi) . "' AND departement = '" . mysql_real_escape_string($endroit) . "'"; 
else 
$sql = "SELECT texte FROM annonce WHERE categorie= '" . mysql_real_escape_string($quoi) . "' AND departement = '" . mysql_real_escape_string($endroit) . "' AND motcle1 = '" . mysql_real_escape_string($mot) . "'";
$resultat =mysql_query($sql) or die (mysql_error());
$nb_lignes = mysql_num_rows($resultat);
$nb_colonnes = mysql_num_fields($resultat);
echo "<table  border=1 width=100% >";
for ($i=0; $i<$nb_lignes; $i++)
{
echo "<tr>";
for ($j=0; $j<$nb_colonnes; $j++)
echo "<td>".mysql_result($resultat,$i,$j)."</td>";
echo"</tr>";

}
echo"</table>";
echo "$texte";


mysql_close($liendb);
?>
Ryle t'a proposé une petite amélioration. Il y a bien un if dans son code : if (!empty($request['mot'])) qui complète la requête si !empty($request['mot'] existe et est non vide.
Ce que t'a proposé Ryle est plus optimisé mais ça produira le même résultat. Evidemment si tu ne connais pas la concaténation de chaines ça te fait ça de plus à comprendre mais c'est un bon exemple didacticiel :wink:

EDIT j'ai corrigé ton code suivant la remarque de Ryle ($_POST['mot'] à la place de $request['mot'])

par Ryle » 11 janv. 2008, 18:06

Au niveau code c'est la même chose effectivement, je me suis juste contenté de mutualiser le début de la requête qui est identique dans les deux cas pour ne l'avoir qu'une seule fois. Cela allège ton code et facilite la maintenance puisqu'en cas de correction ou d'évolution, les modifs à faire dessus ne se font pas en double ;)

Concernant le problème du au fait que le champ texte soit vide ou non qui ne change rien, c'est sans doute parce que la variable que tu testes " $request['mot'] " n'existe pas. Du coup, c'est toujours la requête sans ce critère qui est exécutée.
Si tu veux faire appel aux variables qui ont été transmises à ta page dans la requête http, c'est $_REQUEST qu'il te faut utiliser (avec le sousligné et les majuscule, php est très pointilleux avec ses variables ;)). Tu pourrais aussi utiliser $_POST['mot'] puisque le formulaire envoi les données en post :)

champs vide

par karenma » 11 janv. 2008, 17:55

Salut

j'ai essayé ce code
$sql= "SELECT texte  
  FROM annonce  
  WHERE categorie= '" . mysql_real_escape_string($quoi) . "'  
  AND departement = '" . mysql_real_escape_string($endroit) . "'";  

if (!empty($request['mot']))  
  $sql.= " AND motcle1='".mysql_real_escape_string($mot)."'";
et j'ai tjrs la même réponse aux requetes que le champs texte soit vide ou pas vide


sinon je n'est pas très bien compris ce code est ce que je ne dois pas mettre de if??

sinon n'est ce pas la même chose que ce que j'ai posté

$sql= "SELECT texte FROM annonce WHERE categorie = '" . mysql_real_escape_string($quoi) . "' AND departement = '" . mysql_real_escape_string($endroit) . "'"; 
else 
$sql = "SELECT texte FROM annonce WHERE categorie= '" . mysql_real_escape_string($quoi) . "' AND departement = '" . mysql_real_escape_string($endroit) . "' AND motcle1 = '" . mysql_real_escape_string($mot) . "'"; 


enfin je suis un peu perdue puis je avoir une aide merci d'avance.

par AB » 11 janv. 2008, 17:43

Les espaces à droite et à gauche de mysql_real_escape_string et du point voisin sont là pour améliorer la sécurité de la requêtes
Euh... la lisibilité surtout parce que côté sécurité, l'espace fait pas grand chose :)
(et j'ai vu pour sprintf ;))
A bah j'avais lu ca il y a longtemps, avant que la fonction mysql_real_escape_string() soit disponible. Aujourd'hui c'est peut-être superflu mais avant il semble me souvenir que ça avait son utilité :-k

Enfin bref je ne me suis plus posé la question depuis bien longtemps puisque de toute façon comme tu le dis, au minimum ça améliore la lisibilité :)

par Ryle » 11 janv. 2008, 17:27

Tu peux même construire ta requête en concaténant les morceaux de SQL dont tu as besoin plutôt que de devoir écrire deux fois la même requête à un critère près :)
$sql= "SELECT texte 
  FROM annonce 
  WHERE categorie= '" . mysql_real_escape_string($quoi) . "' 
  AND departement = '" . mysql_real_escape_string($endroit) . "'"; 

if (!empty($request['mot'])) 
  $sql.= " AND motcle1='".mysql_real_escape_string($mot)."'";
A noter que $request (que tu utilises dans ton if()) et $_REQUEST (qui contient les données envoyée en get ou post) sont deux variables totalement différentes... :)
Les espaces à droite et à gauche de mysql_real_escape_string et du point voisin sont là pour améliorer la sécurité de la requêtes
Euh... la lisibilité surtout parce que côté sécurité, l'espace fait pas grand chose :)
(et j'ai vu pour sprintf ;))

par AB » 11 janv. 2008, 17:14

Tes requêtes sont mal écrites. Une variable entre simple quote ' n'est pas interprétée. Il faut extraire toutes tes variables de la chaine comme ceci
$sql= "SELECT texte FROM annonce WHERE categorie = '" . mysql_real_escape_string($quoi) . "' AND departement = '" . mysql_real_escape_string($endroit) . "'";
else
$sql = "SELECT texte FROM annonce WHERE categorie= '" . mysql_real_escape_string($quoi) . "' AND departement = '" . mysql_real_escape_string($endroit) . "' AND motcle1 = '" . mysql_real_escape_string($mot) . "'"; 
(Quand tu écrit du code php dans le forum penses à utiliser la balise PHP plutôt que Code.)

Les espaces à droite et à gauche de mysql_real_escape_string et du point voisin sont là pour améliorer la sécurité de la requêtes, évites de les supprimer.