EQUIVALENT DE INNERHTML JAVASCRIPT, MAIS GLOBAL

kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015 - 15 juil. 2008 à 13:28
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015 - 17 juil. 2008 à 08:54
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/47278-equivalent-de-innerhtml-javascript-mais-global

kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
17 juil. 2008 à 08:54
Le résultat est le même mais isset() est plus rapide car ce n'est pas une fonction... .. . ;o)

@ tchaOo°
cs_8Tnerolf8 Messages postés 30 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 17 novembre 2009
17 juil. 2008 à 05:26
Effectivement, en testant l'indice 0 d'une chaîne de caractère, on peut utiliser isset, mais je trouve que cela revient au même que de tester sur la longueur de la chaîne.

Bonne journée.

Tnérolf
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
16 juil. 2008 à 20:05
Non parce que ce n'est pas la variable en elle même que tu test mais le premier offset de la chaine... lorsque que tu utilise les crochets sur une chaine (ou les accolades mais elle vont disparaitre avec php6) tu pointe sur un caractère de ta chaine en gros ta chaine se comporte comme un tableau où chaque entrée est un caractère... donc...

$str = 'test';
echo $str[0] // affichera t

Si tu regarde le code que je te donne je test la présence du premier caractère dans la chaine... s'il n'y en a pas on peut donc en déduire que la chaine est vide...

$str = 'test';
var_dump(isset($str[0])); // true
$str = '';
var_dump(isset($str[0])); // false

bien entendu si tu fais...

isset($str)

Ca te renverra toujours true vu que la variable existe... .. .

Voili voilou

@ tchaOo°
cs_8Tnerolf8 Messages postés 30 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 17 novembre 2009
16 juil. 2008 à 19:02
Bonsoir

Merci pour tes précisions concernant la différence de temps d'exécution entre l'opérateur ternaire et le if classique.
A mon tour de m'expliquer :

function InnerHTML($HTML,$Balise,$Prem_val='',$Affiche_prems=true,$Nbre_bal=0)

Tu peux remarquer que $Prem_val est initialisée à vide si aucune valeur n'est passée en paramètre. Donc, la variable est déclarée et un isset($Prem_val) renverra true.

Bonne soirée.

Tnérolf
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
16 juil. 2008 à 10:58
Salut

"Je n'ai pas utilisé if(isset($Prem_val) car cette variable est affectée par défaut à une valeur vide dans la déclaration de la fonction."

Je n'ai pas compris... .. .

"Concernant les opérateurs ternaires, préconises-tu de les remplacer par"

Oui tout à fait le bloc de condition classique est bien plus rapide d'éxécution (2 à 3 fois si je me souviens bien)

@ tchaOo°
cs_8Tnerolf8 Messages postés 30 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 17 novembre 2009
16 juil. 2008 à 05:48
Bonjour Kankrelune

Tout d'abord un grand merci pour ta note et le temps que tu as pris pour rédiger tes suggestions d'optimisation.

Je n'ai pas fait de comparaison typée car je n'y ai pas pensé, habitué que je suis à évoluer dans un monde VBA. Je vais me pencher sur ce sujet dès que possible afin d'optimiser mon code.

Si, au début, je fais
if(strlen($Prem_val)==0)
{
$Affiche_prems=true;
if($Nbre_bal==0) $Nbre_bal=1;
}
else
{
$Nbre_bal=0;
}
c'est effectivement pour forcer l'affichage de la première valeur si on choisit de récupérer les lignes par nombre et pas par valeur.
Je te rejoins dans l'inutilité du else.

Je n'ai pas utilisé if(isset($Prem_val) car cette variable est affectée par défaut à une valeur vide dans la déclaration de la fonction.

Concernant les opérateurs ternaires, préconises-tu de les remplacer par
if(...)
{
...
}
else
{
...
} ?

Dès que possible, je tirerai profit de tes conseils et suggestions et adapterai le code de cette fonction en conséquence.

Bonne journée.

Tnérolf
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
15 juil. 2008 à 23:22
Oki je comprend mieux... .. .

Pour ce qui est du code je commente ou bout à bout ce n'est donc pas un jugement de valeur sur le code au complet... .. .

Préfère les comparaisons typé au comparaison non typés tu grappillera un peu en terme de perf et au moins comme ça tu es sûr du contenu de la variable que tu teste... je vois que tu le fais par moment notamment avec les fonctions str**pos n'hésite à l'utiliser dans d'autre contextes/block de condition... .. .

false == 0

mais

false !== 0

sinon au tout début de ta fonction pourquoi fais tu

if(strlen($Prem_val)==0)
{
$Affiche_prems=true;
if($Nbre_bal==0) $Nbre_bal=1;
}
else
{
$Nbre_bal=0;
}

ton $Nbre_bal est déjà instancié par défaut à 0 et de toute façon tu le change après... de plus le second if est inutile dans le premier bloc mais ça c'est un détail... .. .

if(strlen($Prem_val) === 0)
{
$Affiche_prems = true;
$Nbre_bal = 1;
}

ou

if(strlen($Prem_val) === 0)
{
$Affiche_prems = true;
$Nbre_bal = 1;
}
else $Nbre_bal = 0;

mais dans ce cas tu peux supprimer le paramètre $Nbre_bal il ne sert plus à rien puisqu'il est de toute façon mis à 1 ou à 0 au début de la fonction

Sinon petit astuce...

if(isset($testStr[0]))

est plus rapide que

if(strlen($testStr) !== 0)

il faut juste que tu soit sûr que $testStr est bien une chaine... .. . ;o)

évite les opérateurs ternaire (ex: $mavar = ($bool) ? 0 : 1;) c'est vrai que c'est pratique , moi même je les utilise de temps à autre, mais ça alourdi le temps d'exécution donc à éviter surtout dans une boucle... .. .

Evite les alias de fonction... je pense notament à sizeof() utilise plutot count() pour 2 raisons la première est qu'un alias peut être facilement amené à disparait dans une version future de php et se palucher tout ses script pour remplacer les alias c'est chiant même avec une moulinette... mais bon ça encore passons, les alias ne sont qu'un appel vers la fonction mère... en gros dans le code source de php, si php était codé en php lol, ça donne...

function sizeof($var) { return count($var); }

donc encore une fois petite perte de perf... et comme il y a pas de petit profit... lol... surtout quand c'est dans une boucle... .. .

++$Compteur; sera mieux que $Compteur+=1; sauf si tu veux utiliser la valeur de ta variable avant de l'incrémenter... la pre incrémentassions est plus rapide d'exécution... .. .

$Taille2=sizeof($Recup[$Taille])==0 ? 0 : sizeof($Recup[$Taille])-1;

pourquoi 2 sizeof() ?

$Taille2 = 0;if(($size count($Recup[$Taille])) 0)
$Taille2 = $size-1;

Sinon c'est plutot bien codé... le code est propre, bien indenté et commenté... je n'ai pas testé le code et ne me suis pas penché sur la façon dont tu isole tes valeurs (preg/substr) mais ça à l'air de tenir la route... je met 8/10... .. .

@ tchaOo°
cs_8Tnerolf8 Messages postés 30 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 17 novembre 2009
15 juil. 2008 à 21:30
En fait, je ne stocke pas de html en bdd.
J'exploite une version améliorée de mon module "TRIE ET FILTRE UNIVERSEL DE REQUÊTES DANS UN FORMULAIRE À PARTIR DE SES CONTRÔLES". Cette version, au lieu d'afficher la page à la volée, stocke l'html généré dans une variable que j'exploite ensuite.
Donc, pour bénéficier de toutes les fonctionnalités offertes par ce module, je préfère extraire la valeur des champs inclus dans les <td> de la table générée plutôt que de me prendre la tête pour :
- Récupérer les données de la base
- Les formater comme je l'entends
- Trouver un moyen d'intégrer ça à mon module.

Le but de cette fonction est vraiment de faire du traitement par lot en fonction des lignes renvoyées.

Bonne soirée

Tnérolf
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
15 juil. 2008 à 21:13
Ok j'avais pas compris... dans ce cas je te pose une autre question... pourquoi stocker du html en bdd ? tu perd en espace de stockage donc au final en perf et surtout en souplesse... imaginons qu'un jour tu veuille rajouter une infos "couleur du caleçon" il faut que tu te retape tous tes membres "les 1 après les autres" pour rajouter une colonne... pourquoi ne pas stocker tes infos dans des champs séparés et les mettre en forme après... .. ?

Ou alors j'ai rien compris à ton explication... lol... .. .

@ tchaOo°
cs_8Tnerolf8 Messages postés 30 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 17 novembre 2009
15 juil. 2008 à 19:35
Bonsoir Kankrelune

Je n'utilise pas le DOM car :

- Je ne retiens pas toutes les valeurs renvoyées par la requête pour l'affichage. En effet, certaines sont présentes pour formater d'autres valeurs qui elles, seront affichées.
Exemple : Pour gérer les alliances dans mon jeu, le joueur a le choix d'afficher ou non son adresse mail dans les pages pour qu'on le contacte directement par ce biais. J'ai donc un champ booléen qui me permet de formater l'adresse du joueur soit en lien mailto, soit en un message "Ne veut pas communiquer son adresse". Le couple <td>...</td> associé à ce champ sera supprimé du html final de la table.

- J'ai un champ d'ID qui est constitué de la concaténation de l'adresse mail des joueurs. Or, pour des raisons de sécurité, je ne veux pas que l'on récupère leur adresse mail, surtout s'ils ont décidé de ne pas les afficher. Je les crypte donc pour qu'apparaisse dans la source l'ID cryptée que je décrypterai ultérieurement.

- J'ai un champ qui renvoie deux valeurs, soit 'Ami', soit 'Ennemi'. En fonction de cette valeur, je transforme le <td>[Ami|Ennemi]</td> en :

- Je ne suis pas très versé en DOM.

En espérant t'avoir correctement répondu, je te dis au revoir.

Tnérolf
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
15 juil. 2008 à 13:28
Salut... pourquoi ne pas utiliser DOM pour gérer tout ça... .. ?

@ tchaOo°
Rejoignez-nous