begin process at 2012 02 11 18:34:13
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > CLASSE QUI EXECUTE LES REQUETES NOOBIES ET EXPERTS SOUHAITANT CLARIFIER LE CODE

CLASSE QUI EXECUTE LES REQUETES NOOBIES ET EXPERTS SOUHAITANT CLARIFIER LE CODE


 Information sur la source

Note :
Aucune note
Catégorie :Class et Objet ( POO ) Classé sous :classegeneriquesimple, aideaurequete, phpfacile, assistantrequete, generique Niveau :Initié Date de création :28/02/2007 Date de mise à jour :07/03/2007 13:16:18 Vu / téléchargé :2 185 / 70

Auteur : savon

Ecrire un message privé
Site perso
Commentaire sur cette source (37)
Ajouter un commentaire et/ou une note

 Description

Cette classe permet de faire des requete sans les ecrire .
Je l'ai crée en 4 émé année a l'esgi.
Depuis je l'utilise et l'ameliore de temps a autres.
Elle m'a fait gagné enormement de temps aussi je la soumet et espere que des gens l'utiliseron et l amelorement aussi.
Il exsite une version que j ai ecrite en collaboration avec le DataDef qui fera l'objet d un prochain POST

Exemples d'utilisation:
$objet_genere_resultats = new genere_resultats(); #mon nouvel objet
$objet_genere_resultats->set_param('commande_tmp ',''); # instanciation qui pointe sur la table desirée
#-----------Extration du detail -----------------
$ligneCommande=$objet_genere_r esultats->GetValuesbyTableWhere($com_id,'com_id');
while ($ligneCmd = mysql_fetch_array($ligneCommande)) {
$a=$ligneCmd['com_taille'] . "<br>";
$b=$ligneCmd['com_recette']. "<br>";
$c=$ligneCmd['com_forme'];
}

# mise a jour d un champ
$objet_genere_resultats->UpdateField('com_p ic_2',$fnew_name,$com_id,'com_id');
# mise a jour des données d un formulaire
$objet_genere_resultats->UpdateTable($ _POST,$com_id,'com_id');  # il faut par contre que les noms des champs de formulaires soit les meme que ceux que vous avez en base de donnée pensez a faire des unset($_POST['valid_x']);unset($_POST['valid_y']); si necessaire ainsi la classe mettra a jour la base de donnée l'insertion est calqué sur le meme systeme.

Voila  qui devrai vous faire gagner du temps.
N'oubliez pas d'effecturer au prealable la connexion a la base de donnée.
Un exemple de ce code est sur le site de rencontre www.love2love.com
Savon.

Source

  • <?php
  • #Ma classe genere les resultats.
  • Class genere_resultats {
  • var $table;
  • var $base;
  • var $start =0;
  • var $end =5;
  • function set_param($table_courante) {
  • #mon constructeur
  • $this->table = $table_courante;
  • $this->base = 'nomdevotrebase';
  • }
  • function recup_listes_tables ( ) {
  • $query = mysql_query("SHOW TABLES;");
  • return $query;
  • }
  • //on veut le nom des champs en fonction de la table.
  • function GetChampsbyTable( ) {
  • $query = mysql_query("SHOW FIELDS FROM $this->table ;");
  • return $query;
  • }
  • //on veut le nombre de champs de la table
  • //
  • function CountValues () {
  • $result = mysql_query ("SELECT COUNT(*) FROM $this->table;");
  • $row = mysql_fetch_row($result);
  • return $row[0];
  • }
  • //on veut les valeurs de la tables
  • //
  • function GetValuesbyTable() {
  • $query = mysql_query("select * FROM $this->table ;");
  • return $query;
  • }
  • //on veut les valeurs de la tables pour la pagination
  • //
  • function GetValuesbyTableLimited($start,$end) {
  • $query = mysql_query("SELECT * FROM $this->table LIMIT $start,$end;");
  • return $query;
  • }
  • //on veut les valeurs de la tables
  • //
  • function GetValuesbyTableWhere( $fieldcond, $valfieldcond ) {
  • $query="SELECT * FROM $this->table WHERE " .$fieldcond . "=" .$valfieldcond;
  • $result = mysql_query($query);
  • if (!$result)
  • $result = -1;
  • return $result;
  • }
  • //on veut une valeur de la table
  • // 1 champ Valeur recherché 2 champ de condittion 3 valeur du champ de condittion
  • function GetValuebyFieldWhere( $fieldToGet ,$fieldcond, $valfieldcond ) {
  • $query="SELECT ".$fieldToGet." FROM $this->table WHERE " .$fieldcond . "=" .$valfieldcond;
  • $result = mysql_query($query);
  • $row = mysql_fetch_row($result);
  • return $row[0];
  • }
  • //on veut les valeurs du enum
  • //
  • function Enumget($field,$table) {
  • $result=mysql_query("SHOW COLUMNS FROM `$table` LIKE '$field'");
  • if(mysql_num_rows($result)>0){
  • $row=mysql_fetch_row($result);
  • $options=explode("','", preg_replace("/(enum|set)\('(.+?)'\)/","\\2", $row[1]));
  • } else {
  • $options=array();
  • }
  • return $options;
  • }
  • function InsertTable($values) {
  • $query = " INSERT INTO $this->table ( ";
  • foreach ($values as $fieldName => $fieldValue){
  • $query .= $fieldName . ',' ;
  • }
  • $query = substr("$query", 0, -1); //J'enleve la derniere virgule
  • $query.= ") VALUES( ";
  • foreach ($values as $fieldName => $fieldValue){
  • $query .= " ' ".$fieldValue . "'" . ',' ;
  • }
  • $query = substr("$query", 0, -1); //J'enleve la derniere virgule
  • $query .= ");" ;
  • //echo $query;
  • $code_retour=mysql_query( $query )
  • or die("impossible d inserer les valeur dans la base , peut etre est elle protegée en ecriture ou indisponible.");
  • return $code_retour;
  • }
  • // Update the contain data
  • //
  • function UpdateTable($values,$idToUpdate,$fieldIdName) {
  • $query = " UPDATE $this->table SET ";
  • foreach ($values as $fieldName => $fieldValue){
  • $query .= $fieldName.'='."'".$fieldValue."'".',' ;
  • }
  • $query = substr("$query", 0, -1); //J'enleve la derniere virgule
  • $query .= " WHERE ". $fieldIdName . " = " . $idToUpdate;
  • //echo $query;
  • $retour =mysql_query($query) or die("L'update a echoué.");
  • return $retour;
  • }
  • // Update only one contain data
  • //
  • function UpdateField($fieldName,$fieldValue,$idToUpdate,$fieldIdName) {
  • $query = " UPDATE $this->table SET ";
  • $query .= $fieldName.'='."'".$fieldValue."'" ;
  • $query .= " WHERE ". $fieldIdName . " = " . $idToUpdate;
  • $retour =mysql_query($query);
  • return $retour;
  • }
  • }
  • ?>
<?php

#Ma classe genere les resultats.

Class genere_resultats {

var  $table;
var  $base;
var  $start =0;
var  $end =5;
function set_param($table_courante) {
#mon constructeur
$this->table = $table_courante;
$this->base = 'nomdevotrebase';
}


function recup_listes_tables (  ) {
$query = mysql_query("SHOW TABLES;");
return $query;
}
//on veut le nom des champs en fonction de la table.
function GetChampsbyTable(  ) {
$query = mysql_query("SHOW FIELDS FROM $this->table  ;");
return $query;
}
//on veut le nombre de champs de la table
//
function CountValues () {
$result = mysql_query ("SELECT COUNT(*) FROM $this->table;");
	$row = mysql_fetch_row($result);
	return $row[0];
}
//on veut les valeurs de la tables
//
function GetValuesbyTable() {
$query = mysql_query("select * FROM $this->table  ;");
return $query;
}
//on veut les valeurs de la tables pour la pagination
//
function GetValuesbyTableLimited($start,$end) {
$query = mysql_query("SELECT * FROM $this->table LIMIT $start,$end;");
return $query;
}
//on veut les valeurs de la tables
//
function GetValuesbyTableWhere( $fieldcond, $valfieldcond ) {
$query="SELECT * FROM $this->table WHERE " .$fieldcond . "=" .$valfieldcond;
$result = mysql_query($query);
	if (!$result)
		$result = -1;
return $result;
}

//on veut une valeur de la table
// 1 champ Valeur recherché 2 champ de condittion 3 valeur du champ de condittion
function GetValuebyFieldWhere( $fieldToGet ,$fieldcond, $valfieldcond ) {
$query="SELECT ".$fieldToGet." FROM $this->table WHERE " .$fieldcond . "=" .$valfieldcond;
$result = mysql_query($query);
$row = mysql_fetch_row($result);
return $row[0];
}

//on veut les valeurs du enum
//
function Enumget($field,$table) {
   $result=mysql_query("SHOW COLUMNS FROM `$table` LIKE '$field'");
   if(mysql_num_rows($result)>0){
       $row=mysql_fetch_row($result);
       $options=explode("','", preg_replace("/(enum|set)\('(.+?)'\)/","\\2", $row[1]));
   } else {
       $options=array();
   }
   return $options;
}
function InsertTable($values) {
$query = " INSERT INTO $this->table  ( ";

foreach ($values as $fieldName => $fieldValue){
  $query .=  $fieldName . ','  ;
  }
  $query = substr("$query", 0, -1); //J'enleve la derniere virgule
  $query.= ") VALUES( ";
foreach ($values as $fieldName => $fieldValue){
  $query .=  " ' ".$fieldValue  . "'" . ',' ;
  }
  $query = substr("$query", 0, -1); //J'enleve la derniere virgule
  $query .= ");" ;
  //echo $query;
  $code_retour=mysql_query( $query )
  or die("impossible d inserer les valeur dans la base , peut etre est elle protegée en ecriture ou indisponible.");
  return $code_retour;
}
// Update the contain data
//
function UpdateTable($values,$idToUpdate,$fieldIdName) {
$query = " UPDATE $this->table SET  ";
foreach ($values as $fieldName => $fieldValue){
  $query .= $fieldName.'='."'".$fieldValue."'".','  ;
  }
  $query = substr("$query", 0, -1); //J'enleve la derniere virgule
  $query .= " WHERE ". $fieldIdName . " = " . $idToUpdate;
  //echo $query;
   $retour =mysql_query($query) or die("L'update a echoué.");
  return $retour;
}
// Update only one contain data
//
function UpdateField($fieldName,$fieldValue,$idToUpdate,$fieldIdName) {
$query = " UPDATE $this->table SET  ";
$query .= $fieldName.'='."'".$fieldValue."'" ;
$query .= " WHERE ". $fieldIdName . " = " . $idToUpdate;
$retour =mysql_query($query);
return $retour;
}


}


?>

 Conclusion

mise a jour

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

07 mars 2007 13:16:19 :
mise a jour

 Sources de la même categorie

CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter
Source avec Zip SIMPLETEMPLATE par thunderhunter
Source avec Zip Source avec une capture VOIR QUI VISITE VOTRE SITE par Dariumis
Source avec Zip CLASS SIMPLE CBASEDONNEE par smag42

Commentaires et avis

Commentaire de malalam le 28/02/2007 19:27:33 administrateur CS

Hello,

je la trouve bizarre ta classe.
Déjà, on a un set_param qui oblige à réinitialiser la connexion avec la table.
Ensuite, la table...en propriété membre ? Pourquoi ? La réponse est dans ton code : parce uq'il ne permet pas de recherche un minimum complexe, avec plusieurs tables, avec des jointures etc.
Tu passes par des SELECT *, ce qui, non seulement est un problème d'optimisation, mais  en plus oblige ton utilisateur à récupérer tous les champs même s'il ne le veut pas.
Un autre truc qui me gène, c'est l'absence de structuration et par là, de vérifications. Si on n'initialise pas la connexion...ta classe essaye quand même d'utiliser sa propriété membre avec une valeur nulle.
Et le plus dangereux : tes écritures dans la base. Les données ne sont pas protégées du tout.

Une classe plus intéressante selon moi aurait été de proposer un langage naturel, plutôt que ça, par exemple.

Commentaire de nuns le 01/03/2007 08:21:45

Hello malalam,

J’aime bien tes commentaires. j'aurais juste une toute petite question, quand tu parle que les données ne sont pas protégées du tout,! tu pourrais juste me dire ce qu'il faut faire pour que les donnée le soit ? les petit contrôle qui pourront garder un code protégé ?

Merci.

Commentaire de malalam le 01/03/2007 09:44:26 administrateur CS

Etant donné que tu ne te bases que sur mysql, il faut faire un mysql_real_escape_string () pour protéger les données.

Commentaire de webdeb le 01/03/2007 11:08:06

J'ajouterai que les bonnes balises PHP c'est <?php et non <?

Commentaire de savon le 01/03/2007 11:47:07

Reponse a Malalam
Effectivement j ai laissé ces 2 variables car ma prochaine version gerera la connexion.
Les select * effectivement c moyen en terme de perfomance mais cela simplifie l'utilisation
car sinon il faudrau passer en parametre le nom de tout les champs et la c relou.
Le BUT de cette classe est de SIMPLIFIER L'access au données et non pas de la compliquer.

Quand a les données ne sont pas protegés ?!??
Les données sont protegés au niveau d un utilisation classique et pas pour le serveur de la NSA
Je te rapelle que le php est executé du coté serveur.
Si tu veut vraiment qq chose de securisé  n utilise pas mysql pour commencer.

C'est une methode simple pour remplcer les requetes classique.



Commentaire de savon le 01/03/2007 11:49:03

reponse a webdeb <?php et <? c'est typiquement la meme chose

Commentaire de coucou747 le 01/03/2007 12:28:15 administrateur CS

savon, ton script n'est pas compatible php6 avec <? et pas portable sur tout les serveurs, de plus, on peut le confondre avec un xml....

Commentaire de nuns le 01/03/2007 13:06:36

une question toute bete c'est quoi la différence entre <?   et  <?php

Commentaire de Rudy3212 le 01/03/2007 13:27:26

<? & <?php veut dire la même chose

mais sur certain serveur suivant la configuration de php le <? ne marche pas. Donc il vaut mieux mettre toujours <?php

Commentaire de webdeb le 01/03/2007 16:02:52

Réponse sur mon site à cette adresse :

http://www.apprendre-php.com/tutoriels/tutoriel-3-pourquoi-il-est-deconseille-d-utiliser-les-balises-courtes-short-tags.html

++

Commentaire de malalam le 01/03/2007 18:12:05 administrateur CS

Savon =>
"Le BUT de cette classe est de SIMPLIFIER L'access au données et non pas de la compliquer."
Et ? Ca complique quoi d'ajouter des paramètres optionnels à ta méthode ? Quitte à utiliser un select * si tu n'as pas de noms de colonnes demandés ?

"Les données sont protegés au niveau d un utilisation classique et pas pour le serveur de la NSA"
Non. Que ce soit pour un serveur de la NSA ou pour un serveur perso. Tu ne protèges pas du tout les données insérées dans les tables.
"Je te rapelle que le php est executé du coté serveur."
Et ? Quel rapport ?
"Si tu veut vraiment qq chose de securisé  n utilise pas mysql pour commencer."
développes donc cette affirmation, ça va en faire rire beaucoup.

"C'est une methode simple pour remplcer les requetes classique."
J'essaye juste de mettre le doigt sur les faiblesses de ton code afin que tu aies des idées pour l'améliorer. Si tu le prends mal, c'est ton problème. Je dis quand même que, en tant que responsable de dév dans une boîte, je ne laisserai jamais mes développeurs utiliser ton code pour les raisons que j'ai citées (entre autres). Libre aux autres utilisateurs de lire mes arguments, les tiens, et de faire leur choix.

Au passage :
"reponse a webdeb <?php et <? c'est typiquement la meme chose"
Encore non. Pas tout à fait.




Commentaire de garfield90 le 01/03/2007 18:52:28

je te trouve inbu de toi (peut etre est ce du au fait que tu fasses une école d'ingé)

# function UpdateTable($values,$idToUpdate,$fieldIdName) {
# $query = " UPDATE $this->table SET ";

$values n'est pas forcement un tableau de type key=>$value (a vérifier bien sur)

# foreach ($values as $fieldName => $fieldValue){
# $query .= $fieldName.'='."'".$fieldValue."'".',' ;
# }
la je ferai, après vérif
$subQuery = array();
foreach ($values as $fieldName => $fieldValue){
if ( is_numeric($fieldvalue) ){
    $subQuery[] = $fieldName.'='.$fieldValue ;
}else{
// faire attention au magic_quote et que la connexion a MySQL est bien faite
    $subQuery[] = $fieldName.'=\''.mysql_real_escape_string($fieldValue).'\'' ;
}

}

# $query = substr("$query", 0, -1); //J'enleve la derniere virgule
inutiles si tu utilises les tableaux, la on ferai :
$query .= implode(',', $subQuery);

# $query .= " WHERE ". $fieldIdName . " = " . $idToUpdate;

tu limites tes updates au cas ou champ = numeric ( tu prends pas en compte les cas de figures ou le champs est une chaine de caracteres) et ni les cas ou tu veux utiliser un autres opérateur


# $retour =mysql_query($query) or die("L'update a echoué.");

évites les or die() => mauvaises gestions des erreurs
donne un code erreur et/ou la signification de l'erreur (ca permet de débugguer plus facilement, et de ne pas arreter le code pour une raison non valable).

# return $retour;
inutile car dans ton code soit ca te retourne true, soit ca n'arrive jamais jusque là, un return true aurais été equivalent

# }

A quoi sert la propriété base ?

au niveau des noms du codage a proprement parlé.
utilisation du francais et de l'anglais dans le meme source, perso ca me choque , pas propre

Peux tu me dire a quoi sert enumGet, pour moi pas a grand chose.
Peux tu me dire a quoi sert GetChampsbyTable, tu pourrais t'en servir pour vérifier que les champs que tu utilises lors de la génération d'une requete existes dans la table.

Tu as plein de méthode qui te retourne une requete, pourquoi ne pas retourne les resultats ?

Pour moi, c'est un travail de 1ere année de BTS/IUT ou un boulot de newbie en dev.

Ferais tu parti des gens qui disent que t'en que ca marche, c'est bon.
pour que ta classe fonctionne sur mon serveur, je dois modifier la config via htaccess ou via la le  VHOST, chose que je m'interdis (porte ouverte a pas mal de connerie).

un simple <?php en place de <? m'éviterai de faire cela.
=> ne me dis pas que c'est a moi de le faire, tu fournis un source a la population, fait qu'il soit utilisable en l'état pour la majorité des utilisateurs (newbie et/ou confirmé)

concernant mysql, tu préfères quoi :
sqlserver, oracle, postgreSQL, SQLite chacun a ces avantages et inconvenients, étaye un peu ton discours.

PS : en php4, le constructeur s'appele comme ta classe sinon en php5 c'est __construct (c'est juste pour info)

Commentaire de savon le 04/03/2007 23:36:54

Je vous trouve un peu gonflés les gars
Venir me critiquer sur des normes qui ne sont pas l essenciel (Noubliez pas que c'est une premiere version mais elle a l'avantage de fonctionner parfaitement).
Maintenant vous voulez la securiser allé y J'ajouterai vos modifs si pertinantes.

Pourquoi laisser le or die? evidament on les vire quand on les met en prod mais lors du dev quand ca marche pas j aime bien savoir pourquoi.


Pour ta gouverne garfield
qui pense etre  le meilleur  un enum c'est une enumeration de valeur situé coté SGBDR cela est utile lors de select par exemple.Les recuperer permet d'avoir un liste d'enum genéré directement ainsi tu ne touche pas a ton code (enfin sache que google est ton ami c'est au programme justement de 1ere année de bts)

"PS : en php4, le constructeur s'appele comme ta classe sinon en php5 c'est __construct (c'est juste pour info)"

Ici c'est du php4 et cela n'est pas indispensable(Ma je le changerai promi ca t a raison).


"je te trouve inbu de toi (peut etre est ce du au fait que tu fasses une école d'ingé)"
Et franchement quand on vois ce que tu developpe moi chui pas jaloux
Pour ta gouvenerne dans ton code "FONCTION RECURSIVE DE RECHERCHE "
/*
case -4 :
$message = 'répertoire inexistant';
break;
case -3 :
$message = '2nd paramètre incorrect';
break;
case -2 :
$message = '1er parametre incorrect';
break;
case -1 :
$message = 'aucune image dans les répertoires parcourus';
break;
default :
*/
Les variables statiques ca existe et ca c Imaintenancable en plus ca te permettrai de rendre ton code plus comprensible et eviter les commentaire superflux.
Et puis si tu veut jouer a  ta oublié un truc je profite de la faille pour faire genre chui plus inteligent
Ton code :
// permet de vérifier si les résultats sont ceux attendus a décommenter pour vérifier
// print_r( $tabFile );
Donc je vois pas ce que tu reproche a mes or die tu les vire pareil ou est le probleme?

<? <?php personne n'est parfait et l exemple n utilise pas le xml MAIS il ne tien qu a vous de le changer

Non ca marche c'est pas le  tout. mais c'est un premiere etape apres tu vois les optimisations oserai tu dire le contraire?

"concernant mysql, tu préfères quoi :
sqlserver, oracle, postgreSQL, SQLite chacun a ces avantages et inconvenients, étaye un peu ton discours."

Chaque SGBDR doit etre adapté a son utilisation c'est tout ils sont tous bien dans leur contexte.

Commentaire de savon le 04/03/2007 23:50:55

Pour faire simple et conclure
Il n'y a pas que la securité
il y a aussi les performances et la clareté et la maintenance future du code.
Certaines choses que vous dites sont justes mais ne sont a mon sens pas adaptés a des projets de pme.

Commentaire de emilia123 le 05/03/2007 08:14:33

bonjour,

pour moi pour faire simple, si on met un code source ici, c'est pour qu'il soit vu et commenté.
Si on n'accepte pas les commentaires, c'est simple on garde son code bien au chaud sur son ordinateur... je suis directe mais je vais commenter.

Beaucoup d'utilisateurs sont, comme moi, débutant(e) et utilise les codes et commentaires pour évoluer.
Si les commentaires sont juste "hé avant de me critiqué tu as vu ce que tu as fait c'est de la ...." ca ne permet pas vraiment d'évoluer.
Il est peut etre vrai que certains commentaires sont sans détour (ex le coté sécurité) et il faut les accepter.
Le coté sécurité est bien la derniere chose à laquelle on pense quand on est débutant (comment penser à sécuriser un truc quand on ne sait meme pas encore ce qu'on fait), et des discutions la dessus sont très interessante. tout rejeter juste en disant en gors "la sécurité je m'en fou, je laisse ca à ceux qui utilise mon code" c'est pas très constructeur comme remarque.
pareil pour l'utilisation des "<?" et "<?php". Ok pour les débutants ca ne fait aucune différence mais si tous ceux qui ont l'expérience du travail disent qu'il faut utiliser "<?php" je pense qu'on peux leur les croire surtout quand c'est argumenté.
Je schématise (débutante inside) mais en gros le sens premier de <? n'est pas de dire que c'est du php, mais de dire qu'il y a un code/language derriere.
<?xml indique qu'il y a un type de code XML apres.
<?php indique qu'il ya un type de code PHP apres.
(on me reprendra si je me trompe)
Laisser la charge aux utilisateurs du script de modifier ce qui ne marche pas est rebutant pour les débutants.
Et enfin sur le "or die", j'aurais une question... qu'est ce qui se passe lors d'une erreur sur l'insertion?
en période de DEV ca s'arrete et en période de Prod ca continu et rien n'est indiqué à la fonction appelante qu'il y a eu une erreur.
l'idéal serait de renvoyer un code d'erreur comme cela la fonction appelante peut vérifier si ton retour ==='false' par exemple et traiter le cas d'erreur d'insertion, mettre son propre message etc, ce qui est impossible avec un "die" mis en commentaire.

Voila j'espere que mes remarques ne t'ont pas froissé, sinon je m'en excuse et je ne recommencerais plus,promis.

A bientot

Em


Commentaire de garfield90 le 05/03/2007 09:45:15

Pourquoi laisser le or die? evidament on les vire quand on les met en prod mais lors du dev quand ca marche pas j aime bien savoir pourquoi.

-> Pourquoi ne pas le faire directement, ca peut etre vite oublié d'enlever le "or die()"

Pour ta gouverne garfield
qui pense etre  le meilleur  
--> J'ai jamais dis ca

un enum c'est une enumeration de valeur situé coté SGBDR cela est utile lors de select par exemple.Les recuperer permet d'avoir un liste d'enum genéré directement ainsi tu ne touche pas a ton code (enfin sache que google est ton ami c'est au programme justement de 1ere année de bts)
-> je sais ce qu'est enum, je me demandais juste l'utilité d'une fonction dont tu ne montres pas a quoi elle sert

-> concernent mon code, il y a un fil de discussion, il sert a ca. donc je répondrai au question/attaque sur mon code et non ici

Commentaire de garfield90 le 05/03/2007 11:00:34

Pour faire simple et conclure
Il n'y a pas que la securité
-> c'est un des truc les plus important voir le plus

il y a aussi les performances et la clareté et la maintenance future du code.
-> tout a fait OK

Certaines choses que vous dites sont justes mais ne sont a mon sens pas adaptés a des projets de pme.
-> je n'utiliserai pas ton code en PME, ni meme personellement, ton code est incomplet pour la gestion de requete complexe

Commentaire de coucou747 le 05/03/2007 11:48:37 administrateur CS

moi je laisse le or die... si t'as bien debuge alors ils ne se verront pas, et si t'as pas bien programme, supprimer un or die en cas d'erreur provoque souvent une farandole de notices et peut inserrer des lignes foireuses dans la base de donnee

Commentaire de malalam le 05/03/2007 18:49:14 administrateur CS

Savon => je comptais commenter encore un peu, mais ça n'en vaut pas la peine. Le message d'Emilia est suffisemment clair je pense.
Quand je critique/commente/encense un code, c'est pour son auteur, et pour les éventuels lecteurs. Pour apporter ma pierre à l'édifice, dire ce que je pense, là où je vois des améliorations, là où je vois de grosses erreurs.
Si l'auteur prend la mouche après ça, très sincèrement, tant pis pour lui. Ce n'est pas en se vexant quand on nous critique, et en pensant, au fond, même si on ne se l'avoue pas : "mais qui c'est ce blaireau qui croit être meilleur que moi", que l'on progresse.
Mais tant pis.
Par contre, relis bien le message d'Emilia, car elle y dit quelque chose d'essentiel à comprendre quand on pense/veut laisser une participation à la communauté PHP. On le fait pour les autres, pas pour se faire mousser...on le fait pour aider, faciliter le travail des autres...donc, on le fait bien.
Ton code ne marche pas du tout sur mon serveur, pour info. Du tout.
Ce n'est pas ce que j'appelle ..."(Noubliez pas que c'est une premiere version mais elle a l'avantage de fonctionner parfaitement)."... fonctionner parfaitement.
Un simple <?php, déjà, pour les autres, pas pour toi, aurait permis à cette partie du code d'être portable sur tous les serveurs. Rappel : <?php fonctionne sur TOUS les serveur. <? non.
C'est con, mais juste faire ça, faire attention à ces détails, cela montre que le codeur est consciencieux et pense réellement aux utilisateurs.
Pareil pour la sécurisation...ou l'optimisation (select * à tout va), etc...
Et si on n'y parvient pas du 1er coup, où qu'on a pas pensé à tout...au moins, on écoute ce que ceux qui ont pris la peine de ragerder ton code, de le lire, le décrypter, le tester...ont à dire.

Bref.

Commentaire de jean84 le 06/03/2007 09:30:06

Hello

Je vois qu'il y a une bete d'ambiance ici bas :p Bah allez je m'y jette (pas par plaisir mais y a des trucs qui me font bondir)

"Les select * effectivement c moyen en terme de perfomance mais cela simplifie l'utilisation
car sinon il faudrau passer en parametre le nom de tout les champs et la c relou. Le BUT de cette classe est de SIMPLIFIER L'access au données et non pas de la compliquer"

Le principe d'une classe (entre autre) et de proposer une interface (api ?) de plus haut niveau en encapsulant des fonctions fournies par le language ou d'autres classes (libs) (je passe le cote abstraction). C'est au developpeur de se taper le sale boulot pour qu'a la fin cela ne le soit pas pour le developpeur desireux d'utiliser ta classe (c'est mon point de vue evidement). Si tu proposes une classe de simplification, autant le faire jusqu'au bout... m'enfin je peut comprendre que chacun ai ses limites (ou sa flemme ^^)....
Le titre de ta source me renforce dans cette opinion quand je lis "CLASSE QUI EXECUTE LES REQUETES NOOBIES ET EXPERTS SOUHAITANT CLARIFIER LE CODE". C'est une requete d'expert de faire un select * ? Wahou !! Je suis un dingue du sql alors, je fais meme des unions dans mes requetes :p

---

"reponse a webdeb <?php et <? c'est typiquement la meme chose"

Bah pourtant l'article de webdeb (tres bien fait au passage) est suffisament court et explicite pour faire comprendre le bien fonde de sa remarque. Si toutes les personnes a qui l'ont a fait la remarque (et y en un paquet, rien que sur l'actu en ce moment) comprennent le pourquoi du comment et aux vues de arguments avances (portabilite entre autre), je ne vois pas en quoi l'on peut se permettre ce genre de remarque, surtout lorsque l'on lit  "Elle m'a fait gagné enormement de temps aussi je la soumet et espere que des gens l'utiliseron et l amelorement aussi". Pour que les gens l'utilisent, faudrait deja qu'elle fonctionne chez eux ..... => Malalam : "Ton code ne marche pas du tout sur mon serveur, pour info. Du tout."

---

"Les données sont protegés au niveau d un utilisation classique et pas pour le serveur de la NSA
Je te rapelle que le php est executé du coté serveur."

Quel est le lien ? Elle est ou ta protection contre les sql injections ? En quoi le fait que php soit execute cote serveur apporte une securite au niveau des requetes sql ? Pour la NSA, bah j'ai pas travailler chez eux, sa c'est sur, mais il n'empeche que la securite, c'est l'affaire de tous. Faut pas se croire a l'abri d'un petit malin, c'est pas parce qu'on est + de 6 milliards sur terre que tu vas te fondre dans la masse ^^ Si ton site est frequente, t'auras toujours le risque que sa arrive, d'autant plus si tu tiens ce genre de discours ....
Un proverbe que j'affectionne dit : "La ou un developpeur se dit que personne n'ira chercher, quelqu'un quelque part dans le monde cherchera et trouvera"

---

"[...](Noubliez pas que c'est une premiere version mais elle a l'avantage de fonctionner parfaitement)."

Premiere version ?

"Cette classe permet de faire des requete sans les ecrire .
Je l'ai crée en 4 émé année a l'esgi.
Depuis je l'utilise et l'ameliore de temps a autres."

Y a pas eu de mises a jour depuis ? tiens c'est pas ce que je lis...

"[...]des normes qui ne sont pas l essenciel[...]"

Mouarf ! Entierement d'accord ! D'ailleurs maintenant, toutes les normes qui me gonflent, je vais les prendre pour des "normes pas essentielles", sa va me simplifier la vie je pense....

"Je vous trouve un peu gonflés les gars[...]"
Il est vrai qu'il peut regner une certaine mauvaise foi sur CS de temps en temps mais la, pas de chance c'est pas le cas ...

---

"Pour faire simple et conclure
Il n'y a pas que la securité
il y a aussi les performances et la clareté et la maintenance future du code.
Certaines choses que vous dites sont justes mais ne sont a mon sens pas adaptés a des projets de pme."

C'est un debat, certes. Tout de meme, l'argument qui ne m'aurait pas trop fait reagir et avec lequel j'aurais sans doute ete plus ou moins d'accord, sa aurait ete de dire "Certaines choses que vous dites sont justes mais ne sont a mon sens pas adaptés a des projets personnels". A partir du moment ou tu rentre dans le domaine proffessionnel/entreprise, je pense quil faut faire un effort (et pas seulement) de ce cote la (toujours un point de vue personnel mais je ne pense pas etre le seul de cet avis), surtout sur des failles aussi banalisees que celles la (suffit de voir le nombre de tutos dispo sur google expliquant comment exploiter des requetes sql). Un simple mysql_real_escape_string() comme l'a judicieusement propose Malalam suffirait deja a avoir un bon niveau de protection. Notre cher Kankrelune n'etant pas venu (pour le moment j'imagine) je ne peut que te donner son eternel conseil : http://www.phpsecure.info/v2/zone/pArticle ;-)

---

"Si tu veut vraiment qq chose de securisé  n utilise pas mysql pour commencer."
développes donc cette affirmation, ça va en faire rire beaucoup.

:-) :-) :-) :-)

---

"pour moi pour faire simple, si on met un code source ici, c'est pour qu'il soit vu et commenté.
Si on n'accepte pas les commentaires, c'est simple on garde son code bien au chaud sur son ordinateur...  [...] Il est peut etre vrai que certains commentaires sont sans détour (ex le coté sécurité) et il faut les accepter. Le coté sécurité est bien la derniere chose à laquelle on pense quand on est débutant (comment penser à sécuriser un truc quand on ne sait meme pas encore ce qu'on fait), et des discutions la dessus sont très interessante. tout rejeter juste en disant en gors "la sécurité je m'en fou, je laisse ca à ceux qui utilise mon code" c'est pas très constructeur comme remarque."

C'est rafraichissant comme remarque et cela viens d'une personne qui fait preuve d'humilite, a prendre en exemple.

"<?xml indique qu'il y a un type de code XML apres.
<?php indique qu'il ya un type de code PHP apres.
(on me reprendra si je me trompe)"

Non non, c'est bien sa ;-)
Encore une fois => http://www.apprendre-php.com/tutoriels/tutoriel-3-pourquoi-il-est-deconseille-d-utiliser-les-balises-courtes-short-tags.html

---

"moi je laisse le or die... si t'as bien debuge alors ils ne se verront pas, et si t'as pas bien programme, supprimer un or die en cas d'erreur provoque souvent une farandole de notices et peut inserrer des lignes foireuses dans la base de donnee"

Je prefere gere les retours de mes fonctions et demarre mes script avec un error_reporting(0) mais je crois que c'est plus une question de gout.

Bah allez, j'arrete la. J'espere juste que cela t'aura permis de comprendre comment fonctionne CS. Il y a beau avoir plus de 800 000 membres (bientot le million hehe), il a des utilisateurs chevrones qui apportent leurs temps et leurs contribution a la communaute, qui permettent que cela ne soit pas un espace trop anonyme (tu remarqueras qu'il y a souvent les memes membres qui repondent sur les sources et le forum) c'est une chance d'avoir autant de talent pour s'aider a progresser (meme si on est en ecole d'inge, tu serais surpris de voir le nombre de membres faisant parties de ces ecoles et venir demander de l'aide), ne le perd jamais de vue, surtout lorsque tu t'appretes a faire une remarque desobligeante a l'un d'entre eux.


J'en ai peut etre trop rajoute ou fait trop de zel, desole et merci a ceux qui auront la patience de lire mon post :-)

@++

Commentaire de savon le 07/03/2007 13:10:07

Reponse a Hello
Je ne vais pas repondre a tout car trop long mais simplement
Ce que tu souleve sur les select * j'y ai pensé avant de coder cette classe .
Selement c'est la seule facon d'eviter a l utilisateur de rentrer tout les champs et je ne pense pas ca serait utilisable en parametre tout les champs (dans ce cas autant faire une requete sql).
C'est pour ca que j ai voulu faire simple.

Utliserai tu une fonction du genre?
$obj->getvalues("champ1","champ2","champn");
en imaginant que il puisse en avoir une trentaine par ex?
Si Tu pense ca je veut bien coder cette fonction mais je ne pense pas que les gens l utiliseron.

Commentaire de jean84 le 07/03/2007 19:06:24

Pourquoi ne pas faire une fonction a qui l'on donnerait les noms des colones que l'on veut recuperer ?
Pour simplifier les choses, tu pourrais par exemple utiliser la fonction func_get_args() => http://www.php.net/manual/fr/function.func-get-args.php qui te permettrait d'obtenir un nombre variable d'arguments a ta fonction sans passer par un tableau (le tableau te sera renvoye par cette fonction). Les utilisateurs pourraient donc passer en param les noms des colones qui'ils desirent et tu n'aurais plus qu'a les rajouter a ta requete...

Commentaire de savon le 09/03/2007 00:53:20

bah on va essayer on verra bien si ca sert vraiment ou pas

Commentaire de jean84 le 10/03/2007 01:21:51

C'est le principe meme ... je vois pas l'interet de classer ce code dans la partie initie en disant que l'on peut construire facilement et rapidement des requetes simples & "experts" sans pouvoir au moins selectionner les colonnes que l'on desire ...

Apres tu fais ce que tu veux mais c'est clair que ta classe, je m'en servirai pas (et je la conseillerais pas non plus)

Commentaire de savon le 12/03/2007 19:00:35

L'a tu selement testé...

Commentaire de garfield90 le 12/03/2007 20:45:10

C'est pas parcequ'elle marche (peut etre, pas testée) qu'elle convient à tous le monde.

Je veux faire une requete du type :
UPDATE Table1 SET champ1='toto' WHERE champ1='titi' ; ou
UPDATE Table1 SET champ1='toto', champ2='tutu' WHERE champ1='titi' ; etc. au niveau des updates.
De plus, tu fais deux méthodes similaires : UpdateTable et UpdateField
UpdateField($fieldName,$fieldValue,$idToUpdate,$fieldIdName) = UpdateTable(array($fieldName=>$fieldValue),$idToUpdate,$fieldIdName);
=>pour moi, c'est du à une mauvaise analyse

On ne peut pas faire une requete de delete avec ta classe, c'est pourtant une des bases lorsque l'on travaille avec des BDD, alors que l'on peut faire un EnumGet

De meme, on peut pas classer l'ordre des résultats de la requete.

Je ne souleverai pas le probleme des jointures, des sous-requetes et toutes requetes complexe qui évitent de faire des accès multiples a la BDD (ah si, je viens de le faire ;))

Avec ta classe, je peux pas ou alors je dois modifier tes méthodes, pour moi elle me simplifie pas les choses.

Aucune vérification n'est faite sur le type des données et/ou le contenu, i.e. tu fais confiance aux données entrée pour tes requetes (1ere chose à ne pas faire, en particulier si ca vient de données provenant de GET et/ou POST, voir meme de données calculées) => SECURITE, SECURITE, SECURITE

Retravaille ta classe en prenant en compte les observations, elles sont en générales pertinente.Car pour toutes ces raisons, ta classe ne peut pas être utilisée dans le monde professionnel et meme amateur, elle a trop de lacune qui ne sont pas négligeable.

Question : Pourquoi les développeur de PHP n'ont pas coder comme toi au niveau du noyau
Réponse  : La possibilité de création de requetes est quasi infinie alors que ta classe limite énormement les possiblité de MySQL.

Tu aurais au moins pu faire l'effort de la rendre a peut pres praticable pour les différents moteurs de BDD, je t'aurai moins paru agressif.

Je suis fort aise, que ta classe te convienne mais elle ne convient pas aux autres qui argumentent eux leur réflexion, j'aimerai bien que tu dises pourquoi tu fais comme ca et pas autrement.

Je pense a peu près avoir tout dit, en ce qui me concerne, sur cette classe.

J'attends une argumentation concernant ta classe et des réponses concernant les éléments soulevés.

PS : tu aurais du nommé ta classe :
Classe qui exécute des requetes NOOBIES et Simplistes ...

PPS : concernant mon code, vu que tu dedaignes pas poster sur celui-ci.
Le fichier que tu démontes est celui de test/exemple, il peut etre supprimable, donc ton commentaire est pour moi inutile. La suite http://www.phpcs.com/codes/FONCTION-RECURSIVE-RECHERCHE-FICHIER-SELON-EXTENSION-OU-GROUPE_32786.aspx

Commentaire de coucou747 le 12/03/2007 21:20:14 administrateur CS

perso, j'aime bien la methode d'acces a une BDD en perl...

$connexion->prepare('SELECT champs FROM table WHERE col=?');
$connexion->execute($valeur) or die($connexion->error);

ensuite, le ? est remplace par la valeur... On peut remplacer ? par ?i pour verifier que c'est un integer, ?f pour un float, ?b pour un blob ect...

et pour les requettes de 50 lignes, ca peut se faire...

et la, pour les procedures stoquees, ca marche comment ?

Commentaire de malalam le 13/03/2007 11:41:48 administrateur CS

Coucou => bah, à ce compte-là, cette manière bien plus élégante d'attaquer une base de données existe
en PHP 5. Ca s'appelle PDO. Mais ça n'a pas grand rapport avec ce que voulait faire Savon, au final.
Même si je suis d'accord, c'est bien plus élégant. Et puissant.

Commentaire de savon le 13/03/2007 14:13:40

Reponse a Garfeild
tu fais deux méthodes similaires : UpdateTable et UpdateField
UpdateField($fieldName,$fieldValue,$idToUpdate,$fieldIdName) = UpdateTable(array($fieldName=>$fieldValue),$idToUpdate,$fieldIdName);
=>pour moi, c'est du à une mauvaise analyse

-> Pas du tout .
Les 2 fonction sont tres differentes
L'une (upfield) ne met a jour que 1 seul champ
L'autre met a jour plusieurs valeur par l intermediare du $_POST
Ainsi tu passe juste le $_POST en parametre et ca va executer ta requete (la seule condittion est que les nom des champs formulaire soit les meme que ceux en BDD).
Ce qui t evite de recuperer tes valeurs. et tu passe en 2 eme arugment ton critere.
C'etait marqué pourtant dans l intro ....

SECURITE, SECURITE, SECURITE
-> ca va venir prochainement .

Autre chose garfield un peu de bon sens il est rare que les gens laissent des post pour dire que tout va bien.

Commentaire de savon le 13/03/2007 14:16:07

reponse a coucou747  
Moi aussi j adore le perl.
Mais quel dommage que on ne puisse faire d inclusions.
Les switch aussi meme si on peu en installer.
Mais c'est un langage tres utile pour linux.

Commentaire de savon le 13/03/2007 14:18:44

Garfield again
/*
Tu aurais au moins pu faire l'effort de la rendre a peut pres praticable pour les différents moteurs de BDD, je t'aurai moins paru agressif.
*/
Il faut patientér deja que cette classe arrive a maturité c'est encore une version 1.0
Mais c'est une bonne idée

Commentaire de garfield90 le 13/03/2007 14:41:12

Les 2 fonction sont tres differentes
-> pas d'accord avec toi, je te le démontre en dessous. Exemple similaire a ce que tu as fait code absent;

calculSomme(1,2,3,4) donne 10
calculSomme(1,2) donne 3
calculSomme2Chiffres(1,2) donne 3
Tu vois bien ici, que calculSomme peut etre équivalent a calculSomme2Chiffres dans le cas précis ou il y a 2 chiffres a additionner. Je ne coderai pas les 2 fonctions, je pense que je ne coderai que la premiere. Dans ta classe, les 2 fonctions sont identiques dans le cas où il n'y a qu'un champ a mettre a jour, donc pour moi ta fonction updateField est non nécessaire.


L'une (upfield) ne met a jour que 1 seul champ
-> je sais lire

L'autre met a jour plusieurs valeur par l intermediare du $_POST
-> tu peux passer n'importe quel tableau, donc un tableau associatif contenant qu'une seule valeur, ce qui serait equivalent a ta fonction qui update qu'un champ, sinon tu aurais mis $_POST directement au niveau de ta classe, et la tu te ferais incendié pour ça...
Ainsi tu passe juste le $_POST en parametre et ca va executer ta requete (la seule condittion est que les nom des champs formulaire soit les meme que ceux en BDD).
-> ce que tu devrais vérifier avec ta fonction "GetChampsbyTable", cependant comme dit ci-dessus, $_POST n'est pas la seule manière possible d'utiliser cette fonction.

Ce qui t evite de recuperer tes valeurs. et tu passe en 2 eme arugment ton critere.
C'etait marqué pourtant dans l intro
--> Je te montre simplement que ta fonction updateTable peut etre équivalente à updateField, si et seulement si elle est correctement utilisée (donc updateField me semble inutile, mais ca reste que mon avis)

J'espere que tu comprendras mon raisonnement ainsi que mon explication, et la raison pour laquelle je dis que tu as fait une mauvaise analyse.

Après fait ce que tu veux de ce que l'on te dit, mais sache que je ne cherche qu'a te faire par de mon opinion pour faire progresser ta classe.

Commentaire de coucou747 le 13/03/2007 18:17:43 administrateur CS

"Mais quel dommage que on ne puisse faire d inclusions."=> tu sors ca d'ou ? les requettes en perl sont libres avec DBI (je crois)

Commentaire de savon le 13/03/2007 19:12:55

include patate je parle pas des requete

Commentaire de coucou747 le 14/03/2007 00:00:59 administrateur CS

euh... use... enfin bon, on n'est pas sur un forum qui traite du perl...

Commentaire de savon le 16/03/2007 10:32:31

lol bon bah c toi qui a commencé a en parlé hein.

Commentaire de savon le 19/03/2007 14:04:47

Un autre exemplaire des sources se trouve a cet url

http://plutonserveur.homelinux.com/sources/

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,295 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales