Bonjour tous le monde,
Je cherche de l'aide, cela fait 4 jous que je suis dessus et je suis perdu dans mon code, je voie pas ou cela bloque.
Je cherche a réaliser un moteur de recherche Multicritère en PHP et MYSQL.
$i = 0;
echo $avec_photo = $_GET['avec_photo'];
echo $genre = $_GET['genre'];
if(!empty($genre)) { $choix[$i++] = "re.gender LIKE '$genre'"; }
if(!empty($avec_photo)) { $choix[$i++] = "pr.img_status LIKE '$avec_photo'"; }
$critere = $choix[0]." ";
for($j=1;$j<$i;$j++)
{
$critere .= " AND ".$choix[$j]." ";
}
if($i > 0)
{
$reponse13 = $bdd->query("SELECT * FROM user_profile pr, user_reg re WHERE re.id = pr.user_id
AND $critere");
while ($donnees13 = $reponse13->fetch());
} else {
echo"<center><h6>Merci de selectioner un critère de recherche</h6></center>";
}
Quant je ne choisie aucun critère de recherche j'ai bien la phrase "Merci de selectioner un critère de recherche", mais quent je choisie un genre comme un chat, chien, poisson ...
J'ai rien pas de résultat, mais mon echo $genre = $_GET['genre']; m'affiche bien mon choix, ma requte a etait tester dans MYSQL et fonctionne très bien.
Je ne voie pas pourquoi cela pêche.
Aider moi SVP.
Tu m'étonnes que tu es perdu dans ton code X-D Ca fait peur...
Il faudrait le réécrire intégralement en utilisant des fonctions php..!
On dirait du C, ton code :-s
Donc, premièrement, tout ce qui provient de l'utilisateur (GET, POST) doit être contrôlé via les fonctions de filtrage!
Et deuxièmement, php propose tout un tas de fonctions qui permettent de rendre un code parfaitement lisibe ;-)
Je te retape tout ça au propre cet aprèm..!
Merci beaucoup de ton aide Psylozoff,
Je comprend pas pourquoi tu me dit ce cela est mal ecris.
J'attend avec imptience ton exemple.
Merci beaucoup,
Je ne dis pas que c'est mal écrit ;-) Pour du C ce serait très bien! Mais on est sur PHP là :-s Ce serait plus lisible en utilisant des fonctions ^^'
Concernanr le filtrage, tu peux déjà potasser ça! http://php.net/manual/fr/book.filter.php
Ah et, je ne comprend pas ça :
echo $avec_photo = $_GET['avec_photo'];
echo $genre = $_GET['genre'];
Pourquoi tu "echo"..?
//La définition de $filters est à modifier en fonction de ce que tu veux obtenir ;-)
$filters = ['avec_photo' => FILTER_DEFAULT, 'genre' => FILTER_DEFAULT];
//On prend dans $_GET ce qu'indique $filters et l'on ne garde que les valeurs significatives
$values = array_filter(filter_input_array(INPUT_GET, $filters, false), function($value) { return !empty($value); });
//On gère en premier le cas le plus court, c'est plus jolie :-p
if (empty($values)) echo "<center><h6>Merci de selectionner un critère de recherche :-)</h6></center>";
else {
$requestString = "SELECT * FROM user_profile pr, user_reg re WHERE re.id=pr.user_id";
if (array_key_exists('avec_photo', $values)) $requestString .= " and pr.img_status=?";
if (array_key_exists('genre', $values)) $requestString .= " and re.gender=?";
echo $requestString;
var_dump($values);
$req = $bdd->prepare($requestString);
$req->execute(array_values($values));
//while ($donnees13 = $req->fetch());
}
Merci beacoup,
Il me met cette erreur Parse error: syntax error, unexpected '$critera' (T_VARIABLE) in ...
Ah ah ah X-)...
-_-' N'hésite surtout pas à mettre les points-virgule partout où il en manque..!
J'ai édité mon commentaire pour réctifier ;-)
Bonjour et merci encore Psylozoff,
J'ai copier ton code et fait des tests.
Quant on selection aucun crytère de recherche cela donne bien la phrases
"Merci de selectioner un critère de recherche"
Mais quant je fait un choix dans mon formulaire j'ai une erreur
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: no parameters were bound in ...
j'ai modifier cette ligne
$req->execute($criteres);
par
$req->execute($critera);
J'ai une réponse vide rien ne s'affiche,
Merci ancores pour tous.
Ah oui, exact, c'est bien "critera" qui merde ;-) Bien vu!
Y'a sûrement une fonction utilisée qui fonctionne pas comme je m'y attends... Je peux pas tester le code que je t'écris :-s
Mets $req->execute($critera); en commentaire et remplace-le par
var_dump($critera);
var_dump($criteraValues);
Histoire qu'on puisse constater le contenu des 2 tableaux! Devrait y avoir une valeur null ou false, j'imagine...
Bonjour Psylozoff et merci,
Alors cela me donne
Si je choisir le gence
array(1) { [0]=> string(5) "chat" }
array(1) { ["genre"]=> string(5) "chat" }
Ou avec photo
array(1) { [0]=> string(1) "1" }
array(1) { ["avec_photo"]=> string(1) "1" }
Ok, mais du coup... Tu cherches la valeur exacte? T'es sûr de ta requête? Est-ce que LIKE ne serait pas un peu overkill? A priori, j'imagine qu'un "=" suffira, non??
A quoi ressemble ta requête GET?
echo $_SERVER['QUERY_STRING'];
Peux-tu également reproduire l'erreur de tout à l'heure et mettre le message d'erreur en entier?
Bonjour,
Désolé pris par le taf je vais faire les modification et changer ma requête.
Et te dit ce que cela me donne.
Le resulat donnée est
Si je selectionne mes deux recherche j'ai
avec_photo=1&genre=chat
Je voudrais voir ta query string lorsque rien n'est sélectionné, en fait ^^
Et le message d'erreur dont tu m'as parlé mais en entier ;-)
Genre, est-ce que ça te donne un truc du style "?avec_photo=&genre=" ? Et, si ça n'est pas le cas, est-ce que tu génères toi-même la requête en JS (ou autre) en fonction de ce qui est sélectionné?
Mais bon, le plus important pour régler ton problème c'est le message d'erreur en entier!!
Je diser l'erreur que j'avais c'etait cela "Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: no parameters were bound in ave cle chemin du fichier"
Pour revenir a cette QUERY_STRING
Si je selection rien j'ai cela
Merci de selectioner un critère de recherche
si je selection un critère j'ai cela
avec_photo=1
ou ça
genre=chat
les deux
avec_photo=1&genre=chat
C'est tous ce que j'ai.
Ok! Alors, je pense qu'en fait le tableau $critera est inutile! Je l'avais mit juste pour être sûr que les paramètres sont dans le bon ordre pour la requête mais je pense que filter_input_array ajoute dans le tableau dans l'ordre dans lequel ils sont spécifiés dans $filters...
Et ensuite, tu n'as clairement pas besoin de LIKE... http://sql.sh/cours/where/like
Donc, je vais corriger mon pavé ;-) D'ici dix minutes tu pourras réessayer d'y pomper le code!
Voilà, si t'as une erreur j'ai besoin d'un var_dump de $values et d'un echo de $requestString ^^
Alors j'ai fait les modifications et j'optient
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in /home/www/openechangiste.com/site/search_user.php on line 1317
echo de requestString around
SELECT * FROM user_profile pr, user_reg re WHERE re.id = pr.user_id
var_dump($values);around
array(1) { ["genre"]=> string(4) "chat" }
array(1) { ["avec_photo"]=> string(1) "1" }
array(2) { ["avec_photo"]=> string(1) "1" ["genre"]=> string(4) "chat" }
Ah oué ok! La request string n'est pas modifiée.... Waddafäk!? J'ai dû faire une connerie :-p
Ca donne quoi var_dump(array_key_exists('avec_photo', $values)) quand tu sélectionnes le critère photo..?
Voilà ce que j'ai quant je selectionne critère photo
var_dump(array_key_exists('avec_photo', $values))
SELECT * FROM user_profile pr, user_reg re WHERE re.id = pr.user_id
bool(true)
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in /home/www/site.com/h_us.php on line 1318
D'accord... Ca n'a absolument aucun sens! Ca dit quoi :
if (array_key_exists('avec_photo', $values)) {
echo 'test';
$requestString .= " and pr.img_status=?";
}
echo $requestString;
Voila, j'ai cela qui apparait
test
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /home/www/site.com/h_us.php on line 1324
désolé
test
SELECT * FROM user_profile pr, user_reg re WHERE re.id = pr.user_id and pr.img_status=? and pr.img_status=?
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /home/www/site.com/h_us.php on line 1325
Bon bah ça marche, alors... Qu'est-ce tu branles :-D
Copie mon pavé de code sur la page précédente! Fais gaffe à pas laisser des bouts de code bidon que t'aurais laissé...
Ok mais j'ai bien copier le code, ça ne fonctionne pas ou j'ai rien compris :-(
<?php
//La définition de $filters est à modifier en fonction de ce que tu veux obtenir ;-)
$filters = ['avec_photo' => FILTER_DEFAULT, 'genre' => FILTER_DEFAULT];
//On prend dans $_GET ce qu'indique $filters et l'on ne garde que les valeurs significatives
$values = array_filter(filter_input_array(INPUT_GET, $filters, false), function($value) { return !empty($value); });
//On gère en premier le cas le plus court, c'est plus jolie :-p
if (empty($values)) echo "<center><h6>Merci de selectionner un critère de recherche :-)</h6></center>";
else {
$requestString = "SELECT * FROM user_profile pr, user_reg re WHERE re.id=pr.user_id";
if (array_key_exists('avec_photo', $values)) $requestString .= " and pr.img_status=?";
if (array_key_exists('genre', $values)) $requestString .= " and re.gender=?";
echo $requestString;
var_dump($values);
$req = $bdd->prepare($requestString);
$req->execute($values);
if (array_key_exists('avec_photo', $values)) {
echo 'test';
$requestString .= " and pr.img_status=?";
}
echo $requestString;
//while ($donnees13 = $req->fetch());
}
?>
et ça me donne cela
SELECT FROM user_profile pr, user_reg re WHERE re.id=pr.user_id and pr.img_status=?array(1) { ["avec_photo"]=> string(1) "1" }
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in /home/www/site.com/h_us.php on line 1320
test
SELECT FROM user_profile pr, user_reg re WHERE re.id=pr.user_id and pr.img_status=? and pr.img_status=?
Maintenant j'ai cela
1 choix
SELECT FROM user_profile pr, user_reg re WHERE re.id=pr.user_id and pr.img_status=?array(1) { ["avec_photo"]=> string(1) "1" }
SELECT FROM user_profile pr, user_reg re WHERE re.id=pr.user_id and re.gender=?array(1) { ["genre"]=> string(4) "chat" }
2 choix
SELECT * FROM user_profile pr, user_reg re WHERE re.id=pr.user_id and pr.img_status=? and re.gender=?array(2) { ["avec_photo"]=> string(1) "1" ["genre"]=> string(4) "chat" }
Mais a là suite je donne le resutat en affichant un image et d'autre information :
$genre = $donnees13['genre'];
$id_user = $donnees13['id'];
$path = $donnees13['path'];
<img src="<?php if ($path != "") {
echo $img = "./files_photo/$id_use/image_profil/$path";
}else {
echo"./img/default.jpg";
}
?>" alt="">
Mais cela ne donne rien.
Bah y'a plus d'erreur, donc c'est bon ^^ Remets la ligne que j'ai commenté, ça ira mieux ;-)
Bonjour,
Et merci encore de ton aide,
MAis j'ai rien qui s'affiche, avec code que j'ai donnée plus haut
$genre = $donnees13['genre'];
$id_user = $donnees13['id'];
$path = $donnees13['path'];
echo $img = "./files_photo/$id_use/image_profil/$path";
}else {
echo"./img/default.jpg";
}
?>" alt="">
J'ai pas de resultat, quant je fait un echo sur $donnees13
Je devrait pas avoir un Array qui apparait, là rien.
Je suis perdu, :-(((
Oui j'ai décommenté
//while ($donnees13 = $req->fetch());
en
while ($donnees13 = $req->fetch());
Et tu t'es renseigné sur ce que fait "fetch"..?
En fait, très simplement... Tu as bien conscience que pour aller au-delà du while il faut que $donnees13 soit égal à false ou équivalent..? Tu sais comment un while fonctionne, j'imagine?
Alors je t'explique je suis pas quelqu'un de douer dans le php, mais je pense que je comprends ce que je fait mais là.
while me permet de recuperer un groupe de reponse (boucle) de ma base.
Exempe :
Je cherche tous les id qui on le chiffre 1
<?php
$reponse1333 = $bdd->query("SELECT * FROM `user` WHERE `id` LIKE '%1%' ");
while ($donnees1333 = $reponse1333->fetch())
{
?>
sans while
Je cherche le id qui est le 100
<?php
$reponse1333 = $bdd->query("SELECT * FROM `user` WHERE user_id = '100'");
$donnees1333 = $reponse1333->fetch();
{
?>
Voilà,
Ah.... Bah non X-D
Premièrement :
//tant que $variable est équivalent à true
while($variable) {
//traitement
}
//Après la boucle, à moins d'y avoir utilisé un break, $variable est forcément équivalent à false...
Et ensuite :
$reponse1333 = $bdd->query("SELECT * FROM `user` WHERE `id` LIKE '%1%' ");
$donnees1333 = $reponse1333->fetch(); //$donnees1333 contient la première ligne du résultat
$donnees1333 = $reponse1333->fetch(); //$donnees1333 contient la deuxième ligne du résultat
$donnees1333 = $reponse1333->fetch(); //$donnees1333 contient la troisième ligne du résultat
$donnees1333 = $reponse1333->fetch(); //$donnees1333 contient la quatrième ligne du résultat
$donnees1333 = $reponse1333->fetch(); //$donnees1333 contient la cinquième ligne du résultat
Donc :
$reponse1333 = $bdd->query("SELECT * FROM `user` WHERE `id` LIKE '%1%' ");
while ($donnees1333 = $reponse1333->fetch()) {
//$donnees1333 contient une ligne du résultat
}
//$donnees1333 est équivalent à false :-s
Super j'aptient des reponses.
Ce que j'ai fait
while ($donnees13 = $req->fetch())
{
du code .....
<?php
}
$reponse13->closeCursor();
?>
</div>
<?php
}
}
?>
...
Merci beaucoup ça fonctionne, t'es trop fort.
Et en plus t'es passion.
;-)