Cherche Coder PHP pour "échange"

Statut
N'est pas ouverte pour d'autres réponses.

Ezekiel !

Elite
Hello,
Ca fait 6 ans maintenant que je code en PHP et j'ai adopté un certain style (assez orienté objet) que je n'arrive plus à faire évoluer. Je trouve tjs 2-3 trucs à changer mais rien de bien méchant.

Je cherche donc qqun ayant une solide expérience de PHP qui serait prêt à échanger des codes sources afin de progresser et pourquoi pas changer de style :).

Si qqun est intéressé, ajouter sc_mustang@hotmail.com.

Voila à quoi ressemble pratiquement toute mes pages php ... :
$f = new NewForm();

$f->openFieldSet(t('informationsCompte'));
$f->addInput('login', t('login'), 'text', 'Post', true, 'Az09');
$f->addInput('password', t('password'), 'password', 'Post', true, 'Az09');
$f->addInput('confirmation', t('confirmation'), 'password', 'Post', true, 'Az09');
$f->closeFieldSet();

$f->openFieldSet(t('informationsUtilisateur'));
$f->addInput('name', t('nom'), 'text', 'Post', true);
$f->addInput('firstname', t('prenom'), 'text', 'Post', true);
$f->addDate('birthdate', t('dateNaissance'), 'Date');
$date = $f->getLastObject();
$date->setBeginYear(1900);
$f->addTextArea('adress', t('adresse'));
$f->addInput('city', t('ville'), 'text', 'Post', false);
$f->addInput('postcode', t('codePostal'), 'text', 'Post', false, 'Int');
$f->addInput('phone', t('telephone'), 'text', 'Post', false, 'Int');
$f->addInput('phoneOffice', t('telephoneBureau'), 'text', 'Post', false, 'Int');
$f->addInput('phoneUrgency', t('telephoneUrgence'), 'text', 'Post', false, 'Int');
$f->addInput('cellular', t('cellular'), 'text', 'Post', false, 'Int');
$f->addInput('email', t('email'), 'text', 'Post', true, 'Email');
$f->addInput('secondEmail', t('secondEmail'), 'text', 'Post', false, 'Email');
$f->addInput('fax', t('fax'), 'text', 'Post', false, 'Int');
$f->addEditor('comment', t('commentaire'), 'Post');
$f->closeFieldSet();

if ($f->verifForm())
{
$verif = $sql->queryExtract('SELECT COUNT(*) AS num FROM user WHERE login = "'.$_POST['login'].'"');
if (!empty($verif['num']))
{
$lg = $f->getObject(1);
$lg->setError(t('erreur').' ! '.t('loginPris').' !');
}
if ($_POST['password'] != $_POST['confirmation'])
{
$pw = $f->getObject(2);
$pw->setError(t('erreur').' ! '.t('passwordDifferent').' !');
}
if ($f->confirmForm())
{
$sql->query ('INSERT INTO user VALUES(
"",
"'.$_POST['login'].'",
"'.md5($_POST['password']).'",
"'.$_POST['name'].'",
"'.$_POST['firstname'].'",
"'.NewForm::date('birthdate').'",
"'.nl2br($_POST['adress']).'",
"'.$_POST['city'].'",
"'.$_POST['postcode'].'",
"'.$_POST['phone'].'",
"'.$_POST['phoneOffice'].'",
"'.$_POST['phoneUrgency'].'",
"'.$_POST['cellular'].'",
"'.$_POST['email'].'",
"'.$_POST['secondEmail'].'",
"'.$_POST['fax'].'",
"'.addslashes(NewForm::clearHtml($_POST['comment'])).'",
"1"
)');
header('Location: index.php?module=userGestion');
}
}
echo $f;
 

ozilrit

Elite
que je n'arrive plus à faire évoluer
Ne t'inquiète pas, je vais te trouver matière à étudier. :)


$f = new NewForm();

$f->openFieldSet(t('informationsCompte'));
$f->addInput('login', t('login'), 'text', 'Post', true, 'Az09');
$f->addInput('password', t('password'), 'password', 'Post', true, 'Az09');
$f->addInput('confirmation', t('confirmation'), 'password', 'Post', true, 'Az09');
$f->closeFieldSet();

$f->openFieldSet(t('informationsUtilisateur'));
$f->addInput('name', t('nom'), 'text', 'Post', true);
$f->addInput('firstname', t('prenom'), 'text', 'Post', true);
$f->addDate('birthdate', t('dateNaissance'), 'Date');
$date = $f->getLastObject();
$date->setBeginYear(1900);
$f->addTextArea('adress', t('adresse'));
$f->addInput('city', t('ville'), 'text', 'Post', false);
$f->addInput('postcode', t('codePostal'), 'text', 'Post', false, 'Int');
$f->addInput('phone', t('telephone'), 'text', 'Post', false, 'Int');
$f->addInput('phoneOffice', t('telephoneBureau'), 'text', 'Post', false, 'Int');
$f->addInput('phoneUrgency', t('telephoneUrgence'), 'text', 'Post', false, 'Int');
$f->addInput('cellular', t('cellular'), 'text', 'Post', false, 'Int');
$f->addInput('email', t('email'), 'text', 'Post', true, 'Email');
$f->addInput('secondEmail', t('secondEmail'), 'text', 'Post', false, 'Email');
$f->addInput('fax', t('fax'), 'text', 'Post', false, 'Int');
$f->addEditor('comment', t('commentaire'), 'Post');
$f->closeFieldSet();
OMFG ! MVC to the rescue ! =]

if ($f->verifForm())
Pourrions-nous avoir la classe NewForm ? Serait-ce ici que tu vérifies les entrées de l'utilisateur ?
{
$verif = $sql->queryExtract('SELECT COUNT(*) AS num FROM user WHERE login = "'.$_POST['login'].'"');
COUNT(1) ou COUNT(clef_primaire)
if (!empty($verif['num']))
if (isset ($verif['num']{0})) {
{
$lg = $f->getObject(1);
$lg->setError(t('erreur').' ! '.t('loginPris').' !');
}
if ($_POST['password'] != $_POST['confirmation'])
!==
{
$pw = $f->getObject(2);
$pw->setError(t('erreur').' ! '.t('passwordDifferent').' !');
}
if ($f->confirmForm())
{
$sql->query ('INSERT INTO user VALUES(
Description des champs
"",
"'.$_POST['login'].'",
"'.md5($_POST['password']).'",
sha1, ou encore mieux : sha256 (personne n'aura l'idée de forcer un mdp via un algo différent que ceux proposé par PHP)
"'.$_POST['name'].'",
"'.$_POST['firstname'].'",
"'.NewForm::date('birthdate').'",
Static ?
"'.nl2br($_POST['adress']).'",
address =]
"'.$_POST['city'].'",
"'.$_POST['postcode'].'",
"'.$_POST['phone'].'",
"'.$_POST['phoneOffice'].'",
"'.$_POST['phoneUrgency'].'",
"'.$_POST['cellular'].'",
"'.$_POST['email'].'",
"'.$_POST['secondEmail'].'",
"'.$_POST['fax'].'",
"'.addslashes(NewForm::clearHtml($_POST['comment'])).'",
Static ?
"1"
)');
sqldriver_real_escape_string, PDO ou mieux, compiler la requête et assigner les champs
header('Location: index.php?module=userGestion');
}
}
echo $f;
En quelques mots, le principal - pour le cas présenté - me semble :
  • de documenter.
  • de filtrer (ou une des méthodes s'en occupe ?).
  • d'échapper.
  • d'apprendre à jeter des exceptions.
  • d'apprendre le patron architectural MVC.
    et par extension des deux derniers : apprendre à organiser ton app.​

Ch'ti ajout : la convention Zend veut que les { soient placés sur la même ligne que la condition.

Bonne étude ;).
Si tu galères pour comprendre ou pour trouver des ressources, laisse un mot sur ce thread.
 

ozilrit

Elite
Oulaaaaaaaaaaaaaaaaaaaaaaaaaaaaaah. Je viens de voir quelque chose de très important. Qui mérite bien son message à part.

Tu sembles faire tes conditions ainsi :
if (true) {
echo 'On continue.';
if (true) {
echo 'On continue.';​
} else {
echo 'On arrête.';​
}​
} else {
echo 'On arrête.';​
}
Mais pour l'amour du ZendEngine, choisi plutôt cette méthode :
if (! true) {
echo 'On arrête.';​
}
echo 'On continue.';
if (! true) {
echo 'On arrête.';​
}
echo 'On continue.';

Ch'ti ajout : étudier le ZendFramework (pas l'utiliser hein, l'étudier) est très intéressant.
 
1er
OP
Ezekiel !

Ezekiel !

Elite
D'abord merci pour ta réponse :)

Ensuite, pour la classe NewForm voici un petit rar :
http://nfbyezekiel.free.fr/NewForm.rar

Pour les "{", je ne savais pas, j'utilise le "style" de mon prof en java :).

Pour le COUNT(*), j'avais lu que c'est plus rapide que de faire un COUNT(idUser) par exemple. Ca a peut être évolué depuis je vais me renseigner la dessus.

Peux-tu m'expliquer pour le !== ? Quelle différence y t il ?
Idem pour le isset, je vois pas :p. Question de rapidité ?

Merci pour le sha1, c'est vrai que j'utilise tjs le md5 par habitude alors que plein d'autres algos existent.

Pour ce qui est du traitement des $_POST & $_GET, je les traite tjs en début de page avec une fonction du style :

PHP:
    /* Traite les $_GET & $_POST en convertissant tout les symboles en leur équivalent HTML */
    function secureGetAndPost()
    {
        foreach($_POST as $key => $value)
        {
            if (!is_array($value))
            {
                $_POST[$key] = htmlentities(stripslashes($value), ENT_QUOTES);
            }
        }
        foreach($_GET as $key => $value)
        {
            if (!is_array($value))
            {
                $_GET[$key] = htmlentities(stripslashes($value), ENT_QUOTES);
            }
        }
    }
Pour le MVC, j'ai déjà lu pas mal de truc dessus mais je n'arrive pas à l'appliquer correctement j'ai l'impression ^^. J'ai déja fait 2-3 petits tests mais le "gain" me paraissait trop faible pour ce que j'ai l'habitude de faire. Je suppose que c'est parce que je ne le gere pas encore correctement.

Et pour terminer merci pour le zend framework, ça doit faire un paquet de source intéressant à lire.
 

ozilrit

Elite
De rien. Je checkerai le rar ce soir ou demain matin.

Pour les "{", je ne savais pas, j'utilise le "style" de mon prof en java :).
C'est uniquement valable pour les conditions.

class Person
{
public __construct ()
{
if (true) {
return 'Hey, my name is Earl.';​
}
return '';​
}​
}
Pour le COUNT(*), j'avais lu que c'est plus rapide que de faire un COUNT(idUser) par exemple. Ca a peut être évolué depuis je vais me renseigner la dessus.
My mistake. Cela dépend fortement de la base de donnée.​

Peux-tu m'expliquer pour le !== ? Quelle différence y t il ?
PHP est losely typed. N'importe quelle valeur (excepté Array et null) peut-être convertie dans un autre type. String "0" peut devenir int 0 ou boolean false ou...

Une comparaison == vérifie la valeur, une comparaison === vérifie la valeur et le type.

('0' == 0) renverra true puisqu'une fois converties, les deux valeurs sont égales.
('0' === 0) renverra false puisque les types sont différents.​

Idem pour le isset, je vois pas :p. Question de rapidité ?
Entre autre, empty est extrêmement lent.

Il est également plus performant de vérifier la longueur d'une chaine par la présence d'un 32ème caractère (isset($var{31})) que par comparaison de sa longueur (strlen($var) < 33).​
Merci pour le sha1, c'est vrai que j'utilise tjs le md5 par habitude alors que plein d'autres algos existent.
Ch'tite info : il existe un paramètre pour recevoir une chaîne de 32 chars plutôt que 40 (pour ne pas modifier ta bdd par exemple).​

Pour ce qui est du traitement des $_POST & $_GET, je les traite tjs en début de page avec une fonction du style :
Peut-être pourrais-tu créer un tableau _CLEAN dans ce cas.

Pourquoi ne pas lire le tableau par référence ?
foreach($_POST as &$value) {
$value = 'w00t';​
}​

J'ai déja fait 2-3 petits tests mais le "gain" me paraissait trop faible pour ce que j'ai l'habitude de faire.
S'il te reste un essai, envois-le. :)
 

ozilrit

Elite
Ce NewForm.rar donc...

Première constatation à l'ouverture : aucun dossier, aucune convention de nommage (excepté le CamelCase).

Tu pourrais documenter tes fichiers à l'aide du "jséplukomencasapeldsl" :
/**
* Projet machin.
*
* @author toi <ton@mail.com>
* @version 0.1
* @copyright blabla
*/​

Dans InputFile :
public function setMaxSize($maxSize)
public function getMaxSize()
Ce serait dommage de galérer, dans six mois, parce qu'il manquait un Max pour bien définir la f(). =]​
$this->setError(Error::Required());
Exception. :)

Dans Verification :
preg_match("!^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]{2,}\.[a-zA-Z]{2,4}$!", $chaine);
Tu pourrais ajouter % et + dans le nom. Supprimer _ dans le domaine. Ajouter l'extension .museum. :D

Dans Verification également :
public static function Required ($chaine)
{
return isset($chaine{0});​
}
public static function Int($chaine)
{
return is_int($chaine);​
}
public static function Number($chaine)
{
return is_numeric($chaine);​
}
public static function Float($chaine)
{
return is_float($chaine) || ( (float) $chaine > (int) $chaine || strlen($chaine) != strlen( (int) $chaine) ) && (int) $chaine != 0;​
}
public static function Letter($chaine)
{
return ctype_alpha($chaine);​
}

...enfin, tu vois quoi. Vire ces regex et profite des librairies (native (is_), ctype et filter).​


Je ne commente pas les Helpers pour pondre html ou js, gogogo mvc. :)
 

Calvin80

Respect is key
Hello

pas eu le temps de regarder le code, mais un truc m'a sauté au yeux (et m'en a crevé un), ien avant des problemes de count(id) ou count(*) qui, après la centaine de tests différents que j'ai faits, ne ramène que peanut,

$verif = $sql->queryExtract('SELECT COUNT(*) AS num FROM user WHERE login = "'.$_POST['login'].'"')

NE JAMAIS UTILISER LES INPUTS EXTERNES DIRECTEMENT DANS LES QUERIES !!!!!!!!!!

;)

edit : oops..j'ai lu la suite de ton post et ta fonction de "securisation" des Get et Post.
Attention, le htmlentities va remplacer tes "simple quote", mais ce n'est pas suffisant pour empecher les injections SQL.

y'a des frameworks qui gèrent très bien les accès DB, ZF par exemple mais aussi pear ou autre.
Je te conseille sincèrement de faire le tour de ceux-ci et d'opter pour l'un deux.
Tu gagneras en performance, clarté et....sécurité.
 

Calvin80

Respect is key
Pourquoi ne pas lire le tableau par référence ?
foreach($_POST as &$value) {
$value = 'w00t';​
}[/indent]


S'il te reste un essai, envois-le. :)
j'ai tjrs du mal à conseiller cette syntaxe...
Combien de fois j'ai eu le cas de personne qui vont ensuite utiliser le $value, ailleur dans le code et boooooom ! caput l'array ...
 

ozilrit

Elite
Un exemp' ?



edit : oops..j'ai lu la suite de ton post et ta fonction de "securisation" des Get et Post.
Il y a toujours un net problème de perf.

S'il prépare sa requête avec un paramètre :login, l'rdbms utilisera le même plan d'exécution pré-compilé pour chaque appel.
SELECT COUNT(*) AS num FROM user WHERE login = :login​
S'il crée des requêtes dynamiques, chaque appel obligera l'rdbms à recalculer un plan d'exécution.
SELECT COUNT(*) AS num FROM user WHERE login = 'toto'
SELECT COUNT(*) AS num FROM user WHERE login = 'tata'
SELECT COUNT(*) AS num FROM user WHERE login = 'titi'
SELECT COUNT(*) AS num FROM user WHERE login = 'Angela'​
Et comme la mémoire du rdbms n'est pas infinie, le plan d'exécution de toto disparaitra, puis celui de tata, puis... et hop on est reparti pour un tour.

Exemple PHP/Oracle sur OTN.

D'façon le problème ne se pose pas vraiment : no news.
 

ozilrit

Elite
$verif = $sql->queryExtract('SELECT COUNT(*) AS num FROM user WHERE login = "'.$_POST['login'].'"');
if (!empty($verif['num']))
{
Ha oui mais...s'il est uniquement nécessaire de vérifier qu'un enregistrement au nom d'Angela existe, autant faire :
SELECT 1 AS `num` FROM `user` WHERE `login` = :login​
 
1er
OP
Ezekiel !

Ezekiel !

Elite
Merci pour les réponses,
ozilrit : c'est bien uniquement pour vérifier le qu'un enregistrement d'angela existe :), j'utiliserais ta syntaxe so.

Calvin: pourrais tu me donner un exemple d'injection SQL ? Je ne vois pas cmt on pourrait faire si je convertit les simples quotes & doubles quotes.
 

Calvin80

Respect is key
Merci pour les réponses,
ozilrit : c'est bien uniquement pour vérifier le qu'un enregistrement d'angela existe :), j'utiliserais ta syntaxe so.

Calvin: pourrais tu me donner un exemple d'injection SQL ? Je ne vois pas cmt on pourrait faire si je convertit les simples quotes & doubles quotes.

désolé pour le temps de réponse :-'
tu trouveras des exemples TRES interessant ici :
http://www.0x000000.com/?i=14
 
Je ne donnerai qu'un lien :

http://www.cakephp.org (il m'a l'air down depuis 5min)


mon nouveau coup de coeur....

Perso le Zend Framework n'est pas un framework pour moi mais bien une grosse malette de librairies comme tu en auras sûrement collectées ou créées depuis 6 ans que tu programmes.

Si tu veux passer à l'étape supérieure, prends un framework
 
Je ne donnerai qu'un lien :

http://www.cakephp.org (il m'a l'air down depuis 5min)


mon nouveau coup de coeur....

Perso le Zend Framework n'est pas un framework pour moi mais bien une grosse malette de librairies comme tu en auras sûrement collectées ou créées depuis 6 ans que tu programmes.

Si tu veux passer à l'étape supérieure, prends un framework
En même temps un frmework à mes yeux est un recueil de librairie. Et surtout uneffet de mode ...
 
Je ne pense pas comme ça. Je ne dis pas que c'est LA solution mais beaucoup de structure pro l'utilise depuis longtemps.

C'est plutôt un modèle d'architecture et de conception de programmation qui permet d'avancer plus vite (après avoir appris je l'accorde) et surtout de te structurer.

Là y'a pas photo.

Utile dans les projets collaboratifs mais même les projets Solo (suivant les frameworks MVC...)

Regarde comment on programme avec Zend ou avec ses propres librairaies de classes et comment on le fait en Adobe Flex, Ruby, Symfony, Cake et les autres.

Y'a une grande différence niveau structure et programmation.

Sinon Ezekiel n'hésite pas à jeter un oeil! ;)

PS
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut