Est-il possible de simplifier un peu ce script ?

WRInaute occasionnel
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.
 
WRInaute accro
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]
 
WRInaute impliqué
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.
 
WRInaute occasionnel
Salut à vous, merci pour vos réponses
spout a dit:
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 />&nbsp;</span><span class="syntaxdefault"></span>
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é ?

loubet a dit:
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.
Tout est dans le verbe "détecter", quelle fonction va se charger de cela ?
 
WRInaute impliqué
$lettre = "";
while(){
if($lechamp[0] == $lettre){
// nouvelle lettre, on affiche ce qui est nécessaire

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

}
 
WRInaute occasionnel
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 ?
 
Discussions similaires
Haut