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

PHP & Base de données Discussion :

$query .= avec PDO


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    autodidacte
    Inscrit en
    Juin 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Juin 2014
    Messages : 45
    Par défaut $query .= avec PDO
    Bonsoir,

    Une toute petite question sur une requête préparée entrecoupée de conditions, d'ailleurs comment appelle-t'on ce cas de figure ?

    Comment dealer avec la parenthèse de fin de $query=$bdd->prepare("SELECT * FROM xy"); ? sachant que ma requête se poursuit if (...)
    J'ai essayé de mettre un chop sur la première parenthèse, et de refermer celle-ci à la fin de mes conditions mais PDO n'a pas l'air d'apprécier ma grammaire

    Merci d'avance


    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
     
     $query =$xyz ->prepare( "SELECT * FROM marinterim_job_offers  WHERE");
     $query.= chop($query,")");  // technique ratée, dommage ... 
     
      if (!empty($_REQUEST['job_searched']))
         { $job_searched =$_REQUEST['job_searched'];
    	$query.= " j.job_intitule=:job_intitule AND";
         }
     
     if (!empty($_REQUEST['job_keyword']))
        { $job_keyword =$_REQUEST['job_keyword'];
          $query.= " j.job_descriptif LIKE CONCAT('%', :term, '%') AND" ;
        }
    // etc autres vérifications
     
     
     $query.= substr_replace($query, "", -3, 3);
     
     $query.= "JOIN marimmo_villes v on job_ville j ORDER BY j.job_date_insertion DESC"; 
     $query.=")";	 // snif...

  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
    C'est la chaine qu'il faut manipuler, pas la fonction :
    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
    $query =  "SELECT * FROM marinterim_job_offers JOIN marimmo_villes v on job_ville j ";
     where = array();
      if (!empty($_REQUEST['job_searched']))
         { 
    	$where[] = " j.job_intitule=:job_intitule";
            $param[':job_intitule'] = $_REQUEST['job_searched'];
         }
     
     if (!empty($_REQUEST['job_keyword']))
        {
          $where[] =  " j.job_descriptif LIKE CONCAT('%', :term, '%')" ;
          $param[':term'] = $_REQUEST['job_keyword'];
        }
     
    if (isset($where)) { 
         $query.= ' WHERE ' . implode(' AND ', $where);
    }
     
     $query.= " ORDER BY j.job_date_insertion DESC"; 
     
    $sth =$xyz ->prepare($query);
    $sth->execute($param);
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre averti
    Femme Profil pro
    autodidacte
    Inscrit en
    Juin 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Juin 2014
    Messages : 45
    Par défaut
    Merci pour le retour rapide

    Ok pour le JOIN avant le WHERE -> corrigé (ça faisait des mois que j'avais pas touché à PHP).

    Ma logique fut de supprimer la parenthèse fermante de $query avec un chop, pour pouvoir ensuite rajouter mes WHERE, et de refermer cette parenthèse à la fin de mes conditions (normal Non ?) Non.. ok... bon??
    Donc j'ai commenté // $query.=chop($query,")"); et //$query.=")";, mais je reste avec Object of class PDOStatement could not be converted to string on line 13 // qui équivaudrait (j'en sais rien en fait) à
    $query.= " j.job_intitule=:job_intitule AND";

    Qu'en penses-tu ? Merci

  4. #4
    Membre averti
    Femme Profil pro
    autodidacte
    Inscrit en
    Juin 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Juin 2014
    Messages : 45
    Par défaut
    Hum ok, j'avais pas vu tout ça... Ok!, je ne connaissais pas cette méthode ! Merci beaucoup ! j'ai bien fait de poser la question cool - Thank u!

    Je repasse plus tard pour confirmer que sujet résolu

  5. #5
    Membre averti
    Femme Profil pro
    autodidacte
    Inscrit en
    Juin 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Juin 2014
    Messages : 45
    Par défaut
    Good morning!

    J'aurais encore quelques petites questions :

    - donc pas de typage des $params[] ? (du style PDO::PARAM_INT)
    - Après avoir corrigé la plupart de mes erreurs décelées, Il me reste une erreur Near : LIMIT 0,10 , et si avec mysql j'étais super à l'aise, là je ne sais pas ce que je dois faire... et n'arrive pas à trouver sur internet...

    Merci pour le guidage


    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
     
     
    $query =  "SELECT * FROM marinterim_job_offers j JOIN marimmo_villes v ON j.job_ville = v.ville_id ";
     $where = array();
     
      if (!empty($_REQUEST['job_searched']))
         { 	$where[] = "j.job_intitule=:job_intitule ";
            $param[':job_intitule'] = $_REQUEST['job_searched'];
         }
     
     if (!empty($_REQUEST['job_keyword']))
        { $where[] =  " j.job_descriptif LIKE CONCAT('%', :job_descriptif, '%') " ;
          $param[':job_descriptif'] = $_REQUEST['job_keyword'];
        }
     
     if (isset($_REQUEST['secteur_searched']) AND is_array($_REQUEST['secteur_searched']))
        {// $secteur = array_map(array($marInterim,"quotes"),$_REQUEST['secteur_searched']);
    	  $secteur_searched=implode(',',$_REQUEST['secteur_searched']);
    	  $where[] = "j.job_secteur IN (:secteur_searched) " ;
    	  $param[':job_secteur']= $secteur_searched;
    	}
     if(!empty($_REQUEST['type_de_contrat']) AND count($_REQUEST['type_de_contrat']) > 0 )
       {$type_de_contrat = count($_REQUEST["type_de_contrat"]) ? implode(",",$_REQUEST["type_de_contrat"]) : '';
        $where[]=  "j.job_contrat IN (:job_contrat) " ; 
    	$param[':job_contrat']= $type_de_contrat;
       }   
    if (isset($where)) 
       { 
    	 $query.= ' WHERE ' . implode(' AND ', $where); // WHERE crite1 AND critere2 AND critere 3, 
       }
     
     $query.= " ORDER BY j.job_date_insertion DESC"; 
     
     var_dump('$query1='. $query);
    $sth =$marInterim ->prepare($query);
    $sth->execute($param);
     
     
    $compte = $sth->fetchAll();
    $nb_resultats = count($compte); 
    $errors['nb_resultats_recherche'] = $nb_resultats; // ok
     
    /********************/
       if ( !empty($_REQUEST['afficher_x_resultats']))
    	  { $per_page=trim($_REQUEST['afficher_x_resultats']);
    	    $param[':per_page']= (int)$per_page;
    	  }
     else {$per_page=10;  
           $param[':per_page']= (int)$per_page;
    	   }
     
     
    /* Results per page */
    $nb_pages = ceil($nb_resultats/$per_page);  
    $current_page = isset($_REQUEST['page']) && ($_REQUEST['page'] > 0) && ($_REQUEST['page'] <= $nb_pages) ? $_REQUEST['page'] : 1;
    $start = ($current_page-1)*$per_page;  $param[':start']= (int)$start;
     
    $query2= $query." LIMIT :start,:per_page ";var_dump('$query2='. $query2);
     
     
    $sth2 =$marInterim ->prepare($query2);
    $sth2-> execute($param); 
     
     while($datos= $sth->fetch(PDO::FETCH_ASSOC))
          { $en_date_insertion=$datos['job_date_insertion'];	  
    		 $explode_insertion= explode("-", $en_date_insertion);
    		 $date_insertion_fr = $explode_insertion[2]."-".$explode_insertion[1]."-".$explode_insertion[0];
     
    		 $job_id= $datos['job_id'];
    		 $job_intitule= strtoupper($datos['job_intitule']);
    		 $job_ville = $datos['ville_nom'];
    		 $job_cp = $datos['cp'];
     
    		$errors['resultats_recherche'] = "
    										   <div class='offers btns'>
    										   <a class='link_vers_offre' href='job_offer_detail.php?job_id=$job_id'>
    										   <table id='table_liste_des_offres'>
    										   <tr>
    										   <td class='liste_intitule'> " .$job_intitule." </td>
    										   <td class='liste_ref'>Offre n°" .$job_id."   du   ".$date_insertion_fr ." </td>
    										   <td class='liste_ville'> ".$job_cp. " ".$job_ville." </td>
    										   </tr>
    										   </table>
    										   </a>
    										   </div>
    							             ";
     
    	  }

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Citation Envoyé par SunSeeker Voir le message
    Good morning!

    J'aurais encore quelques petites questions :

    - donc pas de typage des $params[] ? (du style PDO::PARAM_INT)
    - Après avoir corrigé la plupart de mes erreurs décelées, Il me reste une erreur Near : LIMIT 0,10 , et si avec mysql j'étais super à l'aise, là je ne sais pas ce que je dois faire... et n'arrive pas à trouver sur internet...
    Oui l'erreur sur la clause limit est bien connue. Tes tentatives de caster tes variables en int ne servent à rien. En fait quand on passe un tableau en paramètre à execute toutes les variables sont traitées comme des chaines de caractères (string). Donc il faudrait binder individuellement ces variables ce qui exclus l'usage du tableau pourtant bien pratique.
    Heureusement on peut désactiver l'émulateur php de pdo qui est à l'origine de ce comportement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $marInterim->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    De cette manière c'est l'émulateur du système de base de donnée qui sera utilisé et il va se renseigner sur le type attendu pour faire le bon choix.

    Tu peux d'ailleurs passer cette configuration dans les options de ta connexion car il est toujours conseillé d'utiliser l'émulateur du sgbd (de cette façon l'émulateur php ne se remettra en marche que si besoin)

Discussions similaires

  1. [PDO] requête sql avec PDO impossible
    Par HALOMOTO dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 22/03/2009, 00h17
  2. Query avec un CREATE TEMPORARY TABLE = erreur ?
    Par d3mone dans le forum Bases de données
    Réponses: 2
    Dernier message: 16/05/2007, 19h11
  3. [Visual Web] Query avec deux paramètres
    Par eponette dans le forum NetBeans
    Réponses: 1
    Dernier message: 19/03/2007, 13h44
  4. [PDO] Pb instanciation $statement avec PDO sous PHP
    Par tigunn dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 22/02/2007, 20h45
  5. optimisation query avec BETWEEN
    Par maxtin dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 13/01/2007, 01h22

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