Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Stoc Smart CAM TV

Ce corzi de chitara sa cumpar?

Galaxy A54 compass defect?

Cumparare AC Gree [Buget maxim 30...
 Telekom

Ce e aratarea asta ?

Probleme timonerie schimbator sau...

Numar strada gresit in contractul...
 Centrala Ariston Cares Premium 24...

La multi ani @Klasse!

La multi ani @shmecherul!

pareri ipad 6-2018- flip
 Cum au aparut supermarketurile in...

Campanii mincinoase Carrefour

Tv toshiba defect

touchscreen navigatie stricat
 

PHP Bug?

- - - - -
  • Please log in to reply
19 replies to this topic

#1
puya4ever

puya4ever

    Active Member

  • Grup: Members
  • Posts: 1,987
  • Înscris: 21.12.2006
Salut.

În timp ce făceam un debugging la codul pe care îl am, să văd ce nu funcționează corect, am dat peste o eroare într-un switch, eroare care nu este logică și totuși se produce.

Poate greșesc eu, însă tind să cred că este eroare.

Ce ar trebui să afișeze următorul cod?

<?php


$var = 0;

switch($var){
	case 'aaa':
		die('aaa case');
		break;
	case 0:
		echo 'right way';	
		break;
		
}


#2
trackback

trackback

    Active Member

  • Grup: Members
  • Posts: 1,394
  • Înscris: 04.08.2011
$var este int.
intval('aaa') = 0;, deci primul caz din switch este satisfacut.

Cel putin asa vad eu.

Banuiesc ca pe ramura aia intra, nu ?

#3
puya4ever

puya4ever

    Active Member

  • Grup: Members
  • Posts: 1,987
  • Înscris: 21.12.2006
Da, pe ramura aia intră, dar de ce intval()? scrie undeva că în switch nu pot compara și stringuri? wtf?

#4
trackback

trackback

    Active Member

  • Grup: Members
  • Posts: 1,394
  • Înscris: 04.08.2011
Punand in switch ceva numeric ma gandesc acesta se compara cu valoarea numerica din case ' '. Valoarea numerica a lui 'aaa' fiind 0, ramane la acel caz.

#5
puya4ever

puya4ever

    Active Member

  • Grup: Members
  • Posts: 1,987
  • Înscris: 21.12.2006
edit: erori similare am găsit ?i în if, nu doar switch;

$var = 'asdf';

if($var == 0){
  //do something
}

iar codul din interiorul if-ului îmi era executat... Chiar atât de un-secure e compara?ia ==? Nu eram obi?nuit să folosesc compara?ii stricte, dar o voi face de acum încolo :)

Edit:

Ok, nu e bug, acum am în?eles, PHP face type-casting-ul ?i converte?te variabila în acela?i tip de date, pentru a o compara. În cazul nostru, var_dump((int) 'asdf'); este egal cu 0 ?i deci afirma?ia este adevărată.

Okey, problema la if se rezolvă prin compara?ie strictă, dar la switch?:) o po?i mu?ca rau de tot a?a..

Edited by puya4ever, 08 June 2012 - 00:29.


#6
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Dacă variabila aia decizională $var poate avea valori din diferite domenii (int, string), atunci ceva e greșit în aplicația ta.

#7
andronic312

andronic312

    Member

  • Grup: Members
  • Posts: 902
  • Înscris: 16.01.2009

View Postpuya4ever, on 8th June 2012, 01:27, said:

Okey, problema la if se rezolvă prin compara?ie strictă, dar la switch?:) o po?i mu?ca rau de tot a?a..

Merge si la switch.
<?php

$var = 0;

switch(true){
	case $var==='aaa':
		die('aaa case');
		break;
	case $var===0:
		echo 'right way';	
		break;	
}

:D

Edited by andronic312, 08 June 2012 - 08:33.


#8
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,477
  • Înscris: 10.08.2005
n-ar fi mai corect daca $var este numeric (matematic) sa-l transformi in string?
dupa care in switch $var sa folosesti string?

Edited by MarianG, 08 June 2012 - 09:06.


#9
puya4ever

puya4ever

    Active Member

  • Grup: Members
  • Posts: 1,987
  • Înscris: 21.12.2006

View PostOriginalCopy, on 8th June 2012, 07:15, said:

Dacă variabila aia decizională $var poate avea valori din diferite domenii (int, string), atunci ceva e greșit în aplicația ta.

Nu neaparat. Hai să-ți spun cum am ajuns să am variabilă decizională int și string.

La un proiect, am avut de creat un formular cu categorii-subgategorii, în așa fel încât, când apăsam pe radio box-ul ce reprezenta o categorie, mă redirecționa pe o altă pagină pe care se aflau radio box-uri ale subcategoriilor, apoi după ce alegeam subcategoria, mă redirecționa pe o altă pagină unde se aflau niște radio box-uri ce reprezentau niște locații.

Am numit toți acești pași "steps", și deci am avut $_GET['step'] = 1 pentru prima etapă, $_GET['step'] = 2, pentru a 2-a etapă ș.a.m.d.

După ce am scris întreg sistemul, la o anumită categorie, a trebuit să mai adaug un step, unic față de celelante. Am ales să denumesc step-ul ca (string).

Ce e greșit aici?:)

#10
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View Postpuya4ever, on 8th June 2012, 15:23, said:

Ce e greșit aici?:)
Inconsistența datelor. Ba ai un număr pentru categorie, ba ai un string pentru subcategorie. Ori o subcategorie este tot o categorie, deci calea ta în arbore ar trebui să fie un string, nu un număr, chiar și atunci când calea se oprește în capul arborelui.

#11
puya4ever

puya4ever

    Active Member

  • Grup: Members
  • Posts: 1,987
  • Înscris: 21.12.2006

View PostOriginalCopy, on 8th June 2012, 15:37, said:

Inconsistența datelor. Ba ai un număr pentru categorie, ba ai un string pentru subcategorie. Ori o subcategorie este tot o categorie, deci calea ta în arbore ar trebui să fie un string, nu un număr, chiar și atunci când calea se oprește în capul arborelui.

Nu e chiar un arbore de categorii/subcategorii. Mai există și "location", care e total diferit de categorii/subcategorii, are alte proprietăți. Apoi, dacă una/mai multe din acele categorii este selectată, un "o sub-etapă" va fi afișată, diferită față de etapele care sunt pentru celelante categorii. De asta am ales să numesc acea variabilă decizională un string, pentru că poartă chiar numele categoriei care este exceptată de la regulă. In fine, e umpic cam greu de explicat.. :)

#12
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Aha. Bine maestre, văd că știi tu ce știi. Deci problema a dispărut, asta mă bucură :)

#13
puya4ever

puya4ever

    Active Member

  • Grup: Members
  • Posts: 1,987
  • Înscris: 21.12.2006

View PostOriginalCopy, on 8th June 2012, 19:14, said:

Aha. Bine maestre, văd că știi tu ce știi. Deci problema a dispărut, asta mă bucură :)

ăsta a fost sarcasm? sau cum ar trebui s-o iau?:)

#14
egroeg

egroeg

    Junior Member

  • Grup: Members
  • Posts: 104
  • Înscris: 22.04.2005
Conform manualului

Quote

If you compare a number with a string or the comparison involves numerical strings, then each string is converted to a number and the comparison performed numerically. These rules also apply to the switch statement. The type conversion does not take place when the comparison is === or !== as this involves comparing the type as well as the value.


#15
SebastianSG

SebastianSG

    Junior Member

  • Grup: Members
  • Posts: 217
  • Înscris: 29.05.2012
Dacă te joci așa cu tipul variabilelor codul tău devine criptic, greu de întreținut, apar erori neașteptate, scade capacitatea de reutilizare a sa etc.

Orice cod ai, el ar putea fi scris și în C++ de exemplu, fără doar și poate. Ori acolo nu poți să schimbi tipul variabilelor așa cum te taie pe tine capul (mă rog, poți, dar e foarte anti-limbaj), și atunci e clar că tu ai o gaură logică în algoritmul folosit. Dacă codul tău rulează și dă rezultatul așteptat pentru cazurile testate nu înseamnă că este și bun. În practică, chestia asta reprezinta un foarte mic procent din calitatea codului :).

#16
puya4ever

puya4ever

    Active Member

  • Grup: Members
  • Posts: 1,987
  • Înscris: 21.12.2006

View PostSebastianSG, on 10th June 2012, 09:20, said:

Dacă te joci așa cu tipul variabilelor codul tău devine criptic, greu de întreținut, apar erori neașteptate, scade capacitatea de reutilizare a sa etc.

Orice cod ai, el ar putea fi scris și în C++ de exemplu, fără doar și poate. Ori acolo nu poți să schimbi tipul variabilelor așa cum te taie pe tine capul (mă rog, poți, dar e foarte anti-limbaj), și atunci e clar că tu ai o gaură logică în algoritmul folosit. Dacă codul tău rulează și dă rezultatul așteptat pentru cazurile testate nu înseamnă că este și bun. În practică, chestia asta reprezinta un foarte mic procent din calitatea codului :).

Chestia de mai sus, în tot codul are vreo 5-6 rânduri. E foarte ușor de mentenat/utilizat/schimbat/ce vrei tu. Am o variabilă decizională, căreia îi atribui un parametru din $_GET.

La început, sistemul a fost gândit, ca acest parametru să accepte doar (int), fiind de forma: $_GET['step'] = 1, $_GET['step'] = 2, s.a.m.d, iar la un moment dat, mi s-a cerut să creez un "step" special, căruia i-am dat nume un (string), mi s-a părut incorect să îi dau tot număr.

De aici și problema mea de mai sus :)

#17
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Și ai decis să îndeși "step" cu parametrul original într-o singură variabilă, pentru că dpv logistic cele două sunt același lucru, așa-i? :coolspeak:

Paradoxul este că tu însuți spui:

Quote

mi s-a cerut să creez un "step" special
tot ce ar trebui să faci ar fi să asculți ... ce zici tot tu :lol:

Dar încăpățânarea e mare.

#18
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,477
  • Înscris: 10.08.2005

View Postpuya4ever, on 10th June 2012, 15:48, said:

E foarte ușor de mentenat/utilizat/schimbat/ce vrei tu.

Am o variabilă decizională, căreia îi atribui un parametru din $_GET. **

La început, sistemul a fost gândit, ca acest parametru să accepte doar (int),

mi s-a cerut să creez un "step" special, căruia i-am dat nume un (string), mi s-a părut incorect să îi dau tot număr.

De aici și problema mea de mai sus :)
Eu am inteles urmatoarele
In limba romana nu exista notiunea de intretinere.
Datorita lipsei notiunii mai sus mentionate sistemul bine gandit a dat gres.
In loc sa faci ce ti se cere, ai ales sa fii lenes.
Intradevar, este foarte greu sa adaugi o variabila de tip string, dar este mai simplu sa adaugi redenumesti un intreg

Edited by MarianG, 10 June 2012 - 16:15.


Anunturi

Second Opinion Second Opinion

Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale.

Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate