Registreer FAQ Berichten van vandaag


Ga terug   Scholieren.com forum / Technologie / Software & Hardware
Reageren
 
Topictools Zoek in deze topic
Oud 07-10-2005, 19:19
Verwijderd
Hallo,

Ik probeer XML code in boomstructuur op te slaan, maar krijg telkens de foutmelding:
Citaat:
Fatal error: Cannot use string offset as an array in D:\blaat.php(64) : eval()'d code on line 1
Hieronder staat de probleemcode:
Code:
$s = "['blabla']['hoi']['hallo']";
$cdata = 'blaat';
eval('$xmltree' . $s . ' = $cdata; ');
Zonder eval mag ik gewoon schrijven:
Code:
$xmltree['blabla']['hoi'] = "blaaaat";
Maar met eval mag dat ineens niet meer... Doe ik iets fout?
Met citaat reageren
Advertentie
Oud 07-10-2005, 20:09
Verwijderd
Citaat:
12Trix schreef op 07-10-2005 @ 20:19 :
Hallo,

Ik probeer XML code in boomstructuur op te slaan, maar krijg telkens de foutmelding:


Hieronder staat de probleemcode:
Code:
$s = "['blabla']['hoi']['hallo']";
$cdata = 'blaat';
eval('$xmltree' . $s . ' = $cdata; ');
Zonder eval mag ik gewoon schrijven:
Code:
$xmltree['blabla']['hoi'] = "blaaaat";
Maar met eval mag dat ineens niet meer... Doe ik iets fout?
Het feit dat je hier eval gebruikt is niet verstandig en vooral onnodig. Stel ik schrijf een XML document en ik gebruik voor de tagnamen/waarden gewoon php code dan wordt die door jouw eval gewoon uitgevoerd. Kun je nare dingen mee uithalen
Je kunt wat je wil bewerkstelligen ook bereiken door de SAX parser te gebruiken van PHP of nog beter, de XML DOM parser. Laatstgenoemde doet in 1x wat je wil.

Waarom eval overigens hier niet werkt is o.a. omdat je single quotjes gebruikt bij eval. Er is een verschil tussen ' en " namelijk dat eerstgenoemde statisch parsed en laatstgenoemde dynamisch. Probeer eens $foo = "bla"; print("$foo"); print('$foo');
Het verschil moet dan wel duidelijk worden.
Met citaat reageren
Oud 07-10-2005, 21:07
Verwijderd
Citaat:
Ninh schreef op 07-10-2005 @ 21:09 :
Het feit dat je hier eval gebruikt is niet verstandig en vooral onnodig. Stel ik schrijf een XML document en ik gebruik voor de tagnamen/waarden gewoon php code dan wordt die door jouw eval gewoon uitgevoerd. Kun je nare dingen mee uithalen
Je kunt wat je wil bewerkstelligen ook bereiken door de SAX parser te gebruiken van PHP of nog beter, de XML DOM parser. Laatstgenoemde doet in 1x wat je wil.

Waarom eval overigens hier niet werkt is o.a. omdat je single quotjes gebruikt bij eval. Er is een verschil tussen ' en " namelijk dat eerstgenoemde statisch parsed en laatstgenoemde dynamisch. Probeer eens $foo = "bla"; print("$foo"); print('$foo');
Het verschil moet dan wel duidelijk worden.
Het gaat hier gewoon om de XML statistieken van Azureus, en het is voor privé gebruik. Dus beveiliging speelt hier geen rol.

Ik weet het verschil tussen dubbele en enkele aanhalingstekens. Bij dubbele aanhalingstekens worden variabelen bijv. ook omgezet, terwijl bij enkele aanhalingstekens je de naam van de variabele ziet.

In dit geval is dus enkele aanhalingstekens wel degelijk de juiste keuze.

Ik wist dat het ook volledig door PHP zelf gedaan kon worden. Ik wou het alleen op mijn manier doen, en stuitte dus op het vermelde probleem, waarop ik helaas nog steeds geen antwoord op heb kunnen vinden.

Maar ik vind wel een andere weg om het als boomstructuur op te slaan.
Met citaat reageren
Oud 07-10-2005, 21:24
Verwijderd
Sorry, iets te haastig overheen gelezen. Hoe dan ook, hier werkt het gewoon:

PHP-code:
<?php

    error_reporting
(E_ALL);
    
    
$s "['blabla']['hoi']['hallo']";
    
$cdata 'blaat';
    eval(
'$xmltree' $s ' = $cdata; ');
    
    
    
print_r($xmltree);
?>
Geeft:

Code:
Array
(
    [blabla] => Array
        (
            [hoi] => Array
                (
                    [hallo] => blaat
                )

        )

)
Apache 2 .0.52 (Win32) PHP/5.0.3
Met citaat reageren
Oud 07-10-2005, 21:57
Verwijderd
Citaat:
Ninh schreef op 07-10-2005 @ 22:24 :
Sorry, iets te haastig overheen gelezen. Hoe dan ook, hier werkt het gewoon:

PHP-code:
<?php

    error_reporting
(E_ALL);
    
    
$s "['blabla']['hoi']['hallo']";
    
$cdata 'blaat';
    eval(
'$xmltree' $s ' = $cdata; ');
    
    
    
print_r($xmltree);
?>
Geeft:

Code:
Array
(
    [blabla] => Array
        (
            [hoi] => Array
                (
                    [hallo] => blaat
                )

        )

)
Apache 2 .0.52 (Win32) PHP/5.0.3
Raar, bij mij werkt het niet, en ik heb versie 5.0.4 van PHP
Met citaat reageren
Advertentie
Reageren


Regels voor berichten
Je mag geen nieuwe topics starten
Je mag niet reageren op berichten
Je mag geen bijlagen versturen
Je mag niet je berichten bewerken

BB code is Aan
Smileys zijn Aan
[IMG]-code is Aan
HTML-code is Uit

Spring naar


Alle tijden zijn GMT +1. Het is nu 10:24.