Scholieren.com forum

Scholieren.com forum (https://forum.scholieren.com/index.php)
-   Software & Hardware (https://forum.scholieren.com/forumdisplay.php?f=20)
-   -   [PHP] multidimensionale array's (https://forum.scholieren.com/showthread.php?t=1280593)

12Trix 07-10-2005 19:19

[PHP] multidimensionale array's
 
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?

Nigo 07-10-2005 20:09

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 :D
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.

12Trix 07-10-2005 21:07

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 :D
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.

Nigo 07-10-2005 21: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

12Trix 07-10-2005 21:57

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 :s


Alle tijden zijn GMT +1. Het is nu 21:17.

Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.