Page 1 sur 1

interpétation de texte en php

Posté : 22 juil. 2005, 16:25
par Shrell
Salut!
J'ai un gros probleme et j'ai écumé le forum mais y'a pas grand chose qui se rapproche de mon cas...
je vous fais part de mes misères:
je crée un module de recherche qui s'adapte directement à la base de donnée, donc j'affiche un champ de recherche pour chaque champ dans ma database. Jusqu'ici tout va bien...
seulement quand je valide, je voudrais, de la même façon, construire dynamiquement ma requete et donc mes tests (pas très clair? le code: )
if($action=="recherche") {
$requete2="select * form $nom_table where ";
for ($i=0; $i<=($nb_champs-1); $i++) {
if($_POST[mysql_field_name($id_liste, $i)]) {
$requete2.=mysql_field_name($id_liste, $i) ."=".$_POST[mysql_field_name($id_liste, $i)]." AND ";
}
}
}
ça, ça ne marche pas, le $_POST[mysql_field_name($id_liste, $i)] n'est pas interpété... mais quand je fais
$a='$_POST[' . mysql_field_name($id_liste, 1) . ']';
ca ne marche pas non plus, je me retrouve avec $_POST[nomduchamp1] alors que je cherche à avoir la valeur
j'en peux pluuuuuuus
please help
P.S.: la fonction eval() ne marche pas, ou alors je sais pas m'en servir...

Posté : 22 juil. 2005, 16:30
par pjl
as tu fais un echo de ta requête pour voir le résultat final ?

Posté : 22 juil. 2005, 16:32
par VaN
une lecture rapide du code et voici l'erreur :
<?php
$requete2="select * form $nom_table where "; ?>
Une faute de frappe, ce n'est pas form, mais FROM

je te conseille d'ailleurs d'ecrire, dans tes requetes, tout ce qui n'est pas des valeurs en majuscules, de cette maniere :
<?php
$requete2="SELECT * FROM $nom_table WHERE "; ?>

Posté : 22 juil. 2005, 16:33
par Cyrano
Bon, ce ne doit pas être si complexe que ça : explique nous sommairement quel type d'information tu envoies en $_POST et sous quelle forme (tableau ou données individuelles). À partir de là, on verra comment reconstruire une requête SQL dynamiquement.

En gros, il nous manque la structure de ton formulaire.

Posté : 22 juil. 2005, 16:51
par adri
//le nom de la table a rechercher
$nomtable = "vins";
//il faut faire une requete pour pouvoir utiliser mysql_field_name apres
$result = mysql_query("SELECT * FROM $nomtable");

$sql = "SELECT * FROM $nomtable WHERE ";
//creation d'un tableau vide pour mettre toutes les clauses where
$wheres = array();

$nombrechamp = mysql_num_rows($result);
for ($i = 0; $i < ($nombrechamp - 1); $i++) {

	$name = mysql_field_name($result, $i); //recupere le nom du champ
	if (isset($_POST[$name]) && !empty($_POST[$name]))
		$wheres[] = $name." = ".$_POST[$name]; //si variable post on ajoute dans tableau wheres clause
}

//le reste c'est juste pour rajouter les AND entre les clauses where
$comptage = count($wheres);

foreach($wheres as $cle => $valeur) {
	
	$and = ($cle < $comptage - 1) ? " AND " : null;
	$where .= $valeur.$and; 
}
//pas oublier de liberer resultat
mysql_free_result($result);

//... mnt tu px executer ta requete sql. je te conseil de faire un tit echo avant pour tester
//le script, je n'ai pas teste

//echo($sql);
Voilà, j'espère qu'avec les commentaires ça suffit. Ca devrait marcher. Si tu ne comprends pas un truc, n'hésite pas à demander et surtout ne copie pas sans comprendre, sinon tu ne vas pas avancer

Posté : 22 juil. 2005, 16:52
par Shrell
lol pour le form merci je viens de corriger, mais ça venait pas de ça
j'ai effectivement fait un echo de ma requete, et dans le meilleur des cas je me retrouve avec:
select * from nomdematable where champ1=$_POST[champ1] etc...
Alors que je voudrais remplacer $POST[] par sa valeur

Cyrano, en fait je construis mon formulaire comme ça:
<?php
$nom_table="user";
$db_link = @mysql_connect($sql_serveur,$sql_user,$sql_passwd);
if(!$db_link) {echo "Maintenance en cours, connexion impossible (<b>$sql_bdd-$sql_server</b><br>"; exit;}
$requete=mysql_db_query($sql_bdd,"select * from $nom_table",$db_link) or die(mysql_error());
$nb_champs = mysql_num_fields($requete);
$id_liste = mysql_list_fields($sql_bdd, $nom_table);
?>
<form name="rech" method="post" action="?action=recherche" ENCTYPE="text/plain">
<table border="0">
<?php
for ($i=0; $i<=($nb_champs-1); $i++) {
echo "<tr><td>" . mysql_field_name($id_liste, $i) ." : </td><td><input type=\"text\" name=\"". mysql_field_name($id_liste, $i) ."\"></td></tr>";
}
// DECONNEXION MYSQL	
mysql_close($db_link);
?>
vala, j'espère que ça répond à ta question

Posté : 22 juil. 2005, 16:54
par Shrell
merci adri mais la construction de la requete ne me pose pas de probleme, c'est juste : comment remplacer une variable que je crée de toutes pièces en faisant:
$_POST[ + nom de ce que je veux prendre +]
par la valeur de cette variable (qui est donc à la fin $_POST[cequejecherche])

Posté : 22 juil. 2005, 17:01
par adri
et bien tu as tout dans le tit script que j'ai fais plus haut normalemnet.
$name = mysql_field_name($result, $i); //recupere le nom du champ
    if (isset($_POST[$name]) && !empty($_POST[$name]))
        $wheres[] = $name." = ".$_POST[$name];
dans la variable $name tu auras le nom du champ de ta table.

Donc si tu as une table avec un champ "index_biere" et bien, le echo($name); va inscrire index_biere...

et euh, ben voilà je ne vois pas que dire d'autre.

PS: il faut que dans ton formulaire tes inputs aient le mm nom que les champs de ta table, mais je suppose qu'il n'y a pas besoin de préciser...

Posté : 22 juil. 2005, 17:02
par Shrell
lol oki j'essaye ça tout de suite

Posté : 22 juil. 2005, 17:07
par Shrell
Testé... c'est bien ce que je craignais, $_POST[$name] n'est pas interpété...

Posté : 22 juil. 2005, 17:17
par Cyrano
Bon, j'ai du mal à tout saisir. D'abord, pour simplifier , j'ai essayé de nettoyer un peu le code. Tu y utilises des fonction dépréciées, voici une proposition de correction à mon sens plus lisible. Il est bon d'aérer le code, sinon quand tu auras à le reprendre dans six mois, tu voudras étrangler celui qui a pondu ce script avant de réaliser que c'est toi-même :
<?php
$nom_table="user";
$db_link = mysql_connect($sql_serveur,$sql_user,$sql_passwd);
if(!$db_link)
{
    echo "Maintenance en cours, connexion impossible (<b>". $sql_bdd ."-". $sql_server ."</b><br>";
    exit;
}
else
{
    $select_base = mysql_select_db($sql_bdd);
}
$sql = "select * from ".$nom_table;
$requete = mysql_query($sql, $select_base) or die(mysql_error());
$nb_champs = mysql_num_fields($requete);
$id_liste = mysql_list_fields($sql_bdd, $nom_table);
?>
<form name="rech" method="post" action="<?php echo($_SERVER['PHP_SELF']); ?>?action=recherche" ENCTYPE="text/plain">
<table border="0">
<?php
for ($i = 0; $i < $nb_champs; $i++)
{
?>
  <tr>
    <td><?php echo(mysql_field_name($id_liste, $i)); ?> : </td>
    <td><input type="text" name="<?php echo(mysql_field_name($id_liste, $i)); ?>"></td>
  </tr>
<?php
}
?>
</table>
<?php
// DECONNEXION MYSQL
mysql_close($db_link);
?>
Mais ce que je ne sais pas, c'est si de toutes façons ça fonctionne ou pas.

Pour débugguer, as-tu essayé de faire afficher les valeurs envoyées par le formulaire avec un simple :
<pre>
<?php
var_dump($_POST);
?>
</pre>
:?:
Si oui, retrouves-tu ce que tu attendais ?

Posté : 22 juil. 2005, 18:24
par Shrell
oki...
C bon, le probleme est résolu...
Ca vient de mon php en local, ça marche très bien coté serveur... je m'en vais éplucher le php.ini lol
pour ceux que ça interesse, adri avait raison lol:
if($action=="recherche") {
$requete2="select * from $nom_table where ";
for ($i=0; $i<=($nb_champs-1); $i++) {
$name = mysql_field_name($id_liste, $i);
    if(isset($_POST[$name]) && !empty($_POST[$name])) {
$requete2.=$name ."=".$_POST[$name]." AND ";
}
}
$requete2=substr($requete2,0,-5);
echo "$requete2";
// DECONNEXION MYSQL	
mysql_close($db_link);
exit();
}
valaaaaa
et merci à tous ;)