[PHP] Bestand downloaden met PHP

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo allemaal,

Ik wil graag een script schrijven met PHP om een bestand te laten downloaden. Hieronder staat het script:

PHP:
1
2
3
4
5
6
7
8
9
<?php
$nu = date(G);
$dag = date(d);
$path = '/server/www/teletekst/' . $dag;
if ($nu==18) {
exec('mkdir $path');
system('cd $path | wget http://teletekst.nos.nl/gif/images/711-02.gif', $result);
echo $result;
?>


Ik krijg nu de hele tijd twee errors:
1) mkdir functie heeft niet genoeg rechten om de map te maken --> ik heb de rechten gezet op 777, dus het script en de map hebben de maximale rechten. Ik snap dus niet waarom het niet werkt.
2) Het downloaden van het bestand werkt ook niet, want ik krijg als foutcode '1', en het bestand is niet gedownload.

Weet iemand of het aan de configuratie van PHP ligt, of aan het script zelf? Ik ben niet heel erg goed met PHP, maar volgens mij zou dit moeten werken. Ik weet dat het niet erg goed gescript is, maar het ging me er puur om dat het zou werken.

Alvast bedankt,
Viktor

Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Laatst online: 18:54
Verwijderd schreef op dinsdag 14 april 2009 @ 18:28:
Hallo allemaal,

Ik wil graag een script schrijven met PHP om een bestand te laten downloaden. Hieronder staat het script:

PHP:
1
2
3
4
5
6
7
8
9
<?php
$nu = date(G);
$dag = date(d);
$path = '/server/www/teletekst/' . $dag;
if ($nu==18) {
exec('mkdir $path');
system('cd $path | wget http://teletekst.nos.nl/gif/images/711-02.gif', $result);
echo $result;
?>


Ik krijg nu de hele tijd twee errors:
1) mkdir functie heeft niet genoeg rechten om de map te maken --> ik heb de rechten gezet op 777, dus het script en de map hebben de maximale rechten. Ik snap dus niet waarom het niet werkt.
2) Het downloaden van het bestand werkt ook niet, want ik krijg als foutcode '1', en het bestand is niet gedownload.

Weet iemand of het aan de configuratie van PHP ligt, of aan het script zelf? Ik ben niet heel erg goed met PHP, maar volgens mij zou dit moeten werken. Ik weet dat het niet erg goed gescript is, maar het ging me er puur om dat het zou werken.

Alvast bedankt,
Viktor
READ,WRITE,EXECUTE wil nog niet zeggen dat iemand mappen mag maken. Met de -r attribuut kan dit wel dacht ik.

Voor de rest is het date('g') ipv date(g) dacht ik?

Acties:
  • 0 Henk 'm!

  • Icekiller2k6
  • Registratie: Februari 2005
  • Laatst online: 18:29
hmm

ik zou persoonlijk werken met file get contents en dan wegschrijven naar een bestand.. veel makkelijker & meer 'php' dan system calls oproepen.. (kan vb zijn dat het een windows toestel is etc..)

MT Venus E 5KW (V151) P1 HomeWizard | Hackerspace Brixel te Hasselt (BE) - http://www.brixel.be | 9800X3D, 96GB DDR5 6000MHZ, NVIDIA GEFORCE 4090, ASRock X670E Steel Legend, Seasonic GX1000


Acties:
  • 0 Henk 'm!

  • Little Penguin
  • Registratie: September 2000
  • Laatst online: 08-06 20:43
Volgens mij kun je 't beter zo doen:
PHP:
1
2
3
4
5
6
7
$a = file($httplink); // bijvoorbeeld http://tweakers.net/

$fp = fopen("public/doelbestand.txt", "a+");
for ($i = 0 ; $i < count($a); $i++) {
  fputs($fp, $a[$i]);
}
fclose($fp);


Niet gecheckt of 't ook werkt 't is pseudocode zogezegd :) - Het werkt wel degelijk, maar is niet direct voor jouw doel geschikt :X

Het idee kun je echter wel gebruiken, alleen moet je geen gebruik maken van file - dat is namelijk om de boel in een array te plempen en wat jij wilt is het binair benaderen van bestanden...

[ Voor 65% gewijzigd door Little Penguin op 14-04-2009 18:46 ]


Acties:
  • 0 Henk 'm!

  • Exception
  • Registratie: Augustus 2006
  • Laatst online: 17-09 11:10
Draai je het op een Windows of op een Linux bak? Volgens mij is de functie exec namelijk afhankelijk van het OS. Net als wget een Linux commando is.

Acties:
  • 0 Henk 'm!

  • Little Penguin
  • Registratie: September 2000
  • Laatst online: 08-06 20:43
Exception schreef op dinsdag 14 april 2009 @ 18:47:
Draai je het op een Windows of op een Linux bak? Volgens mij is de functie exec namelijk afhankelijk van het OS. Net als wget een Linux commando is.
Er wordt gesproken over 'chmod 777' -> ofwel Linux of een ander Unix(-like) besturingssysteem. :z

Acties:
  • 0 Henk 'm!

  • Deikke
  • Registratie: Juni 2004
  • Laatst online: 06:44
Is cd wel een commando die door exec kan worden uitgevoerd? Dit is namelijk een shell commando, niet een programma.

Om de huidige map te veranderen kun je chdir gebruiken in php.

Acties:
  • 0 Henk 'm!

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Gebruik geen system/exec meuk maar gebruik gewoon de PHP native functies.

PHP heeft ook de functies:
mkdir
chmod
chown

Om te downloaden, gebruik geen file, file_get_contents ofzo, maar gebruik CURL. Zie bijvoorbeeld: http://davidwalsh.name/download-urls-content-php-curl

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Icekiller2k6 schreef op dinsdag 14 april 2009 @ 18:31:
hmm

ik zou persoonlijk werken met file get contents en dan wegschrijven naar een bestand.. veel makkelijker & meer 'php' dan system calls oproepen.. (kan vb zijn dat het een windows toestel is etc..)
Het is een Linux bak, het script hoeft alleen daarop te worden uitgevoerd.
Exception schreef op dinsdag 14 april 2009 @ 18:47:
Draai je het op een Windows of op een Linux bak? Volgens mij is de functie exec namelijk afhankelijk van het OS. Net als wget een Linux commando is.
Linux dus :P
eghie schreef op dinsdag 14 april 2009 @ 18:57:
Gebruik geen system/exec meuk maar gebruik gewoon de PHP native functies.

PHP heeft ook de functies:
mkdir
chmod
chown

Om te downloaden, gebruik geen file, file_get_contents ofzo, maar gebruik CURL. Zie bijvoorbeeld: http://davidwalsh.name/download-urls-content-php-curl
Bedankt, hier ga ik mee aan de slag!
RedHat schreef op dinsdag 14 april 2009 @ 18:30:
[...]

READ,WRITE,EXECUTE wil nog niet zeggen dat iemand mappen mag maken. Met de -r attribuut kan dit wel dacht ik.

Voor de rest is het date('g') ipv date(g) dacht ik?
Ok, kun je mij uitleggen hoe ik kan zorgen dat de map wel wordt aangemaakt?

Alvast bedankt voor de snelle reacties.

Acties:
  • 0 Henk 'm!

  • Flipke84
  • Registratie: Juli 2008
  • Laatst online: 09-11-2024
Verwijderd schreef op dinsdag 14 april 2009 @ 19:05:

Ok, kun je mij uitleggen hoe ik kan zorgen dat de map wel wordt aangemaakt?
Een nieuwe map kun je aanmaken met de volgende code:

PHP:
1
2
3
4
5
6
7
$dag = date('d');
$path = '/server/www/teletekst/' . $dag; 

if(!is_dir($path))
{
    mkdir($path);
}

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Flipke84 schreef op dinsdag 14 april 2009 @ 19:08:
[...]


Een nieuwe map kun je aanmaken met de volgende code:

PHP:
1
2
3
4
5
6
7
$dag = date('d');
$path = '/server/www/teletekst/' . $dag; 

if(!is_dir($path))
{
    mkdir($path);
}
Ik heb het geprobeerd, maar nog steeds krijg ik dit als return:
Warning: mkdir() [function.mkdir]: Permission denied in /server/www/teletekst.php on line 9

Acties:
  • 0 Henk 'm!

  • Flipke84
  • Registratie: Juli 2008
  • Laatst online: 09-11-2024
En wat staat er bij jouw op lijn 9?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Flipke84 schreef op dinsdag 14 april 2009 @ 19:18:
En wat staat er bij jouw op lijn 9?
Dit:
code:
1
mkdir($path);

Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
eghie schreef op dinsdag 14 april 2009 @ 18:57:
Om te downloaden, gebruik geen file, file_get_contents ofzo, maar gebruik CURL. Zie bijvoorbeeld: http://davidwalsh.name/download-urls-content-php-curl
Waarom is dat volgens jou dan beter? Het is sowieso geen standaard onderdeel van PHP.

Acties:
  • 0 Henk 'm!

  • Flipke84
  • Registratie: Juli 2008
  • Laatst online: 09-11-2024
Verwijderd schreef op dinsdag 14 april 2009 @ 19:16:
Warning: mkdir() [function.mkdir]: Permission denied in /server/www/teletekst.php on line 9
Welke rechten heb je op de /server/www/ map?

Acties:
  • 0 Henk 'm!

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Noork schreef op dinsdag 14 april 2009 @ 19:24:
[...]

Waarom is dat volgens jou dan beter? Het is sowieso geen standaard onderdeel van PHP.
Omdat er best wat hosts zijn die allow-url-fopen uit hebben staan. Nu willen die hosts vaak makkelijker CURL installeren dan die setting op true zetten.

Acties:
  • 0 Henk 'm!

  • Little Penguin
  • Registratie: September 2000
  • Laatst online: 08-06 20:43
Noork schreef op dinsdag 14 april 2009 @ 19:24:
[...]

Waarom is dat volgens jou dan beter? Het is sowieso geen standaard onderdeel van PHP.
cURL is een library dat juist tot doel heeft om (gemakkelijk) bestanden te downloaden, dat daar ook een PHP-extensie rond gebouwd is had ik moeten bedenken. O-)

Native PHP is het meest portable, maar levert wel weer extra PHP-afhandeling op. Als je al dit soort zaken uitbesteed aan cURL hoef je over een aantal zaken niet meer na te denken...

Acties:
  • 0 Henk 'm!

Verwijderd

eghie schreef op dinsdag 14 april 2009 @ 18:57:
Gebruik geen system/exec meuk maar gebruik gewoon de PHP native functies.

PHP heeft ook de functies:
mkdir
chmod
chown

Om te downloaden, gebruik geen file, file_get_contents ofzo, maar gebruik CURL. Zie bijvoorbeeld: http://davidwalsh.name/download-urls-content-php-curl
Waarom nou voor system calls native functies gebruiken en voor file functies niet ;), doe het gewoon met file_get_contents, die doet praktisch hetzelfde als bovenstaande voorbeelden en voldoet bijna altijd.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Flipke84 schreef op dinsdag 14 april 2009 @ 19:27:
[...]


Welke rechten heb je op de /server/www/ map?
Ehm, nu moet ik toch bekennen dat ik een kapitale fout heb gemaakt... De rechten stonden 755, niet op 775 8)7 zoals ik dacht, verkeerd gelezen. (trouwens erg onnodig en onveilig voor de document root map :P. Dit was maar een deel van het probleem, maar ik heb echt jullie voor zitten liegen hier, mijn excuses daarvoor. Het werkt nu allemaal perfect! Hier is het:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$nu = date(G);
$dag = date(d);
$path = '/server/www/nlt/' . $dag .'-'.$nu;
if (!is_dir($path)) {
mkdir($path);
chdir($path);
system('curl http://teletekst.nos.nl/gif/images/711-01.gif --O smog-01.gif');
system('curl http://teletekst.nos.nl/gif/images/711-02.gif --O smog-02.gif');
system('curl http://teletekst.nos.nl/gif/images/711-03.gif --O smog-03.gif');
}
else
{
chdir($path);
system('curl http://teletekst.nos.nl/gif/images/711-01.gif --O smog-01.gif');
system('curl http://teletekst.nos.nl/gif/images/711-02.gif --O smog-02.gif');
system('curl http://teletekst.nos.nl/gif/images/711-03.gif --O smog-03.gif');
}
?>


Het stond nu in de web map, maar het script moet eigenlijk worden gestart door middel van een cronjob om 10 uur 's ochtends en om tien uur 's avonds. De reden was dat ik een school opdracht wat wilde automatiseren :P.

Nogmaals sorry voor het de vergeefse moeite. Ik heb weer erg veel bijgeleerd vandaag. Bedankt!

Acties:
  • 0 Henk 'm!

  • Little Penguin
  • Registratie: September 2000
  • Laatst online: 08-06 20:43
Niet dat de methode die je nu gebruikt fout is, maar zoals je het nu doet dat had je ook met wget kunnen bereiken.

code:
1
2
3
4
5
wget http://teletekst.nos.nl/gif/images/711-01.gif -O smog-01.gif

of:

wget http://teletekst.nos.nl/gif/images/711-01.gif -O directory/smog-01.gif

De syntaxis heeft ook nog eens wat overeenkomsten :), dat laatste [edit: saven naar directory dus] moet volgens mij ook met de cURL CLI aanroep mogelijk zijn overigens...

De referenties naar cURL waren volgens mij vooral bedoeld om je naar cURLLib te sturen, maar goed dit werkt ook en: "Whatever floats your boat" O-)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Little Penguin schreef op dinsdag 14 april 2009 @ 22:08:
Niet dat de methode die je nu gebruikt fout is, maar zoals je het nu doet dat had je ook met wget kunnen bereiken.

code:
1
2
3
4
5
wget http://teletekst.nos.nl/gif/images/711-01.gif -O smog-01.gif

of:

wget http://teletekst.nos.nl/gif/images/711-01.gif -O directory/smog-01.gif

De syntaxis heeft ook nog eens wat overeenkomsten :), dat laatste [edit: saven naar directory dus] moet volgens mij ook met de cURL CLI aanroep mogelijk zijn overigens...

De referenties naar cURL waren volgens mij vooral bedoeld om je naar cURLLib te sturen, maar goed dit werkt ook en: "Whatever floats your boat" O-)
Ja je hebt gelijk. Ik ga het later uitpluizen, maar het ging me er nu om dat ik het zo snel mogelijk aan de praat zou krijgen. :)

Acties:
  • 0 Henk 'm!

  • thegve
  • Registratie: Februari 2004
  • Laatst online: 17-09 08:23
Waarom doe je dit niet gewoon met file_get_contents en file_put_contents. Dan hoef je geen externe commando's aan te roepen, is wat korter en voor mijn gevoel minder storingsgevoelig.
Moet je wel allow_url_fopen (uit mijn hoofd, zoiets) aan hebben staan, maar das iig default volgens mij.
PHP:
1
2
3
4
5
6
7
$contents = file_get_contents('http://www.de-url-op-teletekst');
if( $contents === false ) {
    echo 'stuk';
    exit();
} else {
    file_put_contents('plaatje1.gif',$contents);
}

Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 20-09 17:02
thegve schreef op dinsdag 14 april 2009 @ 23:23:
Waarom doe je dit niet gewoon met file_get_contents en file_put_contents. ...
Don´t fix things that ain´t broken. Als de huidige oplossing werkt, dan is dat volgens mij prima, het is een goede methode. Als het script ook nog enigzins portable moet zijn en ook op bijvoorbeeld windows servers moet kunnen draaien, dan moet je het wel aanpassen. Naar mijn ervaring zijn er behoorlijk wat hosts die allow_url_fopen uit hebben staan. Een robuust en portable script checked vooraf welke methoden er aanwezig zijn (allow_url_fopen, curl, sockets, rechten om een exec te doen, etc) en gebruikt vervolgens de meest voor de hand liggende.

Als het scipt enkel op de huidige server moet werken en het werkt goed: bespaar je dan de moeite.

[ Voor 20% gewijzigd door doeternietoe op 15-04-2009 08:39 ]


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Nu online

Creepy

Tactical Espionage Splatterer

RedHat schreef op dinsdag 14 april 2009 @ 18:30:
[...]

READ,WRITE,EXECUTE wil nog niet zeggen dat iemand mappen mag maken. Met de -r attribuut kan dit wel dacht ik.
Het r attribute? Dat is het READ attribute ;)

Je hebt write rechten nodig op de directory waar je een nieuwe directory in wilt maken.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
doeternietoe schreef op woensdag 15 april 2009 @ 08:36:
[...]
Don´t fix things that ain´t broken
Prima vuistregel, behalve als je nu nog aan het implementeren bent. Nu je het fris in je geheugen hebt en het nog aan het testen bent, is het juist een prima idee om voor standaard functies en leesbaarheid te gaan. :)

Overigens ook in het kader van leesbaarheid: enkel de mkdir() call hoeft uit gevoerd te worden als !is_dir(), de rest gewoon onconditioneel eronder. ;)

{signature}


Acties:
  • 0 Henk 'm!

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 16-08 21:48

TheLunatic

Ouwe boxen.

Verwijderd schreef op dinsdag 14 april 2009 @ 20:00:
[...]


Ehm, nu moet ik toch bekennen dat ik een kapitale fout heb gemaakt... De rechten stonden 755, niet op 775 8)7 zoals ik dacht, verkeerd gelezen. (trouwens erg onnodig en onveilig voor de document root map :P. Dit was maar een deel van het probleem, maar ik heb echt jullie voor zitten liegen hier, mijn excuses daarvoor. Het werkt nu allemaal perfect! Hier is het:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$nu = date(G);
$dag = date(d);
$path = '/server/www/nlt/' . $dag .'-'.$nu;
if (!is_dir($path)) {
mkdir($path);
chdir($path);
system('curl http://teletekst.nos.nl/gif/images/711-01.gif --O smog-01.gif');
system('curl http://teletekst.nos.nl/gif/images/711-02.gif --O smog-02.gif');
system('curl http://teletekst.nos.nl/gif/images/711-03.gif --O smog-03.gif');
}
else
{
chdir($path);
system('curl http://teletekst.nos.nl/gif/images/711-01.gif --O smog-01.gif');
system('curl http://teletekst.nos.nl/gif/images/711-02.gif --O smog-02.gif');
system('curl http://teletekst.nos.nl/gif/images/711-03.gif --O smog-03.gif');
}
?>


Het stond nu in de web map, maar het script moet eigenlijk worden gestart door middel van een cronjob om 10 uur 's ochtends en om tien uur 's avonds. De reden was dat ik een school opdracht wat wilde automatiseren :P.

Nogmaals sorry voor het de vergeefse moeite. Ik heb weer erg veel bijgeleerd vandaag. Bedankt!
Waarom niet:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php 
  $nu = date(G); 
  $dag = date(d); 
  $path = '/server/www/nlt/' . $dag .'-'.$nu; 
  if (!is_dir($path)) { 
    mkdir($path); 
  } 
  chdir($path); 
  system('curl http://teletekst.nos.nl/gif/images/711-01.gif --O smog-01.gif'); 
  system('curl http://teletekst.nos.nl/gif/images/711-02.gif --O smog-02.gif'); 
  system('curl http://teletekst.nos.nl/gif/images/711-03.gif --O smog-03.gif'); 
?>

Mother, will they like this song?


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voutloos schreef op woensdag 15 april 2009 @ 09:03:
[...]
Prima vuistregel, behalve als je nu nog aan het implementeren bent. Nu je het fris in je geheugen hebt en het nog aan het testen bent, is het juist een prima idee om voor standaard functies en leesbaarheid te gaan. :)

Overigens ook in het kader van leesbaarheid: enkel de mkdir() call hoeft uit gevoerd te worden als !is_dir(), de rest gewoon onconditioneel eronder. ;)
TheLunatic schreef op woensdag 15 april 2009 @ 15:10:
[...]


Waarom niet:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php 
  $nu = date(G); 
  $dag = date(d); 
  $path = '/server/www/nlt/' . $dag .'-'.$nu; 
  if (!is_dir($path)) { 
    mkdir($path); 
  } 
  chdir($path); 
  system('curl http://teletekst.nos.nl/gif/images/711-01.gif --O smog-01.gif'); 
  system('curl http://teletekst.nos.nl/gif/images/711-02.gif --O smog-02.gif'); 
  system('curl http://teletekst.nos.nl/gif/images/711-03.gif --O smog-03.gif'); 
?>
@quotes: Ja klopt, is inderdaad leesbaarder. :)

Ik ben bezig met een script om de afbeeldingen van elk tijdstip te parsen naar een html pagina. Ik heb nu even geen tijd meer, maar morgenavond maak ik het af. Dan zal ik het even posten :)

Acties:
  • 0 Henk 'm!

  • Gommers
  • Registratie: November 2007
  • Laatst online: 05-09 20:58
Je kunt toch ook dingen downloaden met php's copy?
PHP:
1
2
3
4
5
6
<?php
if(copy("http://domein.nl/plaatje.jpg","eind/bestemming/afbeelding.jpg"))
{
   echo "Gedownload! :)";
}
?>

.. of is dat een slecht idee?

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Dat werkt inderdaad altijd uitstekend maar de TS wil zo graag vasthouden aan calls via de shell omdat 'het nu eenmaal werkt'. Ik zou zeggen: leer wat het snelst en makkelijkst is en het meest portable. Als je nu ineens op een windows bak moet werken gaat het huidige script ws. niet meer werken. Misschien is dat nu niet van toepassing maar een evt. volgende keer wel. Dan kijk je naar je script nu, kopieer en plak je het en...stuk.

Serieus dus, leer van de replies hier. copy() en file_get_contents() zijn uitstekend bruikbare functies vanuit PHP zelf die ook nog eens snel te lezen zijn voor een ander of jezelf op later tijdstip.

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Cartman! schreef op donderdag 16 april 2009 @ 14:23:
Serieus dus, leer van de replies hier. copy() en file_get_contents() zijn uitstekend bruikbare functies vanuit PHP zelf die ook nog eens snel te lezen zijn voor een ander of jezelf op later tijdstip.
Tot je een keer van host wisselt, en die host wel gewoon allow_url_fopen uit heeft staan in de INI. Dan zul je ineens toch met functies en libraries moeten gaan werken die daarvoor bedoeld zijn, namelijk curl.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Misschien ben ik dan verwend dat we dergelijke settings eisen dan maar daar heb je wel een punt. Maar als je dan curl gebruikt (ik gebruik het echter voor andere doeleinden dan een plaatje downloaden) pak dat de PHP functies ipv. via shell, ik snap niet dat de TS dit perse via shell wil doen.

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Tsja, ikzelf zou voor zoiets Snoopy gebruiken, dat werkt ook als je geen curl hebt. Shell is wel de meest onstabiele oplossing.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 19:24

Patriot

Fulltime #whatpulsert

Voor zoiets simpels kun je ook gewoon zelf even een HTTP-request simuleren. En zo zijn er vast nog veel meer verschillende manieren om het te doen. Maar ik denk zomaar dat het de TS niet zoveel kan schelen, en ik neem het hem eerlijk gezegd ook niet kwalijk. Ik denk niet dat hij van plan is iedere week van host te wisselen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Cartman! schreef op donderdag 16 april 2009 @ 14:36:
Misschien ben ik dan verwend dat we dergelijke settings eisen dan maar daar heb je wel een punt. Maar als je dan curl gebruikt (ik gebruik het echter voor andere doeleinden dan een plaatje downloaden) pak dat de PHP functies ipv. via shell, ik snap niet dat de TS dit perse via shell wil doen.
Ik heb nooit gezegd dat ik het perse via shell wilde doen, maar het moest op dat moment gewoon even werken.
Ik gebruik zelf ook liever php-native functies, dus daarom heb ik het nu aangepast (zie hieronder).
MueR schreef op donderdag 16 april 2009 @ 14:29:
[...]

Tot je een keer van host wisselt, en die host wel gewoon allow_url_fopen uit heeft staan in de INI. Dan zul je ineens toch met functies en libraries moeten gaan werken die daarvoor bedoeld zijn, namelijk curl.
Voorlopig zit ik gewoon op deze linux server die bij mij thuis draait, dus die verandert niet.

Hieronder even het huidige script:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$nu = date(H);
$dag = date(d);
$path = '/server/www/nlt/' . $dag .'-'. $nu;
if (!is_dir($path)) {
mkdir($path);
}
chdir($path);
$smog01 = file_get_contents('http://teletekst.nos.nl/gif/images/711-01.gif');
$smog02 = file_get_contents('http://teletekst.nos.nl/gif/images/711-02.gif');
$smog03 = file_get_contents('http://teletekst.nos.nl/gif/images/711-03.gif');
file_put_contents('smog-01.gif',$smog01);
file_put_contents('smog-02.gif',$smog01);
file_put_contents('smog-03.gif',$smog01);
?>

Dit breid ik later nog uit met een error log, maar dat is nu nog geen noodzaak. Deze wordt niet via de browser uitgevoerd, maar via een cronjob.

Hieronder staat het script om de plaatjes weer te geven:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
$dir = "/server/www/nlt/";
if (is_dir($dir)){ 
if ($dir1 = opendir($dir)) {        
while ( false ==! ($file = readdir($dir1))) { 
if (filetype($dir . $file) == dir) {
if (($file !== ".") and ($file !== "..")) {
$mappen[$telop1] = $file;
$telop1++;          
}
}
}
$telop2 = 0;
asort($mappen, SORT_REGULAR);
while (list(,$tijdelijk) = each($mappen)) {
list($disp_dag_t, $disp_uur_t) = explode('-', $tijdelijk);
$disp_dag1[$telop2] = $disp_dag_t;
$disp_uur1[$telop2] = $disp_uur_t;
$telop2++;
}
}
}
while ((list(,$url) = each($mappen)) and (list(,$echo_dag) = each($disp_dag1)) and (list(,$echo_uur) = each($disp_uur1))) {
?>
<table>
<tr>
<td><b><?php echo 'Smog op ' . $echo_dag . ' april om ' . $echo_uur . '.00 uur';?></b></td>
</tr>
<tr>
<td>
<img src="<?php echo $url;?>/smog-01.gif"> 
<img src="<?php echo $url;?>/smog-02.gif">
<img src="<?php echo $url;?>/smog-03.gif">
</td>
</tr>
</table><?php
}
?>
 


Het probleem is hier nu dat ik helemaal geen output krijg in de browser, noppes. Het werkte, totdat ik dit stukje toevoegde:

PHP:
1
2
3
4
5
6
while (list(,$tijdelijk) = each($mappen)) {
list($disp_dag_t, $disp_uur_t) = explode('-', $tijdelijk);
$disp_dag1[$telop2] = $disp_dag_t;
$disp_uur1[$telop2] = $disp_uur_t;
$telop2++;
}

Ik heb net even de print_r() functie gebruikt om de inhoud van de array's te bekijken, en het stukje heeft het gewenste resultaat. Het lijkt alleen of het stuk script eronder helemaal niet wordt uitgevoerd. Ik zie waarschijnlijk iets over het hoofd. Ziet iemand het?

Acties:
  • 0 Henk 'm!

  • Xander
  • Registratie: Oktober 2002
  • Laatst online: 19:39
Als we het dan toch al over leesbaarheid gehad hebben, gebruik de tab-toets dan ook eens iets vaker. ;)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
$dir = "/server/www/nlt/";
if (is_dir($dir)){ 
  if ($dir1 = opendir($dir)) {        
    while ( false ==! ($file = readdir($dir1))) { 
      if (filetype($dir . $file) == dir) {
        if (($file !== ".") and ($file !== "..")) {
          $mappen[$telop1] = $file;
          $telop1++;            
        }
      }
    }
    $telop2 = 0;
    asort($mappen, SORT_REGULAR);
    while (list(,$tijdelijk) = each($mappen)) {
      list($disp_dag_t, $disp_uur_t) = explode('-', $tijdelijk);
      $disp_dag1[$telop2] = $disp_dag_t;
      $disp_uur1[$telop2] = $disp_uur_t;
      $telop2++;
    }
  }
}
while ((list(,$url) = each($mappen)) and (list(,$echo_dag) = each($disp_dag1)) and (list(,$echo_uur) = each($disp_uur1))) {
?>
<table>
<tr>
<td><b><?php echo 'Smog op ' . $echo_dag . ' april om ' . $echo_uur . '.00 uur';?></b></td>
</tr>
<tr>
<td>
<img src="<?php echo $url;?>/smog-01.gif"> 
<img src="<?php echo $url;?>/smog-02.gif">
<img src="<?php echo $url;?>/smog-03.gif">
</td>
</tr>
</table><?php
}
?>


Maar even over je probleem: in regel 15 doorloop je heel $mappen al met each(), de each($mappen) op regel 23 zal false teruggeven. Zet voor regel 23 eens een reset($mappen).

En waarom gebruik je die $telop1 en $telop2 variabelen eigenlijk? Je kunt gewoon $array[] = "blaat" gebruiken, dan krijg je automatisch oplopende nummertjes.

PC specs!---Pulse mee voor GoT!
[22:49:37] <@Remy> ik wil een opblaasbare dSLR :+


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Kijk eerst maar eens naar andere opzet voor je loops. Bijv. een leesbare while, of gewoon for of foreach.

De combinatie van 3x list() en each() is imo alleen maar goed voor obfuscation. :P

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Xander schreef op donderdag 16 april 2009 @ 21:10:

Maar even over je probleem: in regel 15 doorloop je heel $mappen al met each(), de each($mappen) op regel 23 zal false teruggeven. Zet voor regel 23 eens een reset($mappen).
Bedankt dit deed het hem! Kun je misschien uitleggen waarom dit nodig was, als je tijd hebt?
En waarom gebruik je die $telop1 en $telop2 variabelen eigenlijk? Je kunt gewoon $array[] = "blaat" gebruiken, dan krijg je automatisch oplopende nummertjes.
Kan ook, maar ik vind deze de huidige manier ook voldoen.

Ik heb het script even wat opgeschoond:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
$dir = "/server/www/nlt/";
if (is_dir($dir)){ 
  if ($dir1 = opendir($dir)) {        
    while ( false ==! ($file = readdir($dir1))) { 
      if (filetype($dir . $file) == dir) {
        if (($file !== ".") and ($file !== "..")) {
          $mappen[$nummer] = $file;
          $nummer++;            
        }
      }
    }
    $nummer = 0;
    asort($mappen, SORT_REGULAR);
    while (list(,$tijdelijk) = each($mappen)) {
      list($disp_dag_t, $disp_uur_t) = explode('-', $tijdelijk);
      $disp_dag1[$nummer] = $disp_dag_t;
      $disp_uur1[$nummer] = $disp_uur_t;
      $nummer++;
    }
  }
}
reset($mappen);
while ((list(,$url) = each($mappen)) and (list(,$echo_dag) = each($disp_dag1)) and (list(,$echo_uur) = each($disp_uur1))) {
?>
<table>
<tr>
<td><b><?php echo 'Smog op ' . $echo_dag . ' april om ' . $echo_uur . '.00 uur';?></b></td>
</tr>
<tr>
<td>
<img src="<?php echo $url;?>/smog-01.gif"> 
<img src="<?php echo $url;?>/smog-02.gif">
<img src="<?php echo $url;?>/smog-03.gif">
</td>
</tr>
</table><?php
}
?>

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voutloos schreef op donderdag 16 april 2009 @ 21:17:
Kijk eerst maar eens naar andere opzet voor je loops. Bijv. een leesbare while, of gewoon for of foreach.

De combinatie van 3x list() en each() is imo alleen maar goed voor obfuscation. :P
Hoe zou jij dit doen met foreach()? De drie array's moeten allemaal apart in de loop komen, en volgens mij kun je foreach() alleen maar met één array gebruiken. Het mergen van de array's heeft geen zin, want dan gaan de afzonderlijke array's verloren dacht ik (ik kan het ook mis hebben hoor :P ).

Acties:
  • 0 Henk 'm!

  • Xander
  • Registratie: Oktober 2002
  • Laatst online: 19:39
Verwijderd schreef op donderdag 16 april 2009 @ 21:25:
[...]


Bedankt dit deed het hem! Kun je misschien uitleggen waarom dit nodig was, als je tijd hebt?
Kun jij mij dan misschien uitleggen waarom je er vanuit gaat dat de each() op regel 24 weer vooraan de array begint? :P

Stel dat dat wel zou gebeuren, waarom eindigen jouw while()-loops nu dan?

Met een beetje kritisch nadenken leer je een taal beter begrijpen, en anders is er altijd nog de PHP documentantie. ;)

each()
while()
Verwijderd schreef op donderdag 16 april 2009 @ 21:27:
[...]


Hoe zou jij dit doen met foreach()? De drie array's moeten allemaal apart in de loop komen, en volgens mij kun je foreach() alleen maar met één array gebruiken. Het mergen van de array's heeft geen zin, want dan gaan de afzonderlijke array's verloren dacht ik (ik kan het ook mis hebben hoor :P ).
Waarom zou je eigenlijk uberhaupt 2x door $mappen heenlopen?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
$dir = "/server/www/nlt/";
if (is_dir($dir)){ 
  if ($dir1 = opendir($dir)) {        
    while ( false ==! ($file = readdir($dir1))) { 
      if (filetype($dir . $file) == dir) {
        if (($file !== ".") and ($file !== "..")) {
          $mappen[] = $file;
        }
      }
    }
    asort($mappen, SORT_REGULAR);
  }
}
foreach ($mappen as $url) {
list($echo_dag, $echo_uur) = explode('-', $url);
?>
<table>
<tr>
<td><b><?php echo 'Smog op ' . $echo_dag . ' april om ' . $echo_uur . '.00 uur';?></b></td>
</tr>
<tr>
<td>
<img src="<?php echo $url;?>/smog-01.gif"> 
<img src="<?php echo $url;?>/smog-02.gif">
<img src="<?php echo $url;?>/smog-03.gif">
</td>
</tr>
</table><?php
}
?>

PC specs!---Pulse mee voor GoT!
[22:49:37] <@Remy> ik wil een opblaasbare dSLR :+


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Xander schreef op donderdag 16 april 2009 @ 21:49:
[...]


Kun jij mij dan misschien uitleggen waarom je er vanuit gaat dat de each() op regel 24 weer vooraan de array begint? :P

Stel dat dat wel zou gebeuren, waarom eindigen jouw while()-loops nu dan?

Met een beetje kritisch nadenken leer je een taal beter begrijpen, en anders is er altijd nog de PHP documentantie. ;)

each()
while()


[...]


Waarom zou je eigenlijk uberhaupt 2x door $mappen heenlopen?
Mijn excuus, ik ben soms zo bijdehand :P. Ik moet hier absoluut mijn meerdere erkennen! Ik ben nog niet zolang met php bezig, dus ik doe nog vrij veel omslachtige dingen :P. Bedankt in iedergeval!

Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Verwijderd schreef op donderdag 16 april 2009 @ 21:25:
[...]
Ik heb het script even wat opgeschoond:
PHP:
1
    while ( false ==! ($file = readdir($dir1))) {
Wil je geen !== ipv ==! hier?

Acties:
  • 0 Henk 'm!

Verwijderd

Misschien... maar je wilt daar nog liever een DirectoryIterator.

Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 19:24

Patriot

Fulltime #whatpulsert

Verwijderd schreef op donderdag 16 april 2009 @ 22:17:
[...]

Misschien... maar je wilt daar nog liever een DirectoryIterator.
Waarom? De in het voorbeeld gebruikte functies voldoen toch?

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Beste argument ooit hoor... 'zo werkt het toch ook?'. Waarom zou je moeilijk doen als je t met 1 regel netjes kan maken :? Heb je uberhaupt wel geklikt op de link van Cheatah (en nog belangrijker: het ook gelezen..) ?
Pagina: 1