file_get_contents met get

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jeroen de wilde

Jeroen de wilde

27/02/2015 11:18:45
Quote Anchor link
Beste,

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
 
PHP hulp

PHP hulp

25/12/2024 13:58:12
 
- Ariën  -
Beheerder

- Ariën -

27/02/2015 11:20:52
Quote Anchor link
En wat gaat er mis?
 
Jeroen de wilde

Jeroen de wilde

27/02/2015 11:31:41
Quote Anchor link
dan krijg ik deze fout: Warning: Invalid argument supplied for foreach()
 
- Ariën  -
Beheerder

- Ariën -

27/02/2015 11:33:39
Quote Anchor link
Kan je wat meer relevante code tonen? Want wat doet die foreach, en waar komt de verwachtte array vandaan?
 
Jeroen de wilde

Jeroen de wilde

27/02/2015 12:00:13
Quote Anchor link
Ik denk dat de fout bij $webid licht.
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
$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);
 
Ivo P

Ivo P

27/02/2015 12:14:34
Quote Anchor link
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?

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?
 
- Ariën  -
Beheerder

- Ariën -

27/02/2015 12:24:59
Quote Anchor link
Gezien ik geen foreach melding krijg in de remote-URL ga ik ervanuit dat Jeroen wat code vergeten is te posten.
 
Jeroen de wilde

Jeroen de wilde

27/02/2015 13:40:34
Quote Anchor link
Als ik de json lees via 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

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>
Gewijzigd op 27/02/2015 13:41:21 door Jeroen de wilde
 
- wes  -

- wes -

27/02/2015 14:44:42
Quote Anchor link
Zet op regel 11 even iets van var_dump($json_datamenu); en kijk wat je krijgt, waarschijnlijk een lege array of var.
 
Jeroen de wilde

Jeroen de wilde

27/02/2015 16:02:41
Quote Anchor link
Dan krijg ik deze foutmelding: array(0) { }
Warning: Cannot modify header information - headers already sent by
 
Ivo P

Ivo P

27/02/2015 16:54:15
Quote Anchor link
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.

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.
 
Willem vp

Willem vp

27/02/2015 17:44:05
Quote Anchor link
> Maars als ik dan die $webid gebruikt werkt het niet.

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$jsonmenu
= file_get_contents("http://swis.be/betacms/api/paginas.php?id=$webid");
?>
Gewijzigd op 27/02/2015 17:49:21 door Willem vp
 
Thom nvt

Thom nvt

02/03/2015 08:38:16
Quote Anchor link
Of nog netter (en ietsje sneller, maar niet noemenswaardig):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$jsonmenu
= file_get_contents('http://swis.be/betacms/api/paginas.php?id=' . $webid);
?>
 
Willem vp

Willem vp

05/03/2015 18:58:14
Quote Anchor link
> en ietsje sneller, maar niet noemenswaardig

*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
 
Thom nvt

Thom nvt

06/03/2015 08:32:11
Quote Anchor link
> *zucht* Is die snelheidsmythe ooit nog uit te roeien
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 :)
 
Willem vp

Willem vp

07/03/2015 01:14:15
Quote Anchor link
> Vandaar ook het "niet noemenswaardig". (Waarmee ik bedoel te zeggen:
> 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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.