Précédent   Forum des professionnels en informatique > PHP > Langage > Contribuez
Contribuez Proposez vos articles, cours, tutoriels, FAQ, sources, etc. pour PHP
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 15/05/2007, 18h37   #1
Membre confirmé
 
Inscription : mai 2006
Messages : 196
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 196
Points : 278
Points : 278
Par défaut Objet SQLManager, celui qui change votre vie !

J'ai conçu le début d'un petit objet très utile pour manipuler les base de données en SQL, il permet de générer des requêtes, renvoi les résultats et les paramètres sous forme de tableaux permettent une exportation / importation en variables de session très simple pour enregistrer les modifications. Dites moi ce que vous en pensez

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
<?php
/*********************************************************************************************************************************************************
 
Nom du fichier : SQLManager.php
Auteur : Flauder Vincent
Version : 1.0
Description :Fichier de la classe SQLManager permettant de crée un objet pour être en relation avec une base de données MySQL. Possède diverses fonctions facilitant la programmation SQL et la gestion de requêtes. 
 
*********************************************************************************************************************************************************/
 
// Classe SQLManager
class SQLManager
{
	private $user; //Variable stockant le nom d'utilisateur pour l'acces a la base de données.
	private $password; //Variable stockant le mot de passe pour l'acces a la base de données.
	private $server; //Variable stockant le nom du serveur auquel se connecter.
	private $db; //Identifiant de la BDD
	private $dbname; //Nom de la BDD à laquelle se connecter.	
 
/*********************************************************************************************************************************************************
METHODES PUBLIQUES
*********************************************************************************************************************************************************/
 
	//Constructeur de la classe avec 4 parametre ( nom du serveur, nom d'utilisateur, mot de passe, base de données)
	public function __construct( $serverarg, $userarg, $passwordarg, $dbnamearg )
	{
		$this->user = $userarg;
		$this->password = $passwordarg;
		$this->server = $serverarg;		
		$this->dbname = $dbnamearg;
 
		$this->connect( $this->dbname );
	}
 
	//Destructeur qui lors de son appel fermera la conection à la BDD.
	public function __destruct()
	{
		@mysql_close( $this->db );
	}
 
	//Méthode permettant d'interpreter une requete et de renvoyer un tableau associatif avec les résultats.
	public function query( $query )
	{
		$result = mysql_query( $query, $this->db );
 
		if ( !isset( $result ) )
		{
			die('Probleme Interne, contactez le webmaster');
		}
 
		$i=0;
		while ( $row = mysql_fetch_array( $result ) )
		{
			$tabend[$i++] = $row;
		}
 
		return $tabend;	
	}	
 
	/* Méthode pour effectuer une requête SELECT , prenant 7 arguments :
	(1)column : champs à extraire.
	(2)table : table sélectionnée.
	(3)condition : 0 ou 1 pour inclure une clause WHERE dans la requête.
	(4) champ à comparer.
	(5) opérateur de comparaison.
	(6) donnée à comparer.
	(7) options pour ajouter une instruction en fin de requête.
	Exemple : selectQuery( 'Login', 'user', 1, 'Password', '=', $_POST['password'], '' ).
	Exemple : selectQuery('Name', 'user', 0, '', '', '', 'ORDER BY ASC') Selectionne tous les noms et les range dans l'ordre croissant.*/
	public function selectQuery( $colum, $table, $condition, $colomnToCompare, $operator, $comparator, $option)
	{
		$querymaker = 'SELECT '.$colum.' FROM '.$table.' ';
 
		if ( $condition != 0 )
		{
			$querymaker .= 'WHERE '.$columnToCompare.' '.$operator.' \''.$comparator.'\' ';
		}
		//Rajout de l'option
		$querymaker .= $option;
 
		return ( $this->query( $querymaker, $this->db ) );
	}
 
	/* Méthode pour insérer une nouvelle ligne dans la base de données, prend 3 arguments :
	(1)table : table ou l'on insére la ligne.
	(2)tabcol : tableau dans lequel les noms des champs sont rangés.
	(3)tabval : tableau dans lequel les données des champs sont rangés.
	Tabcol et Tabval doivent posséder le même index de rangement pour les données associées aux champs.
	Exemple : 
	$fields[0] = 'Login';
	$values[0] = 'loginTest';
	$fields[1] = 'Password';
	$values[1] = $_POST['password'];
	$sql->insertQuery( 'user', $fields, $values ); 
	Insérera un nouvel utilisateur dans la base de données.*/	
	public function insertQuery( $table, $tabcol, $tabval )
	{
                if ( count($tabcol) != count($tabval) )
		{
			die('Probleme d\'insertion, contactez le webmaster.');
		}
		$queryinsert = 'INSERT INTO `'.$table.'`  ( ';
		$queryinsert .= $this->chainmaker( $tabcol );
		$queryinsert .= ' ) VALUES ( ';
		$queryinsert .= $this->chainmaker( $tabval );
		$queryinsert .= ' )';
		echo $queryinsert;
		if (  !( mysql_query( $queryinsert, $this->db ) ) )
		{
			die('Probleme interne insert, veuillez contactez le webmaster.');
		}	
	}
 
	/* Méthode permettant de mettre à jour une ligne dans une table, prend 6 arguments :
	(1)table : table sélectionnée.
	(2)fields : tableau contenant les nom des champs.
	(3)values : tableau respectif à (2)fields pour les données des champs.
	(4)colomnToCompare : champs ou l'on cherche à modifier la ligne.
	(5)operator : opérateur de comparaison.
	(6)comparator : donnée à comparer pour la recherche.
	Exemple :
	$fields[0] = 'Password';
	$values[0] = $_POST['password'];
	$sql->updateQuery( 'user', $fields, $values, 'Login', '=', 'loginTest');
	Ceci change le mot de passe de l'utilisateur qui à le Login "loginTest" */
	public function updateQuery( $table, $fields, $values, $colomnToCompare, $operator, $comparator )
	{
		if ( count($fields) != count($values) )
		{
			die('Probleme d\'insertion, contactez le webmaster.');
		}
 
		$queryupdate = 'UPDATE `'.$table.'` SET ';
 
		for ( $i=0; $i<count($fields); $i++ )
		{
			if ( $i==(count($fields)-1) )
			{
				$queryupdate .= '`'.$fields[$i].'`=\''.$values[$i].'\''; //Fin de chaîne...
			}
			else
			{
				$queryupdate .= '`'.$fields[$i].'`=\''.$values[$i].'\',';//...sinon on rajoute une virgule.
			}
		}
 
		$queryupdate .= ' WHERE `'.$colomnToCompare.'`'.$operator.'\''.$comparator.'\'';
 
		if ( !( mysql_query( $queryupdate, $this->db ) ) )
		{
			die('Problème interne, veuillez contactez le webmaster.');
		}
	}
 
	/* Méthode pour changer la base de données sur laquelle on doit travailler. */
	public function changeDB( $newdb )
	{
		$this->dbname = $newdb;
		$this->connect( $this->dbname );
	}
 
/*******************************************************************************************************************************************************************
METHODES PRIVEE
******************************************************************************************************************************************************************/
 
	//Méthode pour se connecter au serveur ainsi qu'a la BDD dont le nom est passé en paramètre.
	private function connect( $dbnamearg )
	{
		// Connection
		if ( !( $this->db = mysql_connect( $this->server, $this->user, $this->password ) ) )
		{
			die('Impossible de se connecter au serveur.');
		}
		else
		{
			// Selection de la BDD.
			if ( !mysql_select_db( $this->dbname, $this->db ) )
			{
				die('Impossible de se connecter à la base de données.');
			}			
		}
	}
 
	// Méthode servant à crée une chaîne de caractere à partir d'un tableau de valeurs, renvoi la chaîne ainsi crée
	private function chainmaker( $tabval )
	{
		$chain = ''; //Initialisation
 
		for ( $i=0; $i < count($tabval); $i++ )
		{
			$chain .= '\''.$tabval[$i].'\''; //On rajoute les guillemets nécessaires dans une requête SQL.
 
			if ( $i < ( count($tabval) - 1 ) ) //Si c'est la dernière valeur à ajoutée, on ne met pas de virgule.
			{
				$chain .= ', ';
			}
		}
 
		return $chain;
	}
} //Fin de la classe SQLManager
?>
Exemple avec 2 fonctions :
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
 
//Méthode permettant d'initialiser les variables de session .
	public function setSessionData($login)
	{
		unset($_SESSION['user']);
		unset($_SESSION['userhero']);
 
		$buff = $this->sqlmanager->simple_query( '*', 'user',1,'Login','=',$login, '' );
		$_SESSION['user'] = $buff[0];
		unset($buff);
 
		$buff = $this->sqlmanager->simple_query( '*', 'userhero',1,'Id','=',$_SESSION['user']['Id'], '' );
		$_SESSION['userhero'] = $buff[0];
		unset($buff);	
	}
 
	//Méthode permettant de mettre à jour les données du joueurs sur la base de données.
	public function saveProcessUser()
	{
		$_SESSION['user']['LastIP'] = $_SERVER['REMOTE_ADDR'];		
		$_SESSION['user']['GeneralTS'] = date( 'U' );
 
		$fieldbuff = array_keys($_SESSION['user']);
		$valuebuff = array_values($_SESSION['user']);
 
		//On réorganiser les tableaux car pour une étiquette litérale il existe une numérique ( le nombre de champs est doubler par les fonctions ARRAY.
		$j=0;
		for ( $i=1; $i<count($fieldbuff); $i=$i+2 )
		{
			$fields[$j] = $fieldbuff[$i];
			$values[$j++] = $valuebuff[$i];
		}		
 
		$this->sqlmanager->update( 'user', $fields, $values, 'Id','=', $_SESSION['user']['Id'] );		
	}
A savoir que les noms (étiquettes) des tableaux dans la variable de session $_SESSION['user'] sont les même que les noms des champs dans la base de données tel que : $_SESSION['user'][NOM_DU_CHAMPS].
meliandah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2007, 19h49   #2
Expert Confirmé
 
Avatar de Sub0
 
Homme
Inscription : décembre 2002
Messages : 3 468
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39

Informations forums :
Inscription : décembre 2002
Messages : 3 468
Points : 3 115
Points : 3 115
Envoyer un message via MSN à Sub0 Envoyer un message via Skype™ à Sub0
C'est un peu ce que je recherche justement, une classe pour l'accès aux bases de données. J'avais posté ce sujet à ce propos... Il pourrait peut-être t'intéresser...
Sub0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2007, 12h37   #3
Membre confirmé
 
Inscription : mai 2006
Messages : 196
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 196
Points : 278
Points : 278
Ha vi PDO :o je connaissai pas mais ce que je voulais surtout faire c'est une classe qui génére les requêtes elle même (PDO le fait mais sa à l'air plus complexe d'utilisation) simplement et avec l'utilisation des tableaux associatif cela permet d'exporter / importer simplement avec les variables de session pour la programmation. Pour changer de SGBD il faudrai refaire un objet identique (du moins les fonctions et paramètres) mais avec le code du SGBD pour les requêtes ce qui permetterai de ne rien modifier au sein du site. Dommage que PHP ne supporte encore pas la surcharge de fonction
meliandah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2007, 21h41   #4
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Salut

Pour rappel, ce que tu souhaites faire porte un nom : c'est de l'ORM. Je te recommande de la lecture puisque le sujet t'intéresse, cela t'évitera de réinventer la roue Et j'en oublie sans doute.
N'hésite pas à consulter le site (cf. ma signature) pour plus d'infos
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2007, 21h42   #5
Rédacteur
 
Avatar de doctorrock
 
Homme Julien Pauli
Architecte de système d'information
Inscription : mai 2006
Messages : 597
Détails du profil
Informations personnelles :
Nom : Homme Julien Pauli
Âge : 29
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Architecte de système d'information
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : mai 2006
Messages : 597
Points : 5 015
Points : 5 015
Le composant Zend_Db fait tout ca très bien.
La surcharge de méthode est supportée depuis PHP4 ( et est largement suportée et utilisée dans le modèle objet de PHP5, qui permet de monter des structures d'abstraction de haut niveau).
__________________
.: Expert contributeur certifié PHP/ZF :.
Mes articles - Twitter - GitHub
doctorrock est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2007, 18h55   #6
Membre confirmé
 
Inscription : mai 2006
Messages : 196
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 196
Points : 278
Points : 278
Pour la surcharge, si je met ceci dans une classe :
Code :
1
2
3
4
5
6
7
8
public function test( $a )
{
	echo '1';
}
public function test( $a, $b )
{
	echo '2':
}
Cela me donne :

Fatal error: Cannot redeclare FormMaker::test().

Pour moi la surcharge ne fonctionne pas la oO, ou tu parle d'autre chose ? Il me manque peut être un module ?
meliandah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2007, 19h24   #7
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
doctorrock te parlait de surcharge par héritage
PHP ne permet effectivement pas de surcharger comme tu le proposes, mais est-ce bien utile ? D'habitude cela oblige à dupliquer le code source, alors qu'avec des paramètres par défaut on obtient des résultats tout à fait honorables et bien souvent plus cohérents. C'est une autre manière de voir le design applicatif.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2007, 21h52   #8
Membre confirmé
 
Inscription : mai 2006
Messages : 196
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 196
Points : 278
Points : 278
Ha la redéfinition des fonctions donc ^^ vi mais bon je n'ai pas vraiment besoin de faire de classe abstraite dans mon projet, cela dit pour mon autre projet de jeu sa risque d'être utile . Mais cette surcharge que je voyai aurait été utile pour écrire des fonctions différentes selon le nombre de paramètres, car on est par exemple obligé de spécifier une chaîne vide si l'on ajoute pas d'option dans les fonctions de ma classe.
meliandah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2007, 22h21   #9
Expert Confirmé
 
Avatar de Sub0
 
Homme
Inscription : décembre 2002
Messages : 3 468
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39

Informations forums :
Inscription : décembre 2002
Messages : 3 468
Points : 3 115
Points : 3 115
Envoyer un message via MSN à Sub0 Envoyer un message via Skype™ à Sub0
Il suffirait de spécifier une valeur par défaut, non ?
Code :
1
2
 
public function test( $a='', $b='' )
Sub0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2007, 22h26   #10
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
En plus de ce que propose Sub0, on peut passer plus de paramètres à une fonction (ou méthode) qu'elle n'en prévoit (hormis les fonctions internes qui sont généralement contrôlées à ce niveau). Pour les exploiter, on peut recourir aux fonctions func_get_arg, func_get_args, func_num_args ou encore, plus récent, avec la méthode magique __call.

Puisque vos classes sont développées en PHP 5, lever des exceptions ne serait-il pas moins expéditif qu'un appel à die ?
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2007, 00h20   #11
Membre confirmé
 
Inscription : mai 2006
Messages : 196
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 196
Points : 278
Points : 278
Effectivement je ne connaissai pas cette nouvelle fonction __call qui m'a l'air très sympa un switch dedans pour contrôler le nom de la fonction donnée et des count() pour contrôler le nombre de paramètres donnés et on à tout ce qu'il faut Merci.

Exemple :p :
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
 
public function __call( $funcName, $funcArg )
{
     switch ( $funcName )
     {
          //Nom de la fonction
          case 'testFunc' :
                 //Test du nombre de paramètre et traitement.
                 switch ( count($funcArg) )
                 {
                       case 1 :
                             echo 'Argument 1 :'.$funcArg[0];
                             break;
                       case 2 :
                             echo 'Argument 1:'.$funcArg[0];
                             echo 'Argument 2:'.$funcArg[1];
                             break;
                       default:
                             echo 'Plus de 3 arguments...ou aucun';
                             break;
                 }
                 break;
     }
}
$monObjet->testFunc( 'Test', '2em argument' );
/*Ceci affichera :
Argument 1: Test
Argument 2: 2em argument */
meliandah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2007, 01h08   #12
Expert Confirmé
 
Avatar de Sub0
 
Homme
Inscription : décembre 2002
Messages : 3 468
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39

Informations forums :
Inscription : décembre 2002
Messages : 3 468
Points : 3 115
Points : 3 115
Envoyer un message via MSN à Sub0 Envoyer un message via Skype™ à Sub0
Au passage, Merci pour les liens.
Sub0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2007, 05h20   #13
Inscrit
 
Avatar de is_null
 
Inscription : octobre 2006
Messages : 637
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 637
Points : 690
Points : 690
Citation:
Envoyé par meliandah
Effectivement je ne connaissai pas cette nouvelle fonction __call qui m'a l'air très sympa un switch dedans pour contrôler le nom de la fonction donnée et des count() pour contrôler le nombre de paramètres donnés et on à tout ce qu'il faut Merci.

Exemple :p :
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
 
public function __call( $funcName, $funcArg )
{
     switch ( $funcName )
     {
          //Nom de la fonction
          case 'testFunc' :
                 //Test du nombre de paramètre et traitement.
                 switch ( count($funcArg) )
                 {
                       case 1 :
                             echo 'Argument 1 :'.$funcArg[0];
                             break;
                       case 2 :
                             echo 'Argument 1:'.$funcArg[0];
                             echo 'Argument 2:'.$funcArg[1];
                             break;
                       default:
                             echo 'Plus de 3 arguments...ou aucun';
                             break;
                 }
                 break;
     }
}
$monObjet->testFunc( 'Test', '2em argument' );
/*Ceci affichera :
Argument 1: Test
Argument 2: 2em argument */
Il fallait utiliser foreach au lieu de switch pour supporter les fonctions a n arguments.
__call est tres utile notamment dans les decorateurs.
__________________
Q: Dois-je haïr et cogner sur Microsoft ?
R: Non, vous n'êtes pas obligé. Non pas que Microsoft n'est pas écoeurant, mais il y avait une culture hacker bien avant Microsoft et il y en aura une bien après que Microsoft aura été de l'histoire ancienne. Toute énergie dépensée à haïr Microsoft serait mieux employée par vos compétences et votre passion. Écrivez du bon code, cela brisera suffisamment Microsoft sans polluer votre karma.
Comment devenir un hacker ? par Eric Steven Raymond
is_null est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2007, 17h36   #14
Membre confirmé
 
Inscription : mai 2006
Messages : 196
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 196
Points : 278
Points : 278
Foreach c'est pour ressortir tous les éléments d'un tableau un par un et les analyser dans une boucle, switch permet de changer le code à executer selon le nombre de paramètres ^^.
meliandah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2007, 20h19   #15
Inscrit
 
Avatar de is_null
 
Inscription : octobre 2006
Messages : 637
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 637
Points : 690
Points : 690
Au temps pour moins j'avais compris que le but était d'appeler n'importe quel $funcName (je venais de travailler un décorateur de classe d'où mon état d'esprit).
__________________
Q: Dois-je haïr et cogner sur Microsoft ?
R: Non, vous n'êtes pas obligé. Non pas que Microsoft n'est pas écoeurant, mais il y avait une culture hacker bien avant Microsoft et il y en aura une bien après que Microsoft aura été de l'histoire ancienne. Toute énergie dépensée à haïr Microsoft serait mieux employée par vos compétences et votre passion. Écrivez du bon code, cela brisera suffisamment Microsoft sans polluer votre karma.
Comment devenir un hacker ? par Eric Steven Raymond
is_null est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2007, 20h21   #16
Inscrit
 
Avatar de is_null
 
Inscription : octobre 2006
Messages : 637
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 637
Points : 690
Points : 690
Au temps pour moins j'avais compris que le but était d'appeler n'importe quel $funcName (je venais de travailler un décorateur de classe d'où mon état d'esprit).

Je ne pensais pas que le but était réélement d'utiliser __call pour voir les paramêtres de fonctions à un ou deux arguments.
__________________
Q: Dois-je haïr et cogner sur Microsoft ?
R: Non, vous n'êtes pas obligé. Non pas que Microsoft n'est pas écoeurant, mais il y avait une culture hacker bien avant Microsoft et il y en aura une bien après que Microsoft aura été de l'histoire ancienne. Toute énergie dépensée à haïr Microsoft serait mieux employée par vos compétences et votre passion. Écrivez du bon code, cela brisera suffisamment Microsoft sans polluer votre karma.
Comment devenir un hacker ? par Eric Steven Raymond
is_null est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h21.


 
 
 
 
Partenaires

Hébergement Web