Bonjour,
Je ne résiste pas à vous faire part de quelques fonctions choisies découvertes lors de la maintenance d'un site web.
Voici déjà les équivalents respectifs de addslashes et de htmlentities
function champ2mysql($champ){
$trans = array("'" => "\'", "\\" => "\\\\");
return strtr($champ, $trans);
}
function affiche_accents($champ){
$trans =
array(
"à" => "à",
"â" => "â",
"ä" => "ä",
"é" => "é",
"è" => "è",
"ê" => "ê",
"ë" => "ë",
"î" => "î",
"ï" => "ï",
"ô" => "ô",
"ö" => "ö",
"ù" => "ù",
"û" => "û",
"ü" => "ü",
"ç" => "ç"
);
return strtr($champ, $trans);
}
Passons maintenant aux fonctions de validations de formulaires.
function is_commentaire ( $s ) {
return true;
}
function is_URL($url){
if (!eregi("^http://", $url)) {
return FALSE;
}
$details = parse_url($url);
if (!isset($details['port'])) {
$details['port'] = "80";
}
if (!isset($details['path'])) {
$details['path'] = "/";
}
if (!ereg("[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+", $details['host'])){
$details['host'] = gethostbyname($details['host']);
}
if ($sock = fsockopen( $details['host'], $details['port'])){
$requete = "GET ".$details['path']." HTTP/1.1\r\n";
$requete .= "Host: ".$details['host']."\r\n\r\n";
fputs($sock, $requete);
$str = fgets($sock, 1024);
while(!ereg('^HTTP/1.1 ', $str)){
$str = fgets($sock, 1024);
}
fclose($sock);
list($http, $str, $texte) = explode(" ", $str, 3);
return array($str, $reponse[$str]);
}
return FALSE;
}
# affiche_accent
Posté par piquouze . Évalué à 4.
[^] # Re: affiche_accent
Posté par BAud (site web personnel) . Évalué à 4.
[^] # Re: affiche_accent
Posté par piquouze . Évalué à 2.
# The Daily WTF
Posté par Octabrain . Évalué à 9.
[^] # Re: The Daily WTF
Posté par Quikeg . Évalué à 1.
Heureusement qu'ils font des articles avec des images de temps en temps :)
# Explications ?
Posté par khivapia . Évalué à 10.
Même si leur apparence prête à réfléchir pour quiconque a une petite expérience de programmation, en quoi ces bouts de code sont-ils à éviter ?
En gros, que font-ils (pas facile à savoir quand on n'en a jamais fait), comment le font-ils mal et comment peut-on y remédier ?
Merci
[^] # Re: Explications ?
Posté par EdB . Évalué à 3.
C'est à dire qu'il y a déjà des fonctions équivalente (et surement mieux pensées) de dispo avec PHP
[^] # Re: Explications ?
Posté par BAud (site web personnel) . Évalué à 7.
surtout ne pas les (re-)donner hein ;-) au hasard :
http://us3.php.net/manual/en/function.addslashes.php
http://us3.php.net/manual/en/function.htmlentities.php
et son inverse http://us3.php.net/manual/en/function.html-entity-decode.php
j'ai bon ?
(je laisse - ceux souhaitant comparer - cliquer sur les liens fournis incidemment dans le journal, qui seront en français)
[^] # Re: Explications ?
Posté par __o . Évalué à 1.
C'est surement ça.
(c.f. http://wiki.python.org/moin/EscapingHtml#line-35 )
[^] # Re: Explications ?
Posté par Octabrain . Évalué à 2.
[^] # Re: Explications ?
Posté par __o . Évalué à 3.
>>> import xml.sax.saxutils
>>> import htmlentitydefs
>>> xml.sax.saxutils.unescape("é é ´", htmlentitydefs.entitydefs);
'é &e\xb4; \xb4'
Ça n'a pas l'air non plus de marcher avec les é, etc.
Je n'ai pas non plus l'impression qu'il soit possible de choisir de charset de sortie (utf-8, iso-8859-1, etc).
[^] # Re: Explications ?
Posté par __o . Évalué à 1.
Si quelqu'un a une solution qui fonctionne, j'en serais très heureux.
[^] # Re: Explications ?
Posté par BohwaZ (site web personnel, Mastodon) . Évalué à 3.
htmlentities -> htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); // TOUJOURS spécifier le charset et ENT_QUOTES ! (en général on ne veux pas encoder toutes les entités, juste protéger des injections, pas besoin de htmlentities donc)
« Je vois bien à quels excès peut conduire une démocratie d'opinion débridée, je le vis tous les jours. » (Nicolas Sarkozy)
# Hoho
Posté par Sphax . Évalué à 10.
[^] # Re: Hoho
Posté par windu.2b . Évalué à 5.
1 http://xkcd.com/221/
[^] # Re: Hoho
Posté par Aurélien Maille . Évalué à 4.
[^] # Re: Hoho
Posté par pyrollo (site web personnel) . Évalué à 4.
[^] # Re: Hoho
Posté par Dr BG . Évalué à 1.
[^] # Re: Hoho
Posté par Octabrain . Évalué à 2.
[^] # Re: Hoho
Posté par Dr BG . Évalué à 1.
[^] # Re: Hoho
Posté par Sphax . Évalué à 1.
En fait, l'équipe utilisait Eclipse, donc ils avaient juste à créer la classe et ses membres, et faire générer les getter/setter par Eclipse. Je doute que quiconque ait envie de passer derrière pour tout traduire.
[^] # Re: Hoho
Posté par thedude . Évalué à 1.
- La philosophie java, soutenue par la notion de bean, exige que les getter/setter commencent par get/is/set.
- D'un point de vue lisibilite du code, t'as pas envie d'avoir un attribut nom qui est accede par getName(). Va retrouver tes petits la dedans.
Donc meme si Java supporte parfaitement un code source ecrit en mandarin oriental via UTF8, c'est une grosse erreur que de coder dans une autre langue.
Ca serait moins genant si java avait de vraies properties et pas juste un concept batard d'attributs accedes par un wrapper suivant une convention de nommage, mais bon, c'est pas comme si le langage etait repute pour evoluer a la vitesse de l'eclair au galop, donc faut faire avec.
Ca me rappelle un prof a la fac qui codait en francais, avec les accents et tout.
Tres sympa pour ceux qui ont un clavier qwerty et qui doivent utiliser sa lib...
[^] # Re: Hoho
Posté par Meku (site web personnel) . Évalué à 2.
[^] # Re: Hoho
Posté par GCN (site web personnel) . Évalué à 0.
I can't believe it... Oups, pardon, je voulais dire "je le crois pas" (ça c'est pour le client, je voudrais pas le froisser non plus :p).
[^] # Re: Hoho
Posté par thedude . Évalué à 1.
On a juste pas trop le droit de leur dire. Pas tant qu'ils ont pas paye tout du moins.
[^] # Re: Hoho
Posté par Sphax . Évalué à 2.
Seulement, moi j'avais pas mon mot à dire hein :p
Tout était déjà en français, alors j'ai fait avec.
[^] # Re: Hoho
Posté par Moogle . Évalué à 2.
# Petit joueur....
Posté par Ummon . Évalué à 5.
#define UOL_IMPLEMENT_FIND_INFO_CLASS(class_name,base_class) \
UOL_IMPLEMENT_SERIAL( class_name##FindInfo, base_class##FindInfo, \
UOL_RUNTIME_CLASS(class_name)->GetSchema() | VERSIONABLE_SUBSCHEMA ) \
class_name##FindInfo::class_name##FindInfo( class_name##Properties *pOriginal ) \
: m_pOriginal( pOriginal ) { if( m_pOriginal ) m_pOriginal->AddRef() ; } \
void class_name##FindInfo::OnCreate( UINT uFlags ) \
{ base_class##FindInfo::OnCreate( uFlags ) ; \
if( GetRuntimeClass() == UOL_RUNTIME_CLASS( class_name##FindInfo ) ) { \
ASSERT( !m_pProperties ) ; \
m_pProperties = new class_name##Properties ; \
m_pProperties->Initialize( this, m_pOriginal ) ; \
m_pProperties->OnCreate( uFlags ) ; UOL_ASSERT_VALID( m_pProperties ) ; \
m_pProperties->AddRef() ; \
if( m_pOriginal ) { SetClass( m_pOriginal->GetOwner()->GetRuntimeClass() ) ; \
CUOLGUID *pGUID = dynamic_cast<CUOLGUID *>( m_pOriginal->GetOwner() ) ; \
UOL_ASSERT_VALID( pGUID ) ; SetGUID( &pGUID->GetGUID() ) ; } \
else SetClass( UOL_RUNTIME_CLASS( class_name ) ) ; \
if( m_pOriginal ) m_pOriginal->ReleaseRef() ; } } \
__UOL_IMPLEMENT_GET_PROPERTIES(class_name##FindInfo,class_name##Properties) \
__UOL_IMPLEMENT_DIAGNOSTICS_FIND_INFO(class_name,base_class)
[^] # Re: Petit joueur....
Posté par jeffcom . Évalué à 7.
[^] # Re: Petit joueur....
Posté par Amand Tihon (site web personnel) . Évalué à 10.
Sans sel.
[^] # Re: Petit joueur....
Posté par Victor STINNER (site web personnel) . Évalué à 3.
[^] # Re: Petit joueur....
Posté par hocwp (site web personnel) . Évalué à 4.
[^] # Re: Petit joueur....j
Posté par Krunch (site web personnel) . Évalué à 6.
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
[^] # Re: Petit joueur....j
Posté par thedude . Évalué à 9.
Comme ca, ils seront bien force d'arreter de coder avec les pieds.
:)
[^] # Re: Petit joueur....
Posté par Octabrain . Évalué à 2.
[^] # Re: Petit joueur....
Posté par Hobgoblins Master (Mastodon) . Évalué à 1.
[^] # Re: Petit joueur....
Posté par Anonyme . Évalué à 10.
Bon je n'ai telephoné que 2 fois, en toute cordialité.
les mecs font des conneries et si personne ne leur dit , toute leur vie il vont pourrir celle des autres
[^] # Re: Petit joueur....
Posté par Zenitram (site web personnel) . Évalué à 8.
Ca va peut-être t'étonner mais : c'est le but!
On peut facilement virer un mec qui a fait un code lisible (quelqu'un d'autre va le reprendre), et on ne se prive parfois pas.
On peut plus difficilement virer un mec qui fait un code pourri (personne ne sera capable de le maintenir), donc on garde l'enfoiré de service grande gueule asocial.
Ou comment inciter les gens à faire un mauvais code pour garder leur poste...
[^] # Re: Petit joueur....
Posté par Olorim . Évalué à 4.
Enfin bon, on a tous déjà vu des script sur une seul ligne sans commentaire...
Ce qui est TRES fort, c'est quand l'auteur se vante devant les béotien de savoir faire les choses avec une seul ligne de code dans un fichier texte (sans bien sur leur préciser que la ligne en question fait 2000 caractères...), du coup le gars passe pour super balèze alors qu'en fait, c'est un naze!
Bienvenu dans le monde du travail...
[^] # Re: Petit joueur....
Posté par mats . Évalué à 5.
[^] # Re: Petit joueur....
Posté par ナイコ (site web personnel) . Évalué à 9.
[^] # Re: Petit joueur....
Posté par Etienne Bagnoud (site web personnel) . Évalué à 10.
#include "programme.h"
PROGRAMME;
Quand même, ça simplifie bien la lecture ...
"It was a bright cold day in April, and the clocks were striking thirteen" - Georges Orwell
[^] # Alors moi j'ai des fortunes.
Posté par Krunch (site web personnel) . Évalué à 3.
Et quelques unes que j'ai du boulot :
/*
* Initially, we populate the island with all the rifraff peers
* that happen to be lying around. Those with seriously
* defective clocks are immediately booted off the island. Then,
* the falsetickers are culled and put to sea. The truechimers
* remaining are subject to repeated rounds where the most
* unpopular at each round is kicked off. When the population
* has dwindled to sys_minclock, the survivors split a million
* bucks and collectively crank the chimes.
*/
-- ntp-4.2.2p1/ntpd/ntp_proto.c:clock_select()
%
select(0, NULL, NULL, NULL, &tv); // ought to loop until done
-- top.c
%
ret = setsockopt(sockfd, TC_IPPROTO, SO_SET_REPLACE, repl,
sizeof(*repl) + repl->size);
if (ret < 0) {
errno = ret;
-- iptables/libiptc/libiptc.c:TC_COMMIT()
%
<XXX> kernel: Badness in __writeback_single_inode -- does that telle something to anyone ?
<YYY> XXX, it means __writeback_single_inode was coded by samuel l. jackson
%
if (pn->inode==inode) {
/* Some warning should be appropriate here
as we got multiple processes for one i-node */
return;
}
-- netstat.c
%
#define PRG_HASHIT(x) ((x) % PRG_HASH_SIZE)
-- netstat.c
%
* XXX is trying to understand how coreutils' get_date() works
* XXX feels pathetic
%
J'en ai aussi sur TDWTF.
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
[^] # Re: Alors moi j'ai des fortunes.
Posté par 2PetitsVerres . Évalué à 2.
</private>
Tous les nombres premiers sont impairs, sauf un. Tous les nombres premiers sont impairs, sauf deux.
[^] # Re: Alors moi j'ai des fortunes.
Posté par galactikboulay . Évalué à 1.
[^] # Re: Alors moi j'ai des fortunes.
Posté par Krunch (site web personnel) . Évalué à 1.
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
[^] # Re: Alors moi j'ai des fortunes.
Posté par PLuG . Évalué à 3.
[^] # Re: Petit joueur....
Posté par Joël . Évalué à 1.
Après, il faut savoir leur donner de la gueule. Je suis d'accord que dans l'exemple ci-dessus, c'est vraiment dégueu, mais il suffit de coder la macro comme du code normal (avec les retours chariots et l'indentation d'un code propre), puis avec une commande de remplacement on rajoute un '\' en fin de chaque ligne (sauf la dernière) et enfin (le meilleur !!), grâce à l'outil génial "tal" (http://thomasjensen.com/software/tal/), pour lequel on a évidemment rajouté un raccourci dans vim, on aligne proprement les '\' en fin de ligne. Et voilà, le tour est joué ! Au prochain épisode, comment débugger les macros avec gdb...
[^] # Re: Petit joueur....
Posté par pasBill pasGates . Évalué à 8.
Tu utilises des fonctions inline au besoin, mais un truc pareil c'est tout simplement inacceptable, le jour ou je vois un jeunot pondre un truc pareil dans une code review, je lui code 2 claques et l'envoie nettoyer les chiottes.
[^] # Re: Petit joueur....
Posté par Joël . Évalué à 2.
[^] # Re: Petit joueur....
Posté par pasBill pasGates . Évalué à 3.
[^] # Re: Petit joueur....
Posté par Gniarf . Évalué à 8.
[^] # Re: Petit joueur....
Posté par Etienne Bagnoud (site web personnel) . Évalué à 7.
"It was a bright cold day in April, and the clocks were striking thirteen" - Georges Orwell
[^] # Re: Petit joueur....
Posté par pasBill pasGates . Évalué à 2.
[^] # Re: Petit joueur....
Posté par Moonz . Évalué à 3.
Petit extrait :
#define REWRITE_FUNCTION_SIMPLE(return_type, function_name, signature, orig_call) \
return_type function_name signature { \
return_type return_value; \
char *new_path; \
\
PRINT_DEBUG(#function_name ": %s\n", path); \
\
new_path = translate (path); \
return_value = orig_##function_name orig_call; \
free (new_path); \
return return_value; \
}
REWRITE_FUNCTION_SIMPLE(FILE*, fopen, (const char *path, const char *mode), (new_path, mode))
REWRITE_FUNCTION_SIMPLE(FILE*, fopen64, (const char *path, const char *mode), (new_path, mode))
REWRITE_FUNCTION_SIMPLE(FILE*, freopen, (const char *path, const char *mode, FILE *stream), (new_path, mode, stream))
// … et plein d’autres fonctions comme ça
[^] # Re: Petit joueur....
Posté par ecyrbe . Évalué à 1.
[^] # Re: Petit joueur....
Posté par pasBill pasGates . Évalué à -1.
[^] # Re: Petit joueur....
Posté par ecyrbe . Évalué à 2.
Ce serait bien de transmettre le message aussi...
[^] # Re: Petit joueur....
Posté par windu.2b . Évalué à 1.
Enfin, je suppose... Parce que sinon je ne comprends pas bien ce que tu cherches à nous dire !
[^] # Re: Petit joueur....
Posté par jcs (site web personnel) . Évalué à 1.
# Il y a même un guide pour écrire du code comme ça !
Posté par Benoît Monin . Évalué à 10.
Comme ils disaient dans une boite ou j'ai passé quelques temps : .
[^] # Re: Il y a même un guide pour écrire du code comme ça !
Posté par BAud (site web personnel) . Évalué à 3.
[^] # Re: Il y a même un guide pour écrire du code comme ça !
Posté par galactikboulay . Évalué à 1.
[^] # Re: Il y a même un guide pour écrire du code comme ça !
Posté par Troy McClure (site web personnel) . Évalué à 9.
[^] # Re: Il y a même un guide pour écrire du code comme ça !
Posté par Benoît Monin . Évalué à 3.
Bref c'était plutôt de l'ironie de la part de ceux qui devait essayer de faire tomber en marche le soft un jour de plus.
[^] # Re: Il y a même un guide pour écrire du code comme ça !
Posté par BAud (site web personnel) . Évalué à 1.
on se connaît ? c'est une expression à moi aussi ça :-) (ou alors un opérateur telecom en commun dans nos parcours respectifs...)
[^] # Re: Il y a même un guide pour écrire du code comme ça !
Posté par Benoît Monin . Évalué à 4.
Ca veut peut-être dire que les logiciels mal conçus et les codes plat de nouilles sont plutôt la norme que l'exception.
[^] # Re: Il y a même un guide pour écrire du code comme ça !
Posté par Thomas Douillard . Évalué à 9.
[^] # Re: Il y a même un guide pour écrire du code comme ça !
Posté par bonnaud frederic (site web personnel) . Évalué à 6.
[^] # Re: Il y a même un guide pour écrire du code comme ça !
Posté par Maclag . Évalué à 5.
[^] # Re: Il y a même un guide pour écrire du code comme ça !
Posté par aedrin . Évalué à 3.
[^] # Re: Il y a même un guide pour écrire du code comme ça !
Posté par ✅ ffx . Évalué à 2.
# Commentaire supprimé
Posté par Anonyme . Évalué à 5.
Ce commentaire a été supprimé par l’équipe de modération.
[^] # Re: Avec les trous de sécus en plus !
Posté par Ellendhel (site web personnel) . Évalué à 8.
Je suis déjà choqué à ce point.
[^] # Re: Avec les trous de sécus en plus !
Posté par totof2000 . Évalué à 5.
Moi je suis choqué à ce point. C'est surtout du code PHP qui me choque.
[^] # Re: Avec les trous de sécus en plus !
Posté par BohwaZ (site web personnel, Mastodon) . Évalué à 1.
Imaginons que je sois dans un objet Pages qui gère les pages d'un site (cas réel), je veux avoir un système de signaux qui permette de greffer des plugins sur mon code de manière propre. Je vais donc avoir une méthode de ce genre :
public function createPage($title, $lang, $uri = '', $online = true)
{
$this->emitSignal('page.create.before', $title, $lang, $uri, $online);
DB::query('INSERT INTO pages (id, title, lang, uri, online) VALUES (NULL, \''.DB::escape($title).'\', ....
}
OK et je veux que emitSignals transmette les arguments en référence au callback du plugin. Je ne peux donc pas faire ça :
public function emitSignal($name)
{
$callback = array('myPlugin', 'myCallback');
call_user_func($callback, &$this, func_get_args());
}
Ça aurait été bien pratique mais func_get_args ne sait pas renvoyer une référence des arguments. Va donc falloir ruser :
public function emitSignal($signal, &$arg1 = null, &$arg2 = null, &$arg3 = null, &$arg4 = null, &$arg5 = null, &$arg6 = null, &$arg7 = null, &$arg8 = null, &$arg9 =
null)
{
$callback = array('myPlugin', 'myCallback');
call_user_func($callback, &$this, &$arg1, &$arg2, &$arg3, &$arg4, &$arg5, &$arg6, &$arg7, &$arg8, &$arg9);
}
En priant très fort qu'on n'ait jamais besoin de plus de 9 arguments (déjà que le code est horrible). PHP a plein de ce genre de lacunes avec lesquelles il faut composer dès qu'on veux faire des trucs un chouia complexe. Ça s'améliore avec le temps heureusement (et PHP6 est très prometteur sur ce point), mais faut encore faire avec. Donc dans un sens je peux comprendre les mecs de NPDS, même si l'idée de base est mauvaise (irk).
Sinon dans les autres trucs rigolos :
define('<?php die("HUHUHU"); ?>', 'AH AHAHAHHA');
Contrairement à toute attente (et au manuel PHP qui dis que seuls certains caractères sont autorisés dans le nom d'un define), ça fonctionne. On ne peut pas accéder au define (à part avec get_defined_constants()) mais on peux le définir...
« Je vois bien à quels excès peut conduire une démocratie d'opinion débridée, je le vis tous les jours. » (Nicolas Sarkozy)
[^] # Re: Avec les trous de sécus en plus !
Posté par __o . Évalué à 3.
[^] # Re: Avec les trous de sécus en plus !
Posté par BohwaZ (site web personnel, Mastodon) . Évalué à 2.
« Je vois bien à quels excès peut conduire une démocratie d'opinion débridée, je le vis tous les jours. » (Nicolas Sarkozy)
[^] # Re: Avec les trous de sécus en plus !
Posté par __o . Évalué à 1.
Les autres types (strings, ints) ne le sont pas. Dans ce cas ils agissent un peu comme dans beaucoup de langages de scripts : Ils sont immuables. D'ailleurs est-ce que tu as une meilleur solution pour ta méthode emit dans un autre langage de script ?
# A deux trois exceptions près
Posté par Axioplase ıɥs∀ (site web personnel) . Évalué à 3.
Ensuite, t'as les libs. Et quand tu fais un logiciel pour faire du Machin 2.0, alors tu prends le SRFI-machin, le Egg-machin, le dumping-grounded-machin… (en gros, une lib).
C'est aussi le cas de Perl et du CPAN (où tu vas d'abord chercher la solution à ton problème avant de réflechir à comment le résoudre).
Y'aurait-il que PHP pour coder en dur dans le langage la moitié de tous les programmes des utilisateurs du langage ?
[^] # Re: A deux trois exceptions près
Posté par Octabrain . Évalué à 3.
Et les mettre tous dans le namespace par défaut ! (en utilisant peu de préfixes bien sûr, qui aurait pu au moins amoindrir le problème)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.