Script php de creation de tableau a partir de requete mysql

Eléphant du PHP | 187 Messages

03 oct. 2007, 18:30

Salut à tous,

une chtite fonction bien utile pour des requetes simple.
Pour changer le nom des colonnes pour eviter d'avoir le nom de la colonne dans la base, pensez au AS ;)
function query2tab($query, $designation) {

  if(preg_match('/SELECT|DELETE|REPLACE|DROP|TRUNCATE/', $query)
    return 'La requête que vous tentez d\'executer contient des éléments indésirables';

  $query_sql =  db_request($query);
  
  if (mysql_num_rows($query_sql)) 
  {
    $html_code_out =
    '<table class="result_query">' . "\n" .
    '  <caption>' . $designation . '</caption>' . "\n" .
    '  <thead>' . "\n" .
    '    <tr>' . "\n";
    for ($i=0; $i<mysql_numfields($query_sql); $i++)
      $html_code_out .= '      <th>' . mysql_field_name($query_sql, $i) . '</th>' .  "\n";
    $html_code_out .= 
    '    </tr>' . "\n" .
    '  </thead>' . "\n" .
    '  <tbody>' . "\n";
    while($query = mysql_fetch_array($query_sql, MYSQL_NUM))
    {
      $html_code_out .= '    <tr>' . "\n";
      for($j=0; $j<mysql_numfields($query_sql); $j++)
        $html_code_out .= '      <td>' . $query[$j] . '</td>' . "\n";
      $html_code_out .= '    </tr>' . "\n";
    }
    $html_code_out .= '  </tbody>' . "\n";
    $html_code_out .= '</table>' . "\n";
  }
  else $html_code_out = '<span class="no_result">La requête proposée n\'a pas retournée de resultats</span>';
  return $html_code_out;
}
Pour info : cette fonction sort un code propre (HTML strict), valide W3C et qui pemret de tout stiliser sans mal avec des CSS grace à l'utilisation des balises appropriées

Netsupra
Modifié en dernier par netsupra le 03 oct. 2007, 19:27, modifié 4 fois.

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

03 oct. 2007, 19:13

Sympa, juste deux remarques :


- 1 - Sécurité

En sécurité, plutôt que de fermer au cas par cas, on ferme tout et on ouvre au cas par cas. Exprimé dans le cas de ta fonction, il faut faire un choix :
- Doit-on sécuriser la fonction ? A priori c'est plutôt en amont que la sécurisation doit être faite, donc on peut légitimement se poser la question.
- Si on doit sécuriser, pourquoi refuser DELETE et UPDATE et laisser passer REPLACE et DROP ? Ne vaut-il pas mieux n'autoriser que SELECT, et refuser tout le reste ? ;)


- 2 - Détails

- Pourquoi le paramètre $query est facultatif ? Il ne devrait pas être obligatoire ?

- ereg() et eregi() sont des fonctions à éviter, quand on veut faire des expressions régulières il vaut mieux s'appuyer sur les PCRE : c'est la première optimisation à faire quand on croise un script avec des regex POSIX. En reprenant le premier point, ton test deviendrait donc
if (!preg_match('/^SELECT/i', ltrim($query))) {
    // erreur sécurité
}
- attention, je pense que tu as laissé un db_request() là où il devrait y avoir un mysql_query() ;)

Eléphant du PHP | 187 Messages

03 oct. 2007, 19:22

- Si on doit sécuriser, pourquoi refuser DELETE et UPDATE et laisser passer REPLACE et DROP ?
Parceque j'ai oublié de les interdire :D (J'ai aussi interdit TRUNCATE)
- 2 - Détails

- Pourquoi le paramètre $query est facultatif ? Il ne devrait pas être obligatoire ?
J'ai simplement oublié d'enlever l'affectation qui le rend facultatif (cette fonction est au depart beaucoup plus complexe. J'ai uniquement posté ce qui peut etre utilisé dan,s un contexte général)
- ereg() et eregi() sont des fonctions à éviter, quand on veut faire des expressions régulières il vaut mieux s'appuyer sur les PCRE : c'est la première optimisation à faire quand on croise un script avec des regex POSIX. En reprenant le premier point, ton test deviendrait donc
if (!preg_match('/^SELECT/i', ltrim($query))) {
    // erreur sécurité
}
Merci pour l'info. Je ne suis pas très a l'aise avec les expressions regulieres
- attention, je pense que tu as laissé un db_request() là où il devrait y avoir un mysql_query() ;)
Pour info : la fonction db_request :D
function db_request($request) {
  $query = trim($request);
  $sql = mysql_query($query) or die('Erreur lors de l\'exécution de la requête : ' . mysql_error() . "\n" . $query);
  return $sql;
}
J'essaye de corriger ca ;)