Recherche dans base MySQL et affichage du résultat

Eléphanteau du PHP | 39 Messages

01 nov. 2010, 23:21

<?php
//Connexion a MySQL
include('connexion.php');

// le formulaire a bien été posté
if (isset($_POST['recherche'])) {

//le est remplit (pourquoi le test sur zéro ? parce qu'il est considéré comme false
if (!empty($_POST['recherche'])|| ($_POST['recherche']==='0')){

//ici on créer la requete SQl en utilisant $_POST['recherche'] et non recherche, on profite pour utiliser mysql_real_escpe_string pour éviter les injectionsSQL 
$requete = 'select nom, prenom, telfixe, telportable, email, remarque from membre where nom="'.mysql_real_escape_string($_POST['recherche']).'" OR prenom="'.mysql_real_escape_string($_POST['recherche']).'" or telfixe="'.mysql_real_escape_string($_POST['recherche']).'" or telportable="'.mysql_real_escape_string($_POST['recherche']).'" or email="'.mysql_real_escape_string($_POST['recherche']).'" order by nom asc';

//on envoie la requète
$req = mysql_query($requete);

//Affichage d'un message si la requète n'est pas valide
if ($req === false) {
echo 'erreur SQL : '.mysql_error().'<br />'.$requete.'<br />';
}

//si la requete est valide et retourne au moin un enregistrement
else { 
while($result = mysql_fetch_object($req))
if (mysql_num_rows($req)!=0){
echo(" Mon tableau ICI avec récupération des info avec : .$result->nom. ") ;
}

//Si la requète est valide mais qu'elle ne retourne aucun enrtegistrement
else {
echo('Message aucun résultat ici');
}
}
}

//Si rien n'a été saisis dans le formulaire de recherche de la page précédente
else {
echo('Message rien n a été saisis a la page précédente');
}
}
?>
Voila ce que ca donne sans tout le html avec des commentaire en plus
Je précise que mon problème si situe au niveau de la requète apparement, je n'ai aucun enregistrement sans quand préalablement j'ai fais une recherche vide ou ne donnant aaucun résultat.

Je suis perdu la je ne vois pas quel peut-etre le problème.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

01 nov. 2010, 23:48

hum affiche la requete avant de la donner a mmanger au mysql_query et essai la avec phpmyadmin.

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 39 Messages

01 nov. 2010, 23:57

Que je mete :
if ($req === false) {
echo 'erreur SQL : '.mysql_error().'<br />'.$requete.'<br />';
}
avant
$req = mysql_query($requete);
?

Si c'est bien ca je vien d'essayer et ca me retourne l'erreur :
Parse error: syntax error, unexpected T_ELSE in /homepages/17/d233170072/htdocs/membre/membres.php on line 9

J'ai aussi essayer de copier / colle rma requète dans phpmyadmin
$requete = 'select nom, prenom, telfixe, telportable, email, remarque from membre where nom="'.mysql_real_escape_string($_POST['recherche']).'" OR prenom="'.mysql_real_escape_string($_POST['recherche']).'" or telfixe="'.mysql_real_escape_string($_POST['recherche']).'" or telportable="'.mysql_real_escape_string($_POST['recherche']).'" or email="'.mysql_real_escape_string($_POST['recherche']).'" order by nom asc';
Ca me retourne :
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '$requete = 'select nom, prenom, telfixe, telportable, email, remarque from membr' at line 1

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

02 nov. 2010, 00:31

heu wé mais nan :)

tu a
//on envoie la requète
$req = mysql_query($requete);

ajoute juste echo $requete;

donc
//on envoie la requète
echo  $requete;
$req = mysql_query($requete);
et ce que tu doit essayer dans phpmyadmin c'est ce qui va être afficher ;)
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 39 Messages

02 nov. 2010, 00:40

Ah ok alors
Pour une requete qui ne retourne rien (non vide)

MySQL n'a retourné aucun enregistrement. (traitement: 0.0010 sec.)
requête SQL:
SELECT nom, prenom, telfixe, telportable, email, remarque
FROM membre
WHERE nom = "jeanbon"
OR prenom = "jeanbon"
OR telfixe = "jeanbon"
OR telportable = "jeanbon"
OR email = "jeanbon"
ORDER BY nom ASC
LIMIT 0 , 30

Pour une requète qui a retourner 2 enregistrement
Affichage des enregistrements 0 - 1 (2 total, traitement: 0.0010 sec.)
requête SQL:
SELECT nom, prenom, telfixe, telportable, email, remarque
FROM membre
WHERE nom = "milbach"
OR prenom = "milbach"
OR telfixe = "milbach"
OR telportable = "milbach"
OR email = "milbach"
ORDER BY nom ASC
LIMIT 0 , 30

et pour une requète vide
J'ai directement mon message d'information qui apaprais sans exécuter la requète

Le problème se situe donc sur le message quand l'enregistrement n'a pas été trouver.

PS : Je ne comprend vraiment plus rien, mon formulaire fonctionne bien sauf que je n'ai pas le message "Aucune information trouver" quand la base ne retourne rien.

EDIT2: Je crois que je vien de trouver l'origine du problème !
Pour sécuriser mes pages je dois metre le petit code
<?
require("../protec/passe/conf.php3");
$db_link = mysql_connect($sql_serveur,$sql_user,$sql_passwd);

// SELECTION DE L'ENREGISTREMENT CONTENANT L'ID EN COURS
$requete=mysql_db_query($sql_bdd,"select * from membre where id=\"$id\"",$db_link);

// SI L'ID N'EXISTE PAS
if(mysql_num_rows($requete)==0)
	{
	header("Location:$url_erreur");
	}
?>
Es que ca ne serai pas ca qui fausserai les recherche j'ai pu voir que quelques variable sont identique.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

02 nov. 2010, 01:32

çapart dans tous les sens ton truc la :

tu est en php 3 ?

si ton code de "sécurisation" est avant ça ne pose pas de problème pour $requete, par contre s'il utilise une variable $recherche ça peut poser problème (avec l'auto déclaration des variables).

avant d'aller plus loin montre nous
- le create table de la table membre
- un jeux de donnée minimal pour travailler.
- le but de la chose :)

faut reprendre les bases parce que je pige plus rien ;)

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 39 Messages

02 nov. 2010, 01:40

Alors je vais essaye de répondre a tout ça le plus précisement possible:

Deja le but de la chose, j'ai créer un site pour une association, il y a une partie membre avec un lien vers ma page de recherche pour que les membres puissent chercher les coordonnée d'une eprsonne en entrant son nom, prénom, numéro de téléphonne portable ou fixe ou son adresse email.

Donc pour éviter que nimporte qui puissent faire cette recherche j'ai sécuriser toutes les pages de la zone membre par ce script :
<?
require("../protec/passe/conf.php3");
$db_link = mysql_connect($sql_serveur,$sql_user,$sql_passwd);

// SELECTION DE L'ENREGISTREMENT CONTENANT L'ID EN COURS
$requete=mysql_db_query($sql_bdd,"select * from membre where id=\"$id\"",$db_link);

// SI L'ID N'EXISTE PAS
if(mysql_num_rows($requete)==0)
	{
	header("Location:$url_erreur");
	}
?>
qui est avant mon code pour rechercher les membres.

Ensuite la table membre est la suivante :
-- Structure de la table `membre`
-- 

CREATE TABLE `membre` (
  `id` int(11) NOT NULL auto_increment,
  `nom` varchar(30) collate latin1_german2_ci NOT NULL,
  `prenom` varchar(30) collate latin1_german2_ci NOT NULL,
  `email` varchar(90) collate latin1_german2_ci NOT NULL,
  `telfixe` varchar(15) collate latin1_german2_ci NOT NULL,
  `telportable` varchar(15) collate latin1_german2_ci NOT NULL,
  `remarque` text collate latin1_german2_ci NOT NULL,
  KEY `id` (`id`),
  FULLTEXT KEY `remarque` (`remarque`)
) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=10 ;


et pour finir un jeu de données minimal pour travailler :

Eh dsl je n'ai pas compris cette partie :x

Merci pour ton aide

PS: Je suis en php

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

02 nov. 2010, 02:44

j'ai testé ce code
 if (isset($_POST['recherche'])) {
            if (!empty($_POST['recherche'])|| ($_POST['recherche']==='0')){
                mysql_connect('localhost','root','yyRu2TKEvyYpzFLK');
                mysql_select_db('test');
                $requete = 'select nom, prenom, telfixe, telportable, email, remarque from membre 
                    where nom="'.mysql_real_escape_string($_POST['recherche']).'"
                        OR prenom="'.mysql_real_escape_string($_POST['recherche']).'"
                            or telfixe="'.mysql_real_escape_string($_POST['recherche']).'"
                                or telportable="'.mysql_real_escape_string($_POST['recherche']).'"
                                    or email="'.mysql_real_escape_string($_POST['recherche']).'"
                                        order by nom asc';
                echo '<pre>',$requete,'</pre>';
                $res = mysql_query($requete);
                echo '<p>Y ',  mysql_num_rows($res),' tuples</p>';
                while ($data = mysql_fetch_object($res)) {
                    echo '<p>id : '.$data->prenom.' <br /> '.$data->nom.
                        ' <br /> '.$data->telfixe.
                            ' <br /> '.$data->telportable.' <br /> '.$data->email
                            .' <br /> '.$data->remarque.'</p>';
                }
            }
        }
        ?>
        <form action="" method="post">
            <label for="recherche">Recherche ?</label><input type="text" name="recherche" /><br />
            <input type="submit" value="Search" />
        </form>
et ça fonctionne correctement, je trouve bien les infos que j'ai mis dans la table membre et ce au 1er essai.

essai sans ton code de "protection" voir ce que ça donne.
essai aussi juste avec le code ci dessus histoire d’être certain que cela fonctionne pour toi !

Pour php 3 je parle de la version, tu la trouve avec echo phpversion();.

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 39 Messages

02 nov. 2010, 14:44

J'utilise la version 4.4.9 de php

As-tu essayer de faire une recherche qui ne retourne aucun enregistrement ? moi ca ne me mets rien pas meme le message d'information.

Merci

ViPHP
ViPHP | 5462 Messages

02 nov. 2010, 14:55

J'utilise la version 4.4.9 de php

As-tu essayer de faire une recherche qui ne retourne aucun enregistrement ? moi ca ne me mets rien pas meme le message d'information.

Merci
pourquoi la 4.4.9 t'es chez quel hébergeur ?

le barde
Invité n'ayant pas de compte PHPfrance

02 nov. 2010, 16:53

Dans ta requête SQL :
$requete = 'select nom, prenom, telfixe, telportable, email, remarque from membre where nom="'.mysql_real_escape_string($_POST['recherche']).'" order by nom asc';
remplace $_POST['recherche'] par une variable déclarée avant pour éviter les quotes ' qui passent bizarrement d'une page à l'autre.
du genre :
$MyVariable = $_POST['recherche'];
$requete = 'select nom, prenom, telfixe, telportable, email, remarque from membre where nom="'.mysql_real_escape_string( $MyVariable ).'" order by nom asc';

Eléphanteau du PHP | 39 Messages

02 nov. 2010, 17:42

Je suis chez 1et1

Je vais essayer de passer la requète par variable.

Voila donc ma nouvelle requète :
$requete = 'select nom, prenom, telfixe, telportable, email, remarque from membre where nom="'.mysql_real_escape_string( $MyVariable ).'" OR prenom="'.mysql_real_escape_string( $MyVariable ).'" or telfixe="'.mysql_real_escape_string( $MyVariable ).'" or telportable="'.mysql_real_escape_string( $MyVariable ).'" or email="'.mysql_real_escape_string( $MyVariable ).'" order by nom asc';

La recherche se fais mais tjs ce problème : aucun message d'info quand la requete n'a retourner aucune resultat, sinon quand c'est vide, ou qu'il y a un ou plusiuers résultat ca fonctionne correctement.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

03 nov. 2010, 03:17

@le barde : pourquoi doubler une variable ?

Ajoute un test sur le resultat de mysql_num_rows si == zero tu affiche le message qui va bien.

Chez 1&1 si tu veut utiliser php 5 il faut modifier les fichiers de .php a .php5

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 39 Messages

03 nov. 2010, 11:13

Alors le résultat du test avec :
<?php echo mysql_num_rows($req); ?> placer tout a la fin du script me retourne 0 quand personne n'est trouver.

Sinon ca me retourne le nombre de personne trouver.

Eléphanteau du PHP | 39 Messages

03 nov. 2010, 11:25

j'ai testé ce code
 if (isset($_POST['recherche'])) {
            if (!empty($_POST['recherche'])|| ($_POST['recherche']==='0')){
                mysql_connect('localhost','root','yyRu2TKEvyYpzFLK');
                mysql_select_db('test');
                $requete = 'select nom, prenom, telfixe, telportable, email, remarque from membre 
                    where nom="'.mysql_real_escape_string($_POST['recherche']).'"
                        OR prenom="'.mysql_real_escape_string($_POST['recherche']).'"
                            or telfixe="'.mysql_real_escape_string($_POST['recherche']).'"
                                or telportable="'.mysql_real_escape_string($_POST['recherche']).'"
                                    or email="'.mysql_real_escape_string($_POST['recherche']).'"
                                        order by nom asc';
                echo '<pre>',$requete,'</pre>';
                $res = mysql_query($requete);
                echo '<p>Y ',  mysql_num_rows($res),' tuples</p>';
                while ($data = mysql_fetch_object($res)) {
                    echo '<p>id : '.$data->prenom.' <br /> '.$data->nom.
                        ' <br /> '.$data->telfixe.
                            ' <br /> '.$data->telportable.' <br /> '.$data->email
                            .' <br /> '.$data->remarque.'</p>';
                }
            }
        }
        ?>
        <form action="" method="post">
            <label for="recherche">Recherche ?</label><input type="text" name="recherche" /><br />
            <input type="submit" value="Search" />
        </form>
et ça fonctionne correctement, je trouve bien les infos que j'ai mis dans la table membre et ce au 1er essai.

essai sans ton code de "protection" voir ce que ça donne.
essai aussi juste avec le code ci dessus histoire d’être certain que cela fonctionne pour toi !

Pour php 3 je parle de la version, tu la trouve avec echo phpversion();.

@+
Je vien de tester le code j'ai donc :
Pour aucun enregistrement :
select nom, prenom, telfixe, telportable, email, remarque from membre
where nom="personne"
OR prenom="personne"
or telfixe="personne"
or telportable="personne"
or email="personne"
order by nom asc
Y tuples

Le résultat est le même pour 1 ou plusieurs personnes trouver.