1. ✅ Apprenez une METHODE qui marche pour votre SEO ! Formation à distance avec Olivier Duffez et Fabien Facériès + aide pour prise en charge du financement
    Rejeter la notice

Est-il possible de simplifier un peu ce script ?

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par Alorsladaccord, 21 Septembre 2015.

  1. Alorsladaccord
    Alorsladaccord WRInaute occasionnel
    Inscrit:
    30 Juillet 2014
    Messages:
    485
    J'aime reçus:
    0
    Bonjour,

    C'est donc la première fois que je bosse avec les requêtes préparées, et j'ai ouïe dire qu'elles ont l'avantage de pouvoir être réutilisées. Ce qui doit donc simplifier les scripts. Pourtant, le modeste script suivant me parait encore bien lourd.
    Il s'agit tout simplement d'afficher les articles d'une base de données, en les classant par ordre alphabétique. D'abord ceux qui commencent par A, puis ceux qui commencent par B, etc...

    Effectivement, je n'ai pas besoin de réécrire à chaque fois la même requête, c'est déjà ça de gagner. Mais suis-je pour autant obligé de me farcir 26 boucle while ? Comme vous pouvez le constater, la deuxième partie du script (lettre B) est en fait identique à la première (lettre A), à ceci prêt que je ne réécris pas la requête et change seulement la valeur de la variable $lettre.

    Code:
    
    //=================== LA LETTRE A ================
    $lettre=a;
    
    /** on définit la requete sql */
    $sql = "SELECT *
    FROM cms_custom_database_2
    WHERE field_12 
    LIKE :lettre
    ORDER BY field_9
    ";
    
    $stmt = $dbh->prepare ($sql); /* On prépare la requête */
    
    /** On prépare les paramètres */
    $params = array(':lettre' => $lettre);
    
    /** On execute la requete */
    $stmt->execute($params);
    while($lettre=$params = $stmt->fetch(PDO::FETCH_OBJ))
    {
    echo '<b>
    <a href="http://www.dictionnaire.com/definition.php/'.$lettre->record_dynamic_furl.'-r'.$lettre->primary_id_field.'">'.$lettre->field_9.'</a>
    <br></b>';
    }//ferme while
    
    //=================== LA LETTRE B ================
    $lettre=b;
    
    
    $stmt = $dbh->prepare ($sql); /* On prépare la requête */
    
    /** On prépare les paramètres */
    $params = array(':lettre' => $lettre);
    
    /** On execute la requete */
    $stmt->execute($params);
    while($lettre=$params = $stmt->fetch(PDO::FETCH_OBJ))
    {
    echo '<b>
    <a href="http://www.dictionnaire.com/definition.php/'.$lettre->record_dynamic_furl.'-r'.$lettre->primary_id_field.'">'.$lettre->field_9.'</a>
    <br></b>';
    }//ferme while

    Qu'en pensez-vous ? Si vous voyez des redondances là dedans, merci de me l'expliquer.
     
  2. Alorsladaccord
    Alorsladaccord WRInaute occasionnel
    Inscrit:
    30 Juillet 2014
    Messages:
    485
    J'aime reçus:
    0
    Bah c'est réglé en fait, vous bilez pas, merci.
     
  3. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    9 057
    J'aime reçus:
    294
    Perso ce code ressemblerais plus à ça:
    CakePHP:
    PHP:
    <span class="syntaxdefault"><br /></span><span class="syntaxkeyword"><?</span><span class="syntaxdefault">php<br />$letter </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> </span><span class="syntaxstring">'a'</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">$definitions </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> $this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">Definition</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">findAllByLetter</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$letter</span><span class="syntaxkeyword">);<br />foreach(</span><span class="syntaxdefault">$definitions as $definition</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">    $url </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> Router</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">url</span><span class="syntaxkeyword">([</span><span class="syntaxstring">'controller'</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">=></span><span class="syntaxdefault"> </span><span class="syntaxstring">'definitions'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> </span><span class="syntaxstring">'action'</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">=></span><span class="syntaxdefault"> </span><span class="syntaxstring">'view'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $definition</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'Definition'</span><span class="syntaxkeyword">][</span><span class="syntaxstring">'id'</span><span class="syntaxkeyword">]]);<br /></span><span class="syntaxdefault">    $link </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> sprintf</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'<a href="%s">%s</a>'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $url</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $definition</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'Definition'</span><span class="syntaxkeyword">][</span><span class="syntaxstring">'title'</span><span class="syntaxkeyword">]);<br />}<br /></span><span class="syntaxdefault"></span>
    Django:
    Code:
    letter = 'a'
    definitions = Definition.objects.filter(letter=letter)
    for definition in definitions:
        link = '<a href="%s">%s</a>' % (definition.get_absolute_url(), definition.title)
    
    :mrgreen:

    [/troll]
     
  4. loubet
    loubet WRInaute impliqué
    Inscrit:
    19 Février 2003
    Messages:
    792
    J'aime reçus:
    0
    1 seule requete suffit au lieu de 26, avec WHERE 1 ORDER BY field_12, field_9
    et lors du parcours du résultat, détecté le changement de lettre.
     
  5. Alorsladaccord
    Alorsladaccord WRInaute occasionnel
    Inscrit:
    30 Juillet 2014
    Messages:
    485
    J'aime reçus:
    0
    Salut à vous, merci pour vos réponses
    J'ai encore du mal avec mysqli, c'est la première fois que je programme ainsi (je sais, je retarde). Alors les Router, et autre controller... Sans parler de cette nouvelle fonction findAllByLetter()... Pas grand chose dessus sur internet. Ca classe tout directement par lettre, c'est ça ? C'est magique. Et comment vais-je intercaler un sous titre "lettre A : ", "lettre B : ", etc... :?:
    Cela étant, j'ai réussi en faisant ce qui suit :
    Code:
    
    /**---------------la requête initiale
    /** on définit la requete sql */
    $sql = "SELECT *
    FROM cms_custom_database
    WHERE field_12 
    LIKE :lettre
    ORDER BY field_9
    ";
    $stmt = $dbh->prepare ($sql); /* On prépare la requête */   
    $lettres = range('a', 'z');
    foreach ($lettres as $lettre) { 
    	/** On prépare les paramètres */
    	$params = array(':lettre' => $lettre);
    	/** On execute la requete */
    	$stmt->execute($params);
    	while($res = $stmt->fetch(PDO::FETCH_OBJ))
    	{
    	echo '
    <b>
    	<a href="http://www.dictionnaire.com/definition.php/'.$res->record_dynamic_furl.'-r'.$res->primary_id_field.'">'.$res->field_9.'</a>
    	<br></b> 
      ';
    }//ferme while
    }//ferme foreach
     
    Ca fonctionne, mais je me demande si le LIKE dans la requête est adéquate, vu que la recherche est bien précise, il s'agit d'une lettre sans accent. Encore que... Et si la lettre est en majuscule ? Ah ah ! Comment parer cette éventualité ?

    Tout est dans le verbe "détecter", quelle fonction va se charger de cela ?
     
  6. loubet
    loubet WRInaute impliqué
    Inscrit:
    19 Février 2003
    Messages:
    792
    J'aime reçus:
    0
    $lettre = "";
    while(){
    if($lechamp[0] == $lettre){
    // nouvelle lettre, on affiche ce qui est nécessaire

    $lettre = $lechamp[0];
    }
    // on affiche la ligne

    }
     
  7. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    9 057
    J'aime reçus:
    294
    C'est une méthode générée automatiquement via méthode magique "__call" de l'ORM: http://php.net/manual/fr/language.oop5.overloading.php#object.call
    Donc normal que tu n'ailles rien trouvé la dessus ;)
     
  8. Alorsladaccord
    Alorsladaccord WRInaute occasionnel
    Inscrit:
    30 Juillet 2014
    Messages:
    485
    J'aime reçus:
    0
    Holala, c'est devenu du charabia pour moi tout ça. Je n'ai plus programmé sérieusement depuis 2010, environ... N'y-a-t'il pas un index chronologique des évolutions PHP depuis lors ? Que je sache au juste ce qui a changé, ce qui est en plus, ce qui est en moins ?
     
Chargement...
Similar Threads - possible simplifier script Forum Date
Twitter et Facebook : est-il possible de simplifier le couple de script HTML5? Développement d'un site Web ou d'une appli mobile 3 Mai 2012
Search Console Sitemaps non indéxés ""Impossible de recuperer le sitemap" Crawl et indexation Google, sitemaps 23 Juillet 2020
Site langue fr au Maroc : lang fr-MA possible ? Référencement international (langues, pays) 23 Juin 2020
Impossible d'ouvrir page FB Facebook 22 Mai 2020
Un tel fonctionnement de google est-il possible ? Référencement Google 4 Mars 2020
Pénalisation site à cause d'une adresse IP, possible ? Référencement Google 22 Décembre 2019
Faire des 301 sans accès à son serveur : possible ? Développement d'un site Web ou d'une appli mobile 27 Novembre 2019
supprimer /index.html sans url rewriting, possible ? URL Rewriting et .htaccess 13 Novembre 2019
Comment ce spam en recherche locale est-il possible ? Netlinking, backlinks, liens et redirections 9 Octobre 2019
Est-il possible d'avoir un compte Adwords alimenté par deux comptes bancaires différents ? AdWords 9 Octobre 2019