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 :

passage de requete sql par variables [PHP 5.3]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 64
    Par défaut passage de requete sql par variables
    Bonsoir tout le monde

    Je rencontre un petit problème en ce moment avec une génération de code sql via un formulaire, je vous explique...

    J'aimerais pouvoir faire un tri sur une liste d'offre d'emplois stocké dans une table de donnée, vu que soit il affiche tout (et dans ce cas je n'ai pas de condition dans ma requête) ou soit une partie définie par des listes déroulantes

    Voici comment j'ai imaginé la chose:
    Si tout doit être affiché, la variable vaut une chaine vide
    Sinon j’écris la requête dans une variable et je la transmets

    Voici le code que j'ai tapé:
    Tout d'abord une partie de ma classe Job ou je communique avec la bdd

    Job.php
    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
    <?php
    class Jobs
    {
    //***************************
    // CONSTRUCTEUR - DESTRUCTEUR
    //***************************
    	private $connection;
    	function __construct()
    	{
    		try
    		{
    			$this->connection=new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.'', DB_USER, DB_PASS);
     
    		}
    		catch (Exception $e)
    		{
    				return('Erreur : ' . $e->getMessage());
    		}
    	}
    	function __destruct()
    	{
    		$this->connection=null;
    	}
            ...
    	public function afficheJobFournisseur($where_date)
    	{
    		$req = $this->connection->query('SELECT a.id as id_annonce, a.titre as titre_annonce, DAY(j.date_creation) as jour, 
    		                                          MONTH(j.date_creation) as mois, YEAR(j.date_creation) as annee, s.nom as nom_secteur
    			        				       FROM annonce AS a
    										   LEFT JOIN job AS j ON j.id = a.fk_id_job
    										   LEFT JOIN secteur As s ON s.id = j.fk_id_secteur
    										   WHERE (a.langue =  a.default_language)
    										   
    										   '.$where_date.'
    										   ORDER BY j.date_creation DESC');
    		$tab = array() ;								 
    		$arrayRetour = array() ;
    		while($donnees = $req->fetch()) 
    		{
    			$arrayRetour["reference"]            = $donnees["id_annonce"].$donnees["jour"].$donnees["mois"].$donnees["annee"];
    			$arrayRetour["titre_annonce"]        = html_entity_decode($donnees["titre_annonce"]);
    			$arrayRetour["nom_secteur"]          = html_entity_decode($donnees["nom_secteur"]);
    			$arrayRetour["date_publication"]     = $donnees["jour"].'/'.$donnees["mois"].'/'.$donnees["annee"];
     
    			array_push($tab,$arrayRetour);
    		}
    		return $tab;
    		$req->closeCursor();	
    	}
    }
    ?>
    Et voici le code de la page envoyant la requête:

    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
    <?php
    session_start(); 
    ?>
    <?php
    require '../../globals/globals.php';
    function __autoLoad($nomClasse)
    {
    	require_once('../../classes/'.$nomClasse.'.php');
    }
    $jobs = new Jobs();
    $secteur = $jobs->secteur();
    if(!empty($_POST["val_secteur"]))
    {
    	$where_secteur = $_POST["val_secteur"];
    }else{
    	$where_secteur = '';
    }
    if(!empty($_POST["val_publication"]))
    {
    	$where_date = $_POST["val_publication"];
    }else{
    	$where_date = '';
    }
    $annonce = $jobs->afficheJobFournisseur($where_date);
     
    //code sql des dates
    $aujourdhui = 'AND (j.date_creation >= DATE_SUB(NOW),INTERVAL 1 DAY)';
    $hier = 'AND(j.date_creation >= DATE_SUB(NOW-1),INTERVAL 1 DAY)';
    $septDernierJours = 'AND (j.date_creation >= DATE_SUB(NOW),INTERVAL 7 DAY)';
    ?>
    <!DOCTYPE html>
    <head>
    <meta charset="utf-8">
    <title>Urbantech</title>
     
    <link href="./css/style.css" rel="stylesheet" type="text/css" />
    <script src="./script/script.js" type="text/javascript"></script>
    </head>
     
    <body id="body" onLoad="setFooter();">
    <?php //require("./lang/decide-lang.php");?>  
    <?php include("./inc/entete.php"); ?>
     
    <div id="site"><br>
    <form action="index.php" onsubmit="" method="post" enctype="multipart/form-data">
    <input type="hidden" name="val_secteur" id="val_secteur" value="">
    <input type="hidden" name="val_publication" id="val_publication" value="">
    <table width="288" border="0" cellspacing="4" cellpadding="0">
      <tr>
        <td width="80">Secteur : </td>
        <td width="114"><select name="secteur" id="secteur" class="select" onchange="document.getElementById('val_secteur').value = this.value">
          <option value ="">Tout</option>
    <?php
    foreach($secteur as $sect)
    {
    	echo '<option value ='.$sect["id"].'>'.$sect["nom"].'</option>';
    }
    ?>
        </select></td>
      </tr>
      <tr>
        <td>Parution :</td>
        <td><select name="publication" id="publication" class="select" onchange="document.getElementById('val_publication').value = this.value">
          <option value ="">Toutes</option>
          <option value ="2">Aujourd'hui</option>
          <option value ="<?php echo $hier ?>">hier</option>
          <option value ="<?php echo $septDernierJours ?>">des 7 derniers jours</option>
          <option value ="">De ce mois</option>
        </select></td>
      </tr>
    </table>
    <input type="submit"  name="confirm" id="confirm" value="ok" />
    <br>
    </form>
     
    <table width="100%" border="1" cellspacing="0" cellpadding="0">
      <tr>
        <td>Référence</td>
        <td>Nom de la fonction</td>
        <td>Secteur</td>
        <td>Date</td>
      </tr>
     
    </table>
     
    </div>
    <?php include("./inc/pied_de_page.php"); ?>
    </body>
    </html>
    En validant une option sélectionnée dans la liste publication

    J'obtiens cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Call to a member function fetch() on a non-object in C:\wamp\www\urbantech_v1\classes\Jobs.php on line 432
    Ce n'est pas un problème d’identification du serveur car si je change le code de ma classe comme tel (j'ai juste viré le paramètre):

    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
    public function afficheJobFournisseur()
    	{
    		$req = $this->connection->query('SELECT a.id as id_annonce, a.titre as titre_annonce, DAY(j.date_creation) as jour, 
    		                                          MONTH(j.date_creation) as mois, YEAR(j.date_creation) as annee, s.nom as nom_secteur
    			        				       FROM annonce AS a
    										   LEFT JOIN job AS j ON j.id = a.fk_id_job
    										   LEFT JOIN secteur As s ON s.id = j.fk_id_secteur
    										   WHERE (a.langue =  a.default_language)
     
    										   ORDER BY j.date_creation DESC');
    		$tab = array() ;								 
    		$arrayRetour = array() ;
    		while($donnees = $req->fetch()) 
    		{
    			$arrayRetour["reference"]            = $donnees["id_annonce"].$donnees["jour"].$donnees["mois"].$donnees["annee"];
    			$arrayRetour["titre_annonce"]        = html_entity_decode($donnees["titre_annonce"]);
    			$arrayRetour["nom_secteur"]          = html_entity_decode($donnees["nom_secteur"]);
    			$arrayRetour["date_publication"]     = $donnees["jour"].'/'.$donnees["mois"].'/'.$donnees["annee"];
     
    			array_push($tab,$arrayRetour);
    		}
    		return $tab;
    		$req->closeCursor();	
    	}
    }
    et que j' insert ceci dans ma page

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    foreach($annonce as $anno)
    {
    	echo '
    	<tr>
    		<td>'.$anno["reference"].'</td>
    		<td>'.$anno["titre_annonce"].'</td>
    		<td>'.$anno["nom_secteur"].'</td>
    		<td>'.$anno["date_publication"].'</td>
    	</tr>';
    }
    ?>
    tout en modifiant l'appel de ma fonction en retirant les paramètres:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $annonce = $jobs->afficheJobFournisseur();
    Il m'affiche bien toutes les offres.
    Auriez vous une idée d’où pourrait venir le problème? ou bien une solution parallèle?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Passer une requête entière ou des bouts de SQL à travers un formulaire est mauvais.
    Ta requête doit être construite à l'arrivée ; seuls les paramètres sont transmis.

    Sinon quand même, en dehors du problème de fond sur ce que tu fais, le debug de ton code passe par l'affichage des erreurs PDO.

    Je ne me suis pas relu tes 150 lignes de code dans le détail mais je me suis quand même demandé pourquoi le select "secteur" copie sa valeur dans un champ caché "val_secteur".
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 64
    Par défaut
    Merci pour cette réponse rapide :p

    car je dois faire un tri sur les 2, donc des que ca marchera je mettrai le second paramètre qui sera l'id du secteur.

    Comment puis je m y prendre "proprement"?
    aurais tu un exemple (en sachant bien sur qu'aucun paramètre ne devrait être passé dans le cas ou je désire avoir tous les secteurs ou/et tous les publications)

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    C'est juste une question du moment ou tu fais les choses : au lieu par exemple de passer le bout de requête, tu passes simplement ton paramètre "hier" et tu le traites à la reception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if (isset($_POST['publication']) {
    switch ($_POST['publication']) {
       case 'hier' :
           $where[] = 'j.date_creation >= DATE_SUB(NOW-1),INTERVAL 1 DAY';
       break;
     
       case 'aujourdhui' :
             $where[] = 'j.date_creation >= DATE_SUB(NOW),INTERVAL 1 DAY';
       break;
    }
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 64
    Par défaut
    $where[] vaut quoi? un array?

    Je vais essayer^^

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 64
    Par défaut
    J'ai fais pareil que toi avec $where_date = ... au lieu de $where[] = ...

    L'erreur reste la même
    Mais c'est sur c'est plus propre et plus lisible :p

    Merci

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/08/2006, 11h49
  2. requete sql avec variable
    Par stefon dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 02/08/2006, 16h29
  3. [VBA] requête SQL par ItemsSelected
    Par Pitou5464 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 25/04/2006, 19h24
  4. requete sql avec variable
    Par Mihalis dans le forum Bases de données
    Réponses: 15
    Dernier message: 07/04/2006, 10h17
  5. Prob de requete sql et variable
    Par agent-zaizai dans le forum ASP
    Réponses: 11
    Dernier message: 21/10/2003, 16h54

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