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

  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
     
       }
    }
     
    ?>

  8. #8
    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 rawsrc Voir le message
    try-catch{}
    Merci.
    J'ai essayé d’alléger le code :
    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
     
    function mafonction($rang = true, $sort = false, $rand = false, $limit = false) {
       $orderBy = array();
       if ($rand) $orderBy[] = 'rand()';
       if ($rang) $orderBy[] = 'monchamp'. ($sort) ? '' : ' DESC';
       $sqlOby = ' ORDER BY ' . ((empty($orderBy)) ? 'monchamp' : implode(', ', $orderBy));
       $sqlLim = ($limit) ? ' LIMIT ' . $limit : NULL;
       $sql = <<<SQL
    SELECT * FROM matable
    $sqlOby
    $sqlLim
    SQL;
       echo $sql;
    }
    mafonction($limit = 12) //Resultat SELECT * FROM matable ORDER BY
    Les paramètres ne passent pas.

  9. #9
    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
    Citation Envoyé par okoweb Voir le message
    Les paramètres ne passent pas.
    Avec ton code c'est tout à fait normal : problème de précédence des opérateurs ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($rang) $orderBy[] = 'monchamp'. ($sort) ? '' : ' DESC';
    Regardes ici
    La concaténation est prioritaire sur l'opérateur ternaire.
    Ton code revient à faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($rang) $orderBy[] = ('monchamp' . ($sort)) ? '' : ' DESC';
    Dans ce cas, la concaténation renverra TRUE et $orderBy[] sera rempli avec "".

    Dès que tu as un doute, mets des parenthèses.

    Code corrigé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($rang) $orderBy[] = 'monchamp' . (($sort) ? '' : ' DESC');
    Et je te conseillerai de prendre l'habitude de mettre des { } même pour une ligne c'est comme pour le parenthèses cela t'évitera des longues heures de débogage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ($rang) { 
       $orderBy[] = 'monchamp' . (($sort) ? '' : ' DESC');
    }

  10. #10
    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
    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
     
     
    function mafonction($rang = true, $sort = false, $rand = false, $limit = false) {
       $orderBy = array();
       if ($rand) $orderBy[] = 'rand()';
       if ($rang) $orderBy[] = 'monchamp'. (($sort) ? ' ASC' : ' DESC');
       $sqlOby = ' ORDER BY ' . ((empty($orderBy)) ? 'monchamp' : implode(', ', $orderBy));
       $sqlLim = ($limit) ? ' LIMIT ' . $limit : NULL;
       $sql = <<<SQL
    SELECT * FROM matable
    $sqlOby
    $sqlLim
    SQL;
       echo $sql;
    }
    mafonction($sort = true, $limit = 12); //SELECT * FROM matable ORDER BY monchamp ASC
    $sqlOby marche parfaitement maintenant mais $sqlLim ne marche toujours pas.

    Merci d'avance...

  11. #11
    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
    Citation Envoyé par okoweb Voir le message
    $sqlLim ne marche toujours pas.
    Ah bon, chez moi quand je fais :
    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
    <?php
     
    function mafonction($rang = true, $sort = false, $rand = false, $limit = false) {
       $orderBy = array();
       if ($rand) $orderBy[] = 'rand()';
       if ($rang) $orderBy[] = 'monchamp'. (($sort) ? ' ASC' : ' DESC');
       $sqlOby = ' ORDER BY ' . ((empty($orderBy)) ? 'monchamp' : implode(', ', $orderBy));
       $sqlLim = ($limit) ? ' LIMIT ' . $limit : NULL;
       $sql = <<<SQL
    SELECT * FROM matable
    $sqlOby
    $sqlLim
    SQL;
       echo $sql;
    }
    mafonction(true, true, false, 12);
    ?>
    Je récupère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM matable ORDER BY monchamp ASC LIMIT 12
    Donc ça marche.

  12. #12
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mafonction(true, true, false, 12);
    Si je comprends bien, à chaque appel de la fonction, il faut renseigner obligatoirement tous ses paramètres.

    Merci d'avance...

  13. #13
    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
    Citation Envoyé par okoweb Voir le message
    Si je comprends bien, à chaque appel de la fonction, il faut renseigner obligatoirement tous ses paramètres.
    Pas obligatoirement, tout dépend de l'ordre des paramètres avec des valeurs par défaut (dits paramètres optionnels).
    Un paramètre sans valeur par défaut est obligatoire et un avec est optionnel.
    On place généralement les paramètres obligatoires ou changeant souvent au début de déclaration et on termine par les paramètres optionnels.
    Si ta déclaration avait été :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function mafonction($limit = false, $rang = true, $sort = false, $rand = false)
    Ton appel aurait pu s'écrire tout simplement : Les paramètres optionnels restant ($rang, $sort, $rand) auront leur valeur par défaut dans le corps de la fonction.
    Maintenant si tu dois modifier la valeur d'un paramètre en fin de déclaration, tu n'as pas d'autre choix que de renseigner tous les paramètres (même optionnels) le précédant.

    Une dernière chose, les paramètres nommés ne sont pas pris en charge par PHP. Avec cette déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function mafonction($rang = true, $sort = false, $rand = false, $limit = false)
    Ton appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mafonction($sort = true, $limit = 12)
    n'affecte pas du tout true à $sort et 12 à $limit. Cela revient à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    mafonction(true, 12)
    // $rang = true
    // $sort = 12
    // $rand = false (valeur par défaut)
    // $limit = false (valeur par défaut)
    En espérant avoir été clair.

  14. #14
    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
    Merci à vous tous.

+ 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