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 :

Algo d'une fonction [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Par défaut Algo d'une fonction
    Je souhaite créer une fonction qui gère les clauses ORDER BY et LIMIT. J'ai donc fait ceci :
    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
     
    function getSelection($identifiant_selection, $rang = true, $rand = false, $limit = false) {
    	global $db;
    	$orderby = '';
    	if($rang == false and $rand == false) $orderby .= 'si.rang_item';
    	if($rang == true and $rand == false) $orderby .= 'si.rang_item';
    	if($rang == false and $rand == true) $orderby .= 'rand()';
    	if($rang == true and $rand == true) $orderby .= 'rand(), si.rang_item';
    	$sql = 'SELECT si.url_item as url, si.rang_item as rang FROM selections_items si
    		INNER JOIN selections s ON s.id_selection = si.selection_id
    		WHERE s.identifiant_selection = :identifiant_selection ';
    	$sql .= 'ORDER BY '.$orderby;
    	if($limit != false) $sql .= ' LIMIT '.$limit;
    	$statement = $db->prepare($sql);
    	$statement->execute(array(':identifiant_selection' => $identifiant_selection));	
    	return $statement->fetchAll();
    }
     
    //ceci marche
    getSelection(2);
     
    //ceci ne marche pas
    getSelection(2, $limit = 20);
    En dehors de $identifiant_selection, les autres arguments semblent pas être pris en compte par la fonction.

    Merci d'avance pour votre aide.

    Meilleures salutations.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Par défaut
    Pour être plus simple, je souhaite une fonction qui me permette de régler sur mesure une requête SELECT, les clauses ORDER BY et LIMIT, et la fonction RAND() de MySQL.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function mafonction($rang = true, $rand = false, $limit = false){
        $sql = 'SELECT * FROM matable';
    }
    Merci d'avance...

  3. #3
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    J'ai déjà fait ça dans Axiom; regarde cette classe, ça te donnera des idées: https://github.com/bdelespierre/php-...ject.class.php

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    J'ai déjà fait ça dans Axiom; regarde cette classe, ça te donnera des idées: https://github.com/bdelespierre/php-...ject.class.php
    J'ai regardé merci, mais la POO c'est pas mon truc.

  5. #5
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    C'est pas beaucoup plus compliqué en procédural:
    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
    function generate_select_query ($connection, $type, $fields, $table, array $where = array(), array $group_by = array(), array $limit = array()) {
      $query = "SELECT " . implode(',', $fields) . " FROM {$table}";
     
      if (!emtpy($where)) {
        $pieces = array();
        foreach ($where as $key => $value) {
          $value = mysql_real_escape_string($value, $connection);
          $pieces[] = "$key=$value";
        }
        $query .= " WHERE " . implode(' AND ', $pieces);
      }
     
      if (!empty($group_by))
        $query .= " GROUP BY " . implode(',', $group_by);
     
      if (count($limit) == 1)
        $query .= " LIMIT {$limit[0]}";
      if (count($limit) == 2)
        $query .= " LIMIT {$limit[0]},{$limit[1]}";
     
      return $query;
    }

  6. #6
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    C'est pas beaucoup plus compliqué en procédural:
    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
    function generate_select_query ($connection, $type, $fields, $table, array $where = array(), array $group_by = array(), array $limit = array()) {
      $query = "SELECT " . implode(',', $fields) . " FROM {$table}";
     
      if (!emtpy($where)) {
        $pieces = array();
        foreach ($where as $key => $value) {
          $value = mysql_real_escape_string($value, $connection);
          $pieces[] = "$key=$value";
        }
        $query .= " WHERE " . implode(' AND ', $pieces);
      }
     
      if (!empty($group_by))
        $query .= " GROUP BY " . implode(',', $group_by);
     
      if (count($limit) == 1)
        $query .= " LIMIT {$limit[0]}";
      if (count($limit) == 2)
        $query .= " LIMIT {$limit[0]},{$limit[1]}";
     
      return $query;
    }
    On peut voir un exemple d'utilisation?
    Merci d'avance...

  7. #7
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    J'ai repris ton code et on devrait arriver au même résultat à ceci près c'est que tu devrais le sécuriser un peu et surtout ne pas présumer que ta requête se déroulera sans aucun problème. Vu que tu utilise une ressource (PDO), rien ne te garantit qu'elle est diponible ou que ta requête est montée sans erreur d'où l'exécution dans un try-catch{}

    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
    <?php
     
    function getSelection($identifiant_selection, $rang = true, $rand = false, $limit = false) {
       global $db;
       $orderBy = array();
     
       if ($rand) {
          $orderBy[] = 'rand()';
       }
       if ($rang) {
          $orderBy[] = 'si.rang_item';
       }
       $sqlOby = ' ORDER BY ' . ((empty($orderBy)) ? 'si.rang_item' : implode(', ', $orderBy));
       $sqlLim = ($limit) ? ' LIMIT ' . $limit : NULL;
     
       $sql = <<<SQL
    SELECT si.url_item as url, si.rang_item as rang
    FROM selections_items si
       INNER JOIN selections s ON s.id_selection = si.selection_id
    WHERE s.identifiant_selection = :identifiant_selection
    $sqlOby
    $sqlLim
    SQL;
     
       try {
          $stmt = $db->prepare($sql);
          $exec = $stmt->execute(array(':identifiant_selection' => intval($identifiant_selection)));
          return ($exec) ? $stmt->fetchall() : array();
       }
       catch (Exception $e) {
          // traiter l'erreur ici
     
       }
    }
     
    ?>

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 17/11/2012, 01h57
  2. Comment chronométrer une fonction
    Par 323 dans le forum Pascal
    Réponses: 3
    Dernier message: 19/03/2003, 20h24
  3. [VBA-E] avec une fonction value
    Par laas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2002, 13h22
  4. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

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