PDO requêtes préparées

Eléphanteau du PHP | 24 Messages

18 mai 2015, 10:34

Bonjour,

Dans mon projet en orienté objet PHP (PDO), j'ai une fichier class.requete.php.
Dans ce fichier, j'aimerai rassembler 5 à 10 fonctions contenant chacune une requête préparée .

Avec par exemple, une fonction " getMaxParticipants () " affichant un select du plus grand nombre de participants à un festival, ou une fonction " getMaxVisiteurs() " affichant un select du plus grand nombre de visiteurs etc...

Ma requête :
SELECT event_tks_eventname
FROM `vtiger_metrics` 
JOIN vtiger_event ON metrics_tks_event = eventid
JOIN vtiger_crmentity ON crmid = metricsid
WHERE deleted =0
AND metrics_tks_number = ( 
SELECT metrics_tks_number
FROM vtiger_metrics
JOIN vtiger_crmentity ON crmid = metricsid
WHERE deleted =0
ORDER BY CAST( metrics_tks_number AS SIGNED ) DESC 
LIMIT 1 )
Pour exécuter ma requête :
$data["text"] = '['.$link[5]['event_tks_eventname'].']'.' '.$link[5]['metrics_tks_number'].' '.$link[5]['metrics_tks_name'].' " ;
J'ai mes requêtes, ainsi que l'idée de mes fonctions mais pas la syntaxe pour imaginer la chose suivante :

Je souhaite varier du texte lié à chacune des requêtes. J'ai pensé opter pour la requête préparée afin d'y ajouter une partie variable comme du texte (texte lié à une requête dans un array) à la partie fixe de mes données MySql ($link[5]['event_tks_eventname']).

Exemple pour la fonction du nombre maximum de participant, je souhaite y ajouter le texte " à l'occasion de ", ce qui me donnerai :

"8000 participants à l'occasion de Festival"

... ou pour la fonction du nombre de visiteurs, je souhaite y ajouter le texte "vous accueuille", ce qui donnerai :

"6000 visiteurs vous accueuille"

En résumé, je souhaite pouvoir publier différentes requêtes avec du texte varié, mais je n'ai pas la syntaxe :/

Merci pour le coup de pouce :)
" Le Chêne fut un gland avant de devenir le Majestueux Grand Chêne "

Eléphanteau du PHP | 24 Messages

18 mai 2015, 12:36

Voici mon idée de départ, mais je ne suis pas sûre de moi :/ :

fichier class.requete.php
public function getMaxArtist($link, $texte = array()){

	$texte = array("à l'occasion de");

	$sqlReq = $db->prepare("SELECT event_tks_eventname, metrics_tks_number
FROM `vtiger_metrics` WHERE event_tks_concept = :event_tks_concept
JOIN vtiger_event ON metrics_tks_event = eventid
JOIN vtiger_crmentity ON crmid = metricsid
WHERE deleted =0
AND metrics_tks_number = ( 
SELECT metrics_tks_number
FROM vtiger_metrics
JOIN vtiger_crmentity ON crmid = metricsid
WHERE deleted =0
ORDER BY CAST( metrics_tks_number AS SIGNED ) DESC 
LIMIT 1 )");
	$sqlReq->bindValue(':event_tks_concept', $texte, PDO::PARAM_STR);
	$sqlReq->execute();

	$link = $sqlReq->fetchAll();

}
fichier class.main.php
$data['text'] = $link[5]['metrics_tks_number'].' '.$link[5]['event_tks_eventname'].' '.getMaxArtist($texte);
" Le Chêne fut un gland avant de devenir le Majestueux Grand Chêne "

Avatar du membre
Mammouth du PHP | 1609 Messages

19 mai 2015, 11:22

Salut LylouBeta, le principe de la fonction c'est que tu vas lui passer des paramètres, puis elle va faire des traitements avec ces paramètres et enfin elle va te retourner un résultat.

En l'occurrence ta fonction fait une requête sans utiliser aucun des paramètres en entrée et ne retourne aucun résultat.

Dans class.main.php tu concatènes deux colonnes du résultat de ta requête et tu concatènes ensuite la fonction getMaxArtist qui ne retourne rien.
Tu auras donc une chaine dans $data['text'] avec les valeurs de metrics_tks_number et event_tks_eventname séparés par un espace puis suivis d'un espace.

Si le but de getMaxArtist est de créer une phrase avec metrics_tks_number et event_tks_eventname, tu devrais passer ces deux paramètres à la fonction qui créera la phrase appropriée avec puis la retournera.

A l'utilisation tu auras un code comme ça :
$data['text'] = getMaxArtist($link[5]['metrics_tks_number'], $link[5]['event_tks_eventname']);
A noter que si tu utilises cette fonction uniquement à cet endroit, il n'y a pas grand intérêt à faire une fonction pour ça. Les fonctions servent essentiellement lorsque tu as besoin d'exécuter le même code à des endroits différents. Ça évite d'avoir des redondances de code.

EDIT
Etant donné que les deux paramètres sont les colonnes d'une même ligne tu pourrais même appeler la fonction comme ça, en lui passant juste la ligne (il faut bien entendu adapter la définition et le code de la fonction) :
$data['text'] = getMaxArtist($link[5]);
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 24 Messages

20 mai 2015, 09:44

Merci pour tout Saian ;)
" Le Chêne fut un gland avant de devenir le Majestueux Grand Chêne "