file_get_contents met get
Ik zit met een probleem.
Als ik file_get_contents gebruik werkt alles vb
$jsonmenu = file_get_contents('http://mijnwebsite.nl/menu.php');
Maar als ik dan vb ?id=5 toevoeg dan loopt het mis.
$jsonmenu = file_get_contents('http://mijnwebsite.nl/menu.php?id=5');
Hopelijk kunnen jullie me helpen.
Alvast bedankt
En wat gaat er mis?
dan krijg ik deze fout: Warning: Invalid argument supplied for foreach()
Kan je wat meer relevante code tonen? Want wat doet die foreach, en waar komt de verwachtte array vandaan?
als ik dan vb:
$jsonmenu = file_get_contents('http://swis.be/betacms/api/paginas.php?id=2');
doe dan werkt alles.
Gebruik ik onderstaande code dan loopt het mis
of geeft die remote url een foutmelding als het id niet klopt?
Wat als je de url rechtstreeks in een browser aanroept?
Toevoeging op 27/02/2015 12:18:44:
wel apart: in jouw code zit geen foreach, dus waar komt die fout dan vandaan?
of geeft die remote url een foutmelding als het id niet klopt?
Wat als je de url rechtstreeks in een browser aanroept?
Gezien ik geen foreach melding krijg in de remote-URL ga ik ervanuit dat Jeroen wat code vergeten is te posten.
http://swis.be/betacms/api/paginas.php?id=2
Dan werkt alles perfect.
Maars als ik dan die $webid gebruikt werkt het niet.
Hier kan u de volledige code vinden.
Alvast bedankt voor de hulp
Als ik de json lees via Dan werkt alles perfect.
Maars als ik dan die $webid gebruikt werkt het niet.
Hier kan u de volledige code vinden.
Alvast bedankt voor de hulp
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$webid ="2";
// Hier boven de nodige gegevns invullen
$naam = $_GET['naam'];
$jsonmenu = file_get_contents('http://swis.be/betacms/api/paginas.php?id="$webid"');
$json_datamenu = json_decode($jsonmenu, true);
function escape($in) {
return htmlspecialchars($in, ENT_QUOTES, 'UTF-8');
}
header('Content-Type: text/html; charset=UTF-8');
?><ul><?php
foreach ($json_datamenu as $menu) {
?><a href=""<li><a href="<? echo $websiteurl; ?>/index.php?naam=<?php echo escape($menu['naam']) ?>"><?php echo escape($menu['naam']) ?></a></li>
<?php
}
?></ul>
$webid ="2";
// Hier boven de nodige gegevns invullen
$naam = $_GET['naam'];
$jsonmenu = file_get_contents('http://swis.be/betacms/api/paginas.php?id="$webid"');
$json_datamenu = json_decode($jsonmenu, true);
function escape($in) {
return htmlspecialchars($in, ENT_QUOTES, 'UTF-8');
}
header('Content-Type: text/html; charset=UTF-8');
?><ul><?php
foreach ($json_datamenu as $menu) {
?><a href=""<li><a href="<? echo $websiteurl; ?>/index.php?naam=<?php echo escape($menu['naam']) ?>"><?php echo escape($menu['naam']) ?></a></li>
<?php
}
?></ul>
Gewijzigd op 27/02/2015 13:41:21 door Jeroen de wilde
Zet op regel 11 even iets van var_dump($json_datamenu); en kijk wat je krijgt, waarschijnlijk een lege array of var.
Warning: Cannot modify header information - headers already sent by
en in php wordt dat dan Array().
vreemd genoeg bij jou nog met een extra 0 erbij, maar dat zou aan het id kunnen liggen. Ik heb er een paar geprobeerd.
echter, ook op een leeg array zou geen error over foreach moeten ontstaan.
Krijg je na de warning nog meer meldingen? Want na zo'n header-already-sent, moet je script wel gewoon doorgaan.
Toevoeging op 27/02/2015 16:54:39:
als de url klopt: hier komt een lege array van terug: []
en in php wordt dat dan Array().
vreemd genoeg bij jou nog met een extra 0 erbij, maar dat zou aan het id kunnen liggen. Ik heb er een paar geprobeerd.
echter, ook op een leeg array zou geen error over foreach moeten ontstaan.
Krijg je na de warning nog meer meldingen? Want na zo'n header-already-sent, moet je script wel gewoon doorgaan.
Die moet je ook niet tussen enkele quotes zetten. ;-) Tussen enkele quotes vindt geen interpolatie van variabelen plaats. Ook niet als je die variabele dan weer tussen dubbele quotes zet. In dit geval komen die dubbele quotes rechtstreeks in je URL, en ik denk niet dat je dat wilt.
Dit zou dus wel moeten werken:
Code (php)
1
2
3
2
3
<?php
$jsonmenu = file_get_contents("http://swis.be/betacms/api/paginas.php?id=$webid");
?>
$jsonmenu = file_get_contents("http://swis.be/betacms/api/paginas.php?id=$webid");
?>
Gewijzigd op 27/02/2015 17:49:21 door Willem vp
Code (php)
1
2
3
2
3
<?php
$jsonmenu = file_get_contents('http://swis.be/betacms/api/paginas.php?id=' . $webid);
?>
$jsonmenu = file_get_contents('http://swis.be/betacms/api/paginas.php?id=' . $webid);
?>
*zucht* Is die snelheidsmythe ooit nog uit te roeien? Tot en met PHP 5.0 was er een significant performanceverschil tussen enkele en dubbele quotes, maar dat is opgelost in PHP 5.1. En versie 5.1 is alweer bijna 10 jaar oud.
De grap is, dat wanneer je meer dan 1 variabele hebt, interpolatie (dus het opnemen van de variabele binnen de quotes) zelfs iets sneller is dan concatenatie (het aan elkaar plakken met een punt). Dat komt doordat PHP bij elke concatenatie een nieuwe interne variabele gebruikt, terwijl bij interpolatie er steeds een stukje aan de bestaande interne variabele wordt geplakt. Oftewel: bij elke . die je gebruikt moet PHP de gehele string die tot dan toe is opgebouwd kopiëren naar een nieuw stuk geheugen. Hierdoor wordt de theoretische snelheidswinst die je krijgt doordat je de string niet hoeft te scannen op de aanwezige variabelen effectief ongedaan gemaakt.
Aangezien er dus geen praktisch snelheidsverschil is tussen het gebruik van enkele en dubbele quotes is het voornaamste argument om een van beiden te gebruiken de leesbaarheid. En zelf vind ik in het algemeen met elke concatenatie de leesbaarheid van de code afnemen.
Gewijzigd op 05/03/2015 19:00:04 door Willem vp
Vandaar ook het "niet noemenswaardig". (Waarmee ik bedoel te zeggen: op moderne systemen ga je het verschil niet merken)
> De grap is, dat wanneer je meer dan 1 variabele hebt, interpolatie (dus het opnemen van de variabele binnen de quotes) zelfs iets sneller is dan concatenatie.
Dat is een goeie, die wist ik nog niet. Weer wat geleerd.
Persoonlijk vind ik concatenatie leesbaarder vooral met syntax highlighting in de IDE die ik gebruik.
Maarja, dat is toch echt iets subjectiefs :)
> op moderne systemen ga je het verschil niet merken)
Op oude systemen ook niet. Als je in de archieven van deze site gaat spitten, zul je een post van mij tegenkomen uit 2005 waarin ik al aantoon dat er geen verschil is. En die benchmark heb ik destijds gedraaid op een 133 MHz Pentium uit 1996.
Vergeet dus het begrip snelheidsverschil (althans, in combinatie met quotes). Het is net zo onzinnig als te beweren dat het gebruiken van dubbele quotes beter is voor het milieu, aangezien een dubbele quote een paar extra zwarte pixels geeft op het beeldscherm, waardoor je monitor minder energie gebruikt en er dus minder CO2-uitstoot is. Die CO2-besparing is in dezelfde orde van grootte als de snelheidswinst waar je het over hebt.
> Persoonlijk vind ik concatenatie leesbaarder vooral met syntax highlighting in de IDE die ik gebruik.
Enkele quotes gebruiken omdat anders de syntax highlighting in je IDE niet werkt vind ik ook niet een heel erg doordachte strategie. Volgens mij betekent het meer dat je een gemankeerde IDE gebruikt. Als ik kijk naar mijn standaard editor (gvim) dan worden variabelen die tussen dubbele quotes staan netjes uitgelicht. Overigens ben ik van mening dat je geen IDE moet gebruiken voordat je minimaal een paar jaar programmeerervaring hebt. Leer eerst maar eens zelf nadenken voor je het je computer laat doen. ;-)
> Maarja, dat is toch echt iets subjectiefs :)
Daar zeg je het al: het is subjectief. En daarom vind ik het best wel irritant dat ik hier soms meerdere keren per dag een bericht lees van iemand die roept dat je enkele quotes *moet* gebruiken en dat er absoluut geen variabelen tussen quotes mogen staan. Kom op, we hebben het hier over basisfunctionaliteit van PHP. Waarom zou PHP het ondersteunen als je het niet mag gebruiken? Laat iedereen lekker voor zichzelf bepalen wat hij een prettige manier vindt om te werken. En vooral: omarm het TIMTOWTDI-principe (there's more than one way to do it). Als iemand een stuk code post dat niet goed werkt, dan is die persoon er niet mee geholpen als iedereen eerst als een halve autist alle variabelen buiten de quotes gaat halen en vervolgens nog een stuk of twintig niet ter zake doende dingen aan de code verandert, terwijl het probleem daarmee nog steeds niet opgelost wordt. Tuurlijk, soms kunnen dingen inderdaad handiger, maar probeer eerst gewoon eens te bedenken wat er nu precies gebeurt in die code en waarom dat niet oplevert wat ervan verwacht wordt. Ook voor jezelf is dat fijn, omdat je hersenen dan niet zoals normaal op de automatische piloot hun werk kunnen doen. Hersenen moet je blijven prikkelen, anders worden ze lui.
Maar goed, even terug on-topic: als ik naar de URL ga die gebruikt wordt in de aanroep van file_get_contents, dan krijg ik alleen "[]" te zien. Een leeg JSON-object dus, en dat klopt ook wel met het feit dat var_dump($json_datamenu) een lege array laat zien. De laatste post van de TS spreekt ook niet meer over het invalid argument dat aan foreach() wordt gevoerd. Tot zover krijg ik dus niet de indruk dat er iets mis is met de code (afgezien dan van het quote-issue dat ervoor zorgde dat $webid niet werd geïnterpoleerd).
Op basis van het codefragment dat getoond wordt kan ik de 'headers already sent'-melding niet verklaren. Dat betekent dus dat óf niet het volledige script is gepost, óf dat het script niet met <?php begint maar met bijvoorbeeld een spatie of een lege regel.