interpétation de texte en php

Eléphant du PHP | 377 Messages

22 juil. 2005, 16:25

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...
Petit scarabée deviendra grand

ViPHP
pjl
ViPHP | 2119 Messages

22 juil. 2005, 16:30

as tu fais un echo de ta requête pour voir le résultat final ?

VaN
Mammouth du PHP | 1107 Messages

22 juil. 2005, 16:32

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 "; ?>
Modifié en dernier par VaN le 22 juil. 2005, 16:33, modifié 1 fois.

Mammouth du PHP | 19672 Messages

22 juil. 2005, 16:33

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 43 Messages

22 juil. 2005, 16:51

//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

Eléphant du PHP | 377 Messages

22 juil. 2005, 16:52

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
Modifié en dernier par Shrell le 22 juil. 2005, 17:12, modifié 1 fois.
Petit scarabée deviendra grand

Eléphant du PHP | 377 Messages

22 juil. 2005, 16:54

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])
Petit scarabée deviendra grand

Eléphanteau du PHP | 43 Messages

22 juil. 2005, 17:01

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...

Eléphant du PHP | 377 Messages

22 juil. 2005, 17:02

lol oki j'essaye ça tout de suite
Petit scarabée deviendra grand

Eléphant du PHP | 377 Messages

22 juil. 2005, 17:07

Testé... c'est bien ce que je craignais, $_POST[$name] n'est pas interpété...
Petit scarabée deviendra grand

Mammouth du PHP | 19672 Messages

22 juil. 2005, 17:17

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 ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 377 Messages

22 juil. 2005, 18:24

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 ;)
Petit scarabée deviendra grand