Gunbaty
2011-03-03 09:00:02 UTC
Bonjour,
voilà une question qui semble souvent revenir:
faut-il utiliser un objet pour abstraire le SQL du php et ainsi gagner
en clareté avec juste des Array comme requete SQL ou utiliser un mélange
SQL / PHP avec un risque d'erreur plus grand, tout cela pour produire
plus vite ?
je m'explique voici un script classique avec de SQL :
/* *************************************** */
$query_base = "select b.*, c.* from biens b left join caracteristiques c
on c.caracteristique_biens_id = b.biens_id where b.biens_category_id 2
order b.biens_prix asc ";
$query_base_cnt = "select count(b.biens_id) from biens b left join
caracteristiques c on c.caracteristique_biens_id = b.biens_id where
b.biens_category_id = 2 ";
$result = mysql_query($query_base." limit 0, 20");
$result_cnt = mysql_query($query_base);
// solution 2
// $result_cnt = mysql_query($query_base_cnt);
if($result && is_ressource($result) && (mysql_num_rows($result)>0) )
{
echo '<br /> il y a '.mysql_num_rows($result)." affiché, et au
total ".mysql_num_rows($result_cnt);
while(($line = mysql_fetch_object($result)))
{
echo "<br /> ".$line->caracteristique_description." ::
".$line->biens_prix;
}
}
/* *************************************** */
voici maintenant une alternative objet de ma conception et utilisé par
de nombreux CMS / Framework
$_obj_sgbd = new StorageManagerSGBD(); // ne se connecte que lors de
l'envoie d'une requete SQL
$result = (($_obj_sgbd->fetchEnt(
array(
"biens"=>array(
storagemanager_queryfield=>array(
"biens_prix"=>array(">"=>2000),
"biens_category_id"=>2
),
storagemanager_returnfield=>array("*"),
storagemanager_limitfield=>array(0=>20),
storagemanager_orderfield=>array("biens_prix"=>"asc")
),
"caracteristiques"=>array(
storagemanager_queryfield=>array(
"caracteristiques_biens_id"=>array("="=>"biens_id")
),
storagemanager_returnfield=>array("*"),
),
)
)
)?$_obj_sgbd:$_obj_sgbd);
if($result && count($result)>0 )
{
echo '<br /> il y a '.count($result)." affiché, et au
total ".$result->count_all();
foreach($result as $_k_biens => $_v_biens)
{
echo "<br /> ".$_v_biens->caracteristique_description." ::
".$_v_biens->biens_prix;
}
}
/* *************************************** */
Voilà pour les exemples ...
dans la solution 1, pour modifier la requete et nombre de resultats il
faut intervenir sur les Deux Requete et si l'on veux changer les liaison
ou critere entre les table il faut connaitre le SQL.
Dans la solution Deux, tout n'est que Array et formulation uniforme pour
toutes les requete, l'objet est prevu pour se connecter UNIQUEMENT en
car de requete SQL.
Autre chose, dans le cas de la solution Deux, le comptage TOTAL et avec
le Limit SQL est dispo de suite pas de requete supplementaire (avec
mysqli), de ce fait un devellopeur ne connaissant rien a SQL peux
l'utiliser et tout les Script profite d'une clareté avec un simple
foreach, autre avantage, le prochain resultat de BDD est chargé à chaque
passage du foreach grace a SPL ArrayIterator sur l'objet, la
reutilisation du code est simplifier car abstrait de SQL et de toutes
confusion de variable, les updates, deletes et inserts se font avec des
primitives sur l'objet tels que : fetchEnt(), insertEnt(), deleteEnt(),
toutes acceptant un Array ou une Chaine SQL.
Donc meme un débutant en php peux l'utiliser, car les indexes du Array
sont le nom SQL des colonnes de la BDD et l'indice est la condition ou
liaison dans la requete sql.
Cepandant, je fait face a un chef de projet qui me dit ne pas comprendre
mon choix en POO et pretent que le "à l'ancienne ..." est plus rapide et
plus clair, ce que je conteste, car le taux d'erreur sur l'ancienne
methode et plus grand et ne gere en aucun cas les erreur, si ce n'est au
prix d'un code repetitif et avec plus de variable, donc un script plus
long a charger et comprendre.
Que en pensez-vous et quel solution preferez-vous ou proposeriez vous,
voire un commentaire sur ce post ?
voilà une question qui semble souvent revenir:
faut-il utiliser un objet pour abstraire le SQL du php et ainsi gagner
en clareté avec juste des Array comme requete SQL ou utiliser un mélange
SQL / PHP avec un risque d'erreur plus grand, tout cela pour produire
plus vite ?
je m'explique voici un script classique avec de SQL :
/* *************************************** */
$query_base = "select b.*, c.* from biens b left join caracteristiques c
on c.caracteristique_biens_id = b.biens_id where b.biens_category_id 2
order b.biens_prix asc ";
$query_base_cnt = "select count(b.biens_id) from biens b left join
caracteristiques c on c.caracteristique_biens_id = b.biens_id where
b.biens_category_id = 2 ";
$result = mysql_query($query_base." limit 0, 20");
$result_cnt = mysql_query($query_base);
// solution 2
// $result_cnt = mysql_query($query_base_cnt);
if($result && is_ressource($result) && (mysql_num_rows($result)>0) )
{
echo '<br /> il y a '.mysql_num_rows($result)." affiché, et au
total ".mysql_num_rows($result_cnt);
while(($line = mysql_fetch_object($result)))
{
echo "<br /> ".$line->caracteristique_description." ::
".$line->biens_prix;
}
}
/* *************************************** */
voici maintenant une alternative objet de ma conception et utilisé par
de nombreux CMS / Framework
$_obj_sgbd = new StorageManagerSGBD(); // ne se connecte que lors de
l'envoie d'une requete SQL
$result = (($_obj_sgbd->fetchEnt(
array(
"biens"=>array(
storagemanager_queryfield=>array(
"biens_prix"=>array(">"=>2000),
"biens_category_id"=>2
),
storagemanager_returnfield=>array("*"),
storagemanager_limitfield=>array(0=>20),
storagemanager_orderfield=>array("biens_prix"=>"asc")
),
"caracteristiques"=>array(
storagemanager_queryfield=>array(
"caracteristiques_biens_id"=>array("="=>"biens_id")
),
storagemanager_returnfield=>array("*"),
),
)
)
)?$_obj_sgbd:$_obj_sgbd);
if($result && count($result)>0 )
{
echo '<br /> il y a '.count($result)." affiché, et au
total ".$result->count_all();
foreach($result as $_k_biens => $_v_biens)
{
echo "<br /> ".$_v_biens->caracteristique_description." ::
".$_v_biens->biens_prix;
}
}
/* *************************************** */
Voilà pour les exemples ...
dans la solution 1, pour modifier la requete et nombre de resultats il
faut intervenir sur les Deux Requete et si l'on veux changer les liaison
ou critere entre les table il faut connaitre le SQL.
Dans la solution Deux, tout n'est que Array et formulation uniforme pour
toutes les requete, l'objet est prevu pour se connecter UNIQUEMENT en
car de requete SQL.
Autre chose, dans le cas de la solution Deux, le comptage TOTAL et avec
le Limit SQL est dispo de suite pas de requete supplementaire (avec
mysqli), de ce fait un devellopeur ne connaissant rien a SQL peux
l'utiliser et tout les Script profite d'une clareté avec un simple
foreach, autre avantage, le prochain resultat de BDD est chargé à chaque
passage du foreach grace a SPL ArrayIterator sur l'objet, la
reutilisation du code est simplifier car abstrait de SQL et de toutes
confusion de variable, les updates, deletes et inserts se font avec des
primitives sur l'objet tels que : fetchEnt(), insertEnt(), deleteEnt(),
toutes acceptant un Array ou une Chaine SQL.
Donc meme un débutant en php peux l'utiliser, car les indexes du Array
sont le nom SQL des colonnes de la BDD et l'indice est la condition ou
liaison dans la requete sql.
Cepandant, je fait face a un chef de projet qui me dit ne pas comprendre
mon choix en POO et pretent que le "à l'ancienne ..." est plus rapide et
plus clair, ce que je conteste, car le taux d'erreur sur l'ancienne
methode et plus grand et ne gere en aucun cas les erreur, si ce n'est au
prix d'un code repetitif et avec plus de variable, donc un script plus
long a charger et comprendre.
Que en pensez-vous et quel solution preferez-vous ou proposeriez vous,
voire un commentaire sur ce post ?