Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/10/2011, 10h26   #1
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 711
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 711
Points : 328
Points : 328
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 :
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.
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 11h11   #2
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 711
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 711
Points : 328
Points : 328
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 :
1
2
3
4
 
function mafonction($rang = true, $rand = false, $limit = false){
    $sql = 'SELECT * FROM matable';
}
Merci d'avance...
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 12h16   #3
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 991
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 991
Points : 5 032
Points : 5 032
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
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 14h48   #4
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 711
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 711
Points : 328
Points : 328
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.
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 15h00   #5
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 991
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 991
Points : 5 032
Points : 5 032
C'est pas beaucoup plus compliqué en procédural:
Code :
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;
}
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 15h44   #6
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 711
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 711
Points : 328
Points : 328
Citation:
Envoyé par Benjamin Delespierre Voir le message
C'est pas beaucoup plus compliqué en procédural:
Code :
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...
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 15h50   #7
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
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 :
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
 
   }
}
 
?>
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 17h24   #8
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 711
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 711
Points : 328
Points : 328
Citation:
Envoyé par rawsrc Voir le message
try-catch{}
Merci.
J'ai essayé d’alléger le code :
Code :
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.
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 17h56   #9
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
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 :
if ($rang) $orderBy[] = 'monchamp'. ($sort) ? '' : ' DESC';
Regardes ici
La concaténation est prioritaire sur l'opérateur ternaire.
Ton code revient à faire ceci :
Code :
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 :
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 :
1
2
3
if ($rang) { 
   $orderBy[] = 'monchamp' . (($sort) ? '' : ' DESC');
}
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 18h34   #10
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 711
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 711
Points : 328
Points : 328
Code :
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...
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 19h04   #11
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Citation:
Envoyé par okoweb Voir le message
$sqlLim ne marche toujours pas.
Ah bon, chez moi quand je fais :
Code :
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 :
SELECT * FROM matable ORDER BY monchamp ASC LIMIT 12
Donc ça marche.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2011, 18h03   #12
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 711
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 711
Points : 328
Points : 328
Code :
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...
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/11/2011, 10h30   #13
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
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 :
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 :
function mafonction($rang = true, $sort = false, $rand = false, $limit = false)
Ton appel :
Code :
mafonction($sort = true, $limit = 12)
n'affecte pas du tout true à $sort et 12 à $limit. Cela revient à ceci :
Code :
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.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/11/2011, 11h58   #14
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 711
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 711
Points : 328
Points : 328
Merci à vous tous.
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h06.


 
 
 
 
Partenaires

Hébergement Web