Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/10/2011, 18h33   #1
Membre du Club
 
Inscription : décembre 2008
Messages : 315
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 315
Points : 53
Points : 53
Par défaut Forumlaire PHP probleme d'input

Bonjour,

Voila mon souci j'ai un formulaire qui comporte 5 input type text ce formulaire permet de requêter sur ma base oracle donc juste un select.

J'ai donc 5 champs que l on peut remplir

nom / prenom / code postal /date de naissance /dep de naissance

si je remplis le nom avec ce select

Code sql :
SELECT * FROM matable WHERE nom='$nom'

il m affiche bien les lignes souhaités.

Le problème est que si je renseigne le nom et le code postal par exemple mon select n'est plus adapté il faudrait faire un select du genre
Code sql :
SELECT * FROM matable WHERE nom='$nom' AND cp='$cp'

Mon souci est que j'ai 5 champs donc je vous laisse entrevoir le nombre de possibilités ...

Y a t il un moyen de faire simplement et d'éviter de faire une quarantaine de
Code :
1
2
3
if (($_POST["nom"])&&($_POST["prenom"])&&($_POST["cp"])){
blablala
}
Merci de votre aide
stefanelle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 19h44   #2
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 810
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 810
Points : 1 526
Points : 1 526
Ta requête SQL n'est qu'une simple chaîne de caractère que tu peux aisément construire dynamiquement en fait.

Un petit exemple de ce qu'il est possible de faire :
Code php :
1
2
3
4
5
6
7
8
$sql = 'SELECT id, nom FROM table';
$where = array();
if( isSet($_POST['value']) && $_POST['value'] == 1)
  $where[] = "unChamp = 'test'";
if( isSet($_POST['value2']) )
  $where[] = "unAutreChamp LIKE '%".$_POST['value2']."%";
if( !empty($where) )
$sql .= implode(' AND ',$where);
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 22h56   #3
Membre du Club
 
Inscription : décembre 2008
Messages : 315
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 315
Points : 53
Points : 53
Merci pour la réponse transgohan

mais j'ai du mal à saisir pour cette partie

Code :
if( isSet($_POST['value']) && $_POST['value'] == 1)
aucun souci

je mets du genre
Code :
if( isSet($_POST['nom']) && $_POST['prenom'] == 1)
par contre pour
Code :
$where[] = "unChamp = 'test'";
je ne vois pas


a quoi correspond "un champ" et a quoi correspond "test" ?

Merci
stefanelle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2011, 08h27   #4
Invité de passage
 
Homme
Développeur Web
Inscription : août 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Développeur Web
Secteur : Communication - Médias

Informations forums :
Inscription : août 2011
Messages : 3
Points : 4
Points : 4
dans ton exemple :

unchamp serait code_postal
test serait la valeur de ton input (75001 par exemple)
et ainsi de suite
vincedev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2011, 09h25   #5
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 810
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 810
Points : 1 526
Points : 1 526
Un petit peu d'algo pour mieux comprendre.
Code :
1
2
3
SI Value a été postée ET Value == 1 Alors
  Ajouter dans le tableau Where la valeur : "unChamp = 'test'"
FINSI
La valeur postée sera donc égale à 1, dans ton cas c'est une chaîne de caractère que tu recherches avec nom, donc tu devras juste faire le test d'existence. Ou bien si tu as des règles à faire respecter tu peux les ajouter dans la condition (longueur maximale, caractère spéciaux interdits, ect).

Mon exemple était statique, c'est à dire que la condition WHERE que je concaténais était toujours la même. A savoir rechercher les n-uplets donc le champ nommé "unChamp" aurait la valeur égale à "test".

Dans ton cas c'est bien plus le second exemple qui te sera utile vu que c'est la valeur postée que tu souhaites rechercher.
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2011, 09h45   #6
Membre confirmé
 
Homme
Développeur informatique
Inscription : avril 2011
Messages : 196
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Italie

Informations professionnelles :
Activité : Développeur informatique
Secteur : Transports

Informations forums :
Inscription : avril 2011
Messages : 196
Points : 298
Points : 298
On pourrait construire la partie Where en travaillant directement sur $_POST, c'est un tableau associative comme un autre, en supprimant les entrées vides, ensuite on construit un tableau avec d'une part le nom de la colonne et de l'autre sa valeur. il suffit ensuite de joindre ce tableau avec des 'AND' entre ces elements.
Code :
1
2
3
4
5
6
7
8
$tab=array_filter($_POST);
$cols = array();
foreach($tab as $key=>$val) {
        $cols[] = "$key = '$val'";
    }
$conditions=implode(' AND ',$cols);	
if ($conditions) $conditions="WHERE $conditions";
$sql="SELECT * FROM matable $conditions";
fab256 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2011, 10h57   #7
Membre confirmé
 
Homme
Développeur informatique
Inscription : avril 2011
Messages : 196
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Italie

Informations professionnelles :
Activité : Développeur informatique
Secteur : Transports

Informations forums :
Inscription : avril 2011
Messages : 196
Points : 298
Points : 298
Citation:
Envoyé par fab256 Voir le message
On pourrait construire la partie Where en travaillant directement sur $_POST, c'est un tableau associative comme un autre, en supprimant les entrées vides, ensuite on construit un tableau avec d'une part le nom de la colonne et de l'autre sa valeur. il suffit ensuite de joindre ce tableau avec des 'AND' entre ces elements.
Code :
1
2
3
4
5
6
7
8
$tab=array_filter($_POST);
$cols = array();
foreach($tab as $key=>$val) {
        $cols[] = "$key = '$val'";
    }
$conditions=implode(' AND ',$cols);	
if ($conditions) $conditions="WHERE $conditions";
$sql="SELECT * FROM matable $conditions";
La condition de test peut etre modifiée :
Code :
$cols[] = "$key LIKE '%$val%'";
Pour éviter l'attaque par injection dans la clause where, une methode serai d'utiliser mysql_real_escape_string, ou bien de préparer la requete avant de l'exécuter. Regarde ici
fab256 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 10h30   #8
Membre du Club
 
Inscription : décembre 2008
Messages : 315
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 315
Points : 53
Points : 53
Merci à tous pour vos réponses,

j'ai utilisé la méthode de fab256 qui a l'air d'ètre au top sauf que quand j'affiche un echo de ma requete SQL voilà ce qui sort

SELECT * FROM MATABLE WHERE nom = 'dupont' AND prenom = 'alain' AND

apparemment un AND se glisse à la fin de ma requête et semble la faire capoter j'avoue ne pas savoir comment faire que le dernier AND ne s'affiche pas...

Merci encore
stefanelle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 13h30   #9
Membre confirmé
 
Homme
Développeur informatique
Inscription : avril 2011
Messages : 196
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Italie

Informations professionnelles :
Activité : Développeur informatique
Secteur : Transports

Informations forums :
Inscription : avril 2011
Messages : 196
Points : 298
Points : 298
J'a testé la portion de code et ca marche bien chez moi.
La ligne
Code :
$tab=array_filter($_POST);
Évalue chaque valeur du tableau $_POST si c'est une chaine vide alors il est supprimé.
Peut-tu poster le code de ton formulaire pour mieux voir?
fab256 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 14h09   #10
Membre du Club
 
Inscription : décembre 2008
Messages : 315
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 315
Points : 53
Points : 53
voici mon code en entier

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<body>
<div id="header">
<h4>Recherche nom</h4>
</div>
</br>
<div id="contenu">
<br />
<h4>Renseignez le champ souhaité :</h4>
<br />
<form method="POST" action="saisie.php">
<TABLE BORDER=0>
<TR>
	<TD>numéro ss<TD>
	<TD>
	<INPUT type=text name="P_N_SS">
	</TD>
</TR>
<TR>
	<TD>Nom</TD>
	<TD>
	<INPUT type=text name="P_NOM">
	</TD>
</TR>
<TR>
	<TD>Prénom</TD>
	<TD>
	<INPUT type=text name="P_PRENOM">
	</TD>
</TR>
<TR>
	<TD>Date de naissance</TD>
	<TD>
	<INPUT type=text name="P_NAISSANCE">
	</TD>
</TR>
<TR>
	<TD>Département de naissance</TD>
	<TD>
	<INPUT type=text name="P_DEPNAISSANCE">
	</TD>
</TR>
</table>
<div id="submit">
<input type="submit" value="envoyer" NAME="ok"/>
</div>
</form>
<?php
$base=BASE;
$connexion=connectionOCI ($sess_login,$sess_password,$base);
if (isset($_POST['ok'])) 
{
	$ss=$_POST['P_N_SS'];
	if  (ereg('[0-9]{11}',$ss))
	{
 
		$tab=array_filter($_POST);
		$cols = array();
		foreach($tab as $key=>$val) 
			{
				$cols[] = "$key = '$val'";
			}
		$conditions=implode(' AND ',$cols);	
		if ($conditions) $conditions="WHERE $conditions";
		$query= "SELECT * FROM matable $conditions";
		echo $query;
		$statement = OCIParse($connexion,$query) or die ("Problème avec la requête");
		OCIExecute ($statement,OCI_DEFAULT);
		while (OCIFetchInto($statement, $row, OCI_ASSOC))
			{
 
				echo '<center><table id="result">'."\n";
				echo '<tr>';
				echo '<td>Numéro SS</td>';
				echo '<td>Nom</td>';
				echo '<td>Prénom</td>';
				echo '<td>Date de naissance</td>';
				echo '<td>Département de naissance</td>';
				echo '</tr>'."\n";
				echo '<tr>';
					echo "<td>" . $row['P_N_SS']. "</td>";
					echo "<td>" . $row['P_NOM']. "</td>";
					echo "<td>" . $row['P_PRENOM']. "</td>";
					echo "<td>" . $row['P_NAISSANCE']. "</td>";
					echo "<td>" . $row['P_DEPNAISSANCE']. "</td>";			
				echo '</tr>'."\n";
 
				echo '</table></center>'."\n";
			}	
	}
	else
	{
	?>
	<div align="center">
	<?php
	echo "18 caractères merci";
	?>
	</div>
	<?php
 
	}
}	
?>
</div>
</body>
stefanelle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 14h24   #11
Membre du Club
 
Inscription : décembre 2008
Messages : 315
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 315
Points : 53
Points : 53
Je viens de comprendre pourquoi en fait voici le retour du echo $query en entier

Code :
SELECT * FROM matable WHERE P_N_SS = '181089154789501' AND P_NOM = 'DUPONT' AND ok = 'envoyer'
en fait la dernière ligne du tableau correspond au bouton submit

Je ne sais pas pourquoi j ai contourner en faisant un

Code :
1
2
$nbr = 18;
$conditions2=substr($conditions, 0, -$nbr);
ce qui me retire les 18 caractères non souhaités là ca fonctionne

mais si possible j'aimerais que ce dernier AND n'apparaisse pas ...
stefanelle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 14h24   #12
Membre confirmé
 
Homme
Développeur informatique
Inscription : avril 2011
Messages : 196
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Italie

Informations professionnelles :
Activité : Développeur informatique
Secteur : Transports

Informations forums :
Inscription : avril 2011
Messages : 196
Points : 298
Points : 298
Le bouton Ok fait partie du $_POST, si tu le laisse tu l'aura dans ton requête SQL.
Code :
<input type="submit" value="envoyer" NAME="ok"/>
Il faut juste le supprimer avant de construire la requête avec la fonction unset qui permet de garder les indexs.
Code :
1
2
3
4
5
6
7
8
$tab=array_filter($_POST);
unset($tab['ok']);
$cols = array();
foreach($tab as $key=>$val) {
        $cols[] = "$key = '$val'";
    }
$conditions=implode(' AND ',$cols);	
$sql="SELECT * FROM matable".( $conditions? ' WHERE ': '' ).$conditions;
fab256 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 14h33   #13
Membre du Club
 
Inscription : décembre 2008
Messages : 315
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 315
Points : 53
Points : 53
ca marche nickel

merci pour tout

et bonne journée
stefanelle est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h26.


 
 
 
 
Partenaires

Hébergement Web