IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Forumlaire PHP probleme d'input [PHP 4]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 319
    Points : 89
    Points
    89
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (($_POST["nom"])&&($_POST["prenom"])&&($_POST["cp"])){
    blablala
    }
    Merci de votre aide

  2. #2
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 387
    Points
    9 387
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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);

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 319
    Points : 89
    Points
    89
    Par défaut
    Merci pour la réponse transgohan

    mais j'ai du mal à saisir pour cette partie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if( isSet($_POST['value']) && $_POST['value'] == 1)
    aucun souci

    je mets du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if( isSet($_POST['nom']) && $_POST['prenom'] == 1)
    par contre pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $where[] = "unChamp = 'test'";
    je ne vois pas


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

    Merci

  4. #4
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    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
    Par défaut
    dans ton exemple :

    unchamp serait code_postal
    test serait la valeur de ton input (75001 par exemple)
    et ainsi de suite

  5. #5
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 387
    Points
    9 387
    Par défaut
    Un petit peu d'algo pour mieux comprendre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 271
    Points : 491
    Points
    491
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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";

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 271
    Points : 491
    Points
    491
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $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

  8. #8
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 319
    Points : 89
    Points
    89
    Par défaut
    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

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 271
    Points : 491
    Points
    491
    Par défaut
    J'a testé la portion de code et ca marche bien chez moi.
    La ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $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?

  10. #10
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 319
    Points : 89
    Points
    89
    Par défaut
    voici mon code en entier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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>

  11. #11
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 319
    Points : 89
    Points
    89
    Par défaut
    Je viens de comprendre pourquoi en fait voici le retour du echo $query en entier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ...

  12. #12
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 271
    Points : 491
    Points
    491
    Par défaut
    Le bouton Ok fait partie du $_POST, si tu le laisse tu l'aura dans ton requête SQL.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  13. #13
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 319
    Points : 89
    Points
    89
    Par défaut
    ca marche nickel

    merci pour tout

    et bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Drupal] input format php
    Par mme_chelaou dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 26/03/2010, 16h42
  2. [MySQL] php probleme de requête sql
    Par carmen256 dans le forum PHP & Base de données
    Réponses: 21
    Dernier message: 03/04/2006, 23h52
  3. [FLASH MX] [PHP] Probleme d'integration
    Par chocobos dans le forum Flash
    Réponses: 8
    Dernier message: 17/08/2005, 17h18
  4. [XSL][PHP] probleme de passage de parametres...
    Par jesus144 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 20/06/2005, 23h25
  5. [type MIME] css généré par php -> probleme
    Par prgasp77 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 23/09/2004, 21h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo