[php] Clean coden... probeer het... maar wil niet

Pagina: 1
Acties:

  • capedro
  • Registratie: Oktober 2000
  • Laatst online: 20-05 09:15
Ik ben lekker aan het PHP-en... alles gaat perfect... en probeer alle errors op te vangen... Dus ik heb error_reporting(E_ALL); aanstaan ;)

Echter op het moment dat ik data uit een MySQL wil trekken komen er meldingen voorbij die ik niet kan opvangen op wat voor manier dan ook....
Oorspronkelijk heb ik er staan:
PHP:
1
<?$opmerkingen = htmlspecialchars( stripslashes($row["opmerkingen"]));?>

geeft
Warning: Undefined index: opmerkingen in /sites/vanvossen/private/lib/library.php on line 192

Dus dacht ik het op te lossen middels:
PHP:
1
<?if (isset(htmlspecialchars( stripslashes($row["opmerkingen"])))) {    $opmerkingen = htmlspecialchars( stripslashes($row["opmerkingen"]));} else {  $opmerkingen = "-";}?>

geeft de melding:
Parse error: parse error, expecting `T_VARIABLE' or `'$'' in /sites/vanvossen/private/lib/library.php on line 190

Nu snap ik die laatste error wel... maar heeft iemand een idee om het op te lossen... ik kan wel error_reporting(E_ALL); verwijderen... maar ik wil het gewoon error vrij hebben draaien :+

* capedro is niet veeleisend... hij wil het gewoon goed doen :+
De rest van de bijna 1100 regels draait perfect... ook met error_reporting(E_ALL);!!!

My weblog


Verwijderd

Het lijkt erop dat de array $row geen index 'opmerkingen' bevat (tenminste, dat geeft die error dus weer). Probeer eens handmatig die opmerkingen uit $row te halen, en kijk of dat wel werkt...

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

als je binnen de haakjes van je isset eens alleen je array zet, en niet ook nog al die andere functies, dan zal het een stuk beter gaan. Ikzelf gebruik altijd fetch_row en gebruik nooit een select *. Ik gebruik dus geen assisiatiefe arrays waneer ik resultsets uitlees..

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • capedro
  • Registratie: Oktober 2000
  • Laatst online: 20-05 09:15
Op dinsdag 18 juni 2002 15:33 schreef Janoz het volgende:
als je binnen de haakjes van je isset eens alleen je array zet, en niet ook nog al die andere functies, dan zal het een stuk beter gaan. Ikzelf gebruik altijd fetch_row en gebruik nooit een select *. Ik gebruik dus geen assisiatiefe arrays waneer ik resultsets uitlees..
Dat select * is ook nog iets wat ik uit een aantal regeltjes moet gaan slopen... |:(

My weblog


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Op dinsdag 18 juni 2002 15:33 schreef Dann-X het volgende:
Het lijkt erop dat de array $row geen index 'opmerkingen' bevat (tenminste, dat geeft die error dus weer). Probeer eens handmatig die opmerkingen uit $row te halen, en kijk of dat wel werkt...
Het is in php niet bekend of de array die index heeft. Hij kan best bestaan, maar je bent er niet zeker van. Vandaar deze foutmelding.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 12-02 15:52
PHP:
1
<?if ((isset ($row)) &amp;&amp; (is_array($row)) &amp;&amp; (isset ($row["opmerkingen"]))) {  $opmerkingen = htmlspecialchars (stripslashes ($row["opmerkingen"]));} else {  $opmerkingen = "-";} // else?>

Da's volgens mij de enige echt goeie manier. Hij moet 1) geset zijn 2) een array zijn en 3) een array-element "opmerkingen" hebben.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 07:54
Op dinsdag 18 juni 2002 15:40 schreef Janoz het volgende:
Het is in php niet bekend of de array die index heeft. Hij kan best bestaan, maar je bent er niet zeker van. Vandaar deze foutmelding.
Wat is dat nu weer voor onzin? Natuurlijk is at runtime wel bekend welke keys beschikbaar zijn. At compiletime natuurlijk niet, maar daar krijg je dan ook geen foutmelding over.

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 23:56
elviver:
Da's volgens mij de enige echt goeie manier. Hij moet 1) geset zijn 2) een array zijn en 3) een array-element "opmerkingen" hebben.
En volgens mij niet, want die 1e twee kun je weglaten, slechts op indexname controleren is voldoende.
Dann-X:
Het lijkt erop dat de array $row geen index 'opmerkingen' bevat (tenminste, dat geeft die error dus weer). Probeer eens handmatig die opmerkingen uit $row te halen, en kijk of dat wel werkt...
Sowiezo geldt de regel dat isset() geen foutmelding genereert, ook al bestaat een var/index niet. Anders zou het ook weinig zin hebben...

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Op dinsdag 18 juni 2002 15:44 schreef Soultaker het volgende:

[..]

Wat is dat nu weer voor onzin? Natuurlijk is at runtime wel bekend welke keys beschikbaar zijn. At compiletime natuurlijk niet, maar daar krijg je dan ook geen foutmelding over.
Met 'niet bekend' bedoel ik dat het script niet zeker kan weten of het is geset. Daardoor genereerd (met errorlevel lekker hoog) php daar een warning bij. Hetzelfde geld voor het opvragen van GET en POST vars zonder dit te checken of ze wel zijn geset.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 02-09 19:44

Gerco

Professional Newbie

Op dinsdag 18 juni 2002 15:30 schreef capedro het volgende:
Parse error: parse error, expecting `T_VARIABLE' or `'$'' in /sites/vanvossen/private/lib/library.php on line 190
Jullie hebben het allemaal BIJNA goed.

PHP verwacht dat je aan isset() een variabele meegeeft (oftewel een L_VALUE, vandaar T_VARIABLE), maar wat je eraan meegeeft is een R_VALUE (gewoon een waarde dus). Van een waarde (R_VALUE) kun je niet bepalen of 'ie geset is, tenminste het KAN wel, maar heeft geen betekenis.

Wat je nu doet is equivalent aan isset("somestring") en dat is natuurlijk zinloos. Wat je WIL doen is isset($row["blaat"]).

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

euhm gerco, lees deze nog eens:
Op dinsdag 18 juni 2002 15:33 schreef Janoz oa het volgende:
als je binnen de haakjes van je isset eens alleen je array zet, en niet ook nog al die andere functies, dan zal het een stuk beter gaan.....

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 07:54
Op dinsdag 18 juni 2002 19:51 schreef Janoz het volgende:
Met 'niet bekend' bedoel ik dat het script niet zeker kan weten of het is geset. Daardoor genereerd (met errorlevel lekker hoog) php daar een warning bij.
Dat lijkt (maar ik kan het fout hebben) me nog grote onzin. Een associatieve array is een associatieve array. Net zomin als PHP kan voorspellen wat voor waarden er ooit in een scalaire variabele, zal 'ie kunnen voorspellen wat er in een associatieve array komt te staan; of het nou om keys of values gaat.

Heb je anders een stukje broncode waarin je je punt illustreert?

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 12-02 15:52
Op dinsdag 18 juni 2002 17:10 schreef ddc het volgende:
[..]
En volgens mij niet, want die 1e twee kun je weglaten, slechts op indexname controleren is voldoende.
[..]
Eeh.. Geeft error_reporting(E_ALL) geen error dan? Zo van: je probeert iets te controleren of er een index opmerkingen in zit? Gaat ie dan niet over zijn nek van dat het bijvoorbeeld een MySQL-resource identifier is (ik noem maar wat) en geeft ie dan geen error?

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 23:56
elviver:
Eeh.. Geeft error_reporting(E_ALL) geen error dan? Zo van: je probeert iets te controleren of er een index opmerkingen in zit? Gaat ie dan niet over zijn nek van dat het bijvoorbeeld een MySQL-resource identifier is (ik noem maar wat) en geeft ie dan geen error?
Ja waarschijnlijk wel, maar je bent wel een kneus als je zo fout code... 8-)

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 02-09 19:44

Gerco

Professional Newbie

Op dinsdag 18 juni 2002 22:04 schreef Janoz het volgende:
euhm gerco, lees deze nog eens:
Sorry, overheen gelezen, hij is inderdaad goed, alleen vreemd dat niemand erop lette :P

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op dinsdag 18 juni 2002 23:58 schreef Soultaker het volgende:
Dat lijkt (maar ik kan het fout hebben) me nog grote onzin. Een associatieve array is een associatieve array. Net zomin als PHP kan voorspellen wat voor waarden er ooit in een scalaire variabele, zal 'ie kunnen voorspellen wat er in een associatieve array komt te staan; of het nou om keys of values gaat.

Heb je anders een stukje broncode waarin je je punt illustreert?
Deze code:
code:
1
echo $blaat;

Mag jij uitvoeren met error_reporting(E_ALL);
De code is syntactisch correct volgens de interpreter/compiler/etc, maar de var $blaat bestaat niet en dus komt er een warning.

Deze code gaat natuurlijk wel goed:
code:
1
2
$blaat = 'bla';
echo $blaat;

Verhaal heeft verder niets te maken met array's daar gaat het net zo slecht/goed mee.

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 12-02 15:52
Op woensdag 19 juni 2002 06:57 schreef ddc het volgende:
[..]
Ja waarschijnlijk wel, maar je bent wel een kneus als je zo fout code... 8-)
Klopt als een bus :) Maar als je het echt zó safe wil hebben.. :)

Tsja.. Wanneer moet je dat nou controleren is de vraag..
PHP:
1
<?$iets = array ("een", "twee", "drie");$iets[2] .= "Hallo";?>

Dat werkt natuurlijk gewoon en direct. Één regel ervoor heb je dat $iets geset.. Dan controleer je dat natuurlijk niet.
PHP:
1
<?$result = myqsl_query ("SELECT kolom FROM tabel");while ($temp = mysql_fetch_row ($result)) {  $row[] = $temp[0];} // whileprint "Er zaten " . count($row) . " records in de tabel";?>

Hier wéét je dat $row een array is, MITS er records in de tabel zaten. Als die er niet inzaten, is $row niet geset. Dus dát moet je wel controleren.

Dit zijn 2 iets te logische voorbeelden. Ik heb functies waar ik niet 100% zeker van ben wat eruit terug komt. Nadat ik een variabele iets heb toegekend ($var = functie();) en ik hoop dat het een array is, controleer is het wel altijd op die manier:
PHP:
1
<?if ((isset($var)) &amp;&amp; (is_array($var)) &amp;&amp; (isset($var["index"]))) { commands(); }?>

Dat ís toch de veiligste manier..
Pagina: 1