[PHP] Functie ftp_nlist geeft FALSE terug

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • antonboonstra
  • Registratie: Augustus 2002
  • Laatst online: 20-09 18:51

antonboonstra

8815Wp | WP | Tesla | Zero

Topicstarter
Ik ben bezig met een php-script, waarmee ik d.m.v. een webinterface kan FTP-en. Nu wil ik met de functie ftp_nlist de bestanden weergeven die in een bepaalde map staan, alleen lukt dit niet. Het inloggen werkt, maar daarna krijg ik de melding "Bestanden konden niet worden opgehaald uit map ./". Zelfs met error_reporting(E_ALL); zie ik niets meer. Wat doe ik nu fout?

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<html>
<head>
<title>Web FTP</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link rel="stylesheet" href="style.css" type="text/css">
</head>

<body>
<center>
<table height="100%"><tr><td valign=middle>

<?php
session_start();
error_reporting(E_ALL);

if (isset($_GET['logout'])) uitloggen();
elseif (isset($_SESSION['ftp_server'])) overzicht();
elseif (isset($_POST['ftp_server'])) inloggen();
else inlogpagina();

function inlogpagina()
{
  ?>
<h1>Inlogpagina</h1>
<form name="form1" enctype="multipart/form-data" method="post" action="index.php">
  <table>
    <tr><td>FTP server</td><td><input type='text' name='ftp_server'></td></tr>
    <tr><td>FTP gebruiker</td><td><input type='text' name='ftp_gebruiker'></td></tr>
    <tr><td>FTP wachtwoord</td><td><input type='password' name='ftp_wachtwoord'></td></tr>
    <tr><td>&nbsp;</td><td><input type="submit" name="Submit" value="Inloggen"></td></tr>
  </table>
</form>
  <?php
}

function inloggen()
{
  if($_POST['ftp_server'] == '' || $_POST['ftp_gebruiker'] == '')
  {
    echo 'Geen FTP server of gebruiker ingevuld.<br><br><a href="./">Terug</a>';
  }
  else
  {
    // maak een basis connectie aan
    $conn_id = ftp_connect(strip_tags($_POST['ftp_server']));
    // meld je aan met een gebruikersnaam en wachtwoord
    $login_result = ftp_login($conn_id, strip_tags($_POST['ftp_gebruiker']), strip_tags($_POST['ftp_wachtwoord']));

    // controleer de verbinding
    if ((!$conn_id) || (!$login_result)) 
    {
      echo "FTP connectie is mislukt!<br>\n";
      echo "Probeerde naar " . strip_tags($_POST['ftp_server']) . " te verbinden met de gebruiker " . strip_tags($_POST['ftp_gebruiker']) . "<br>\n";
      exit;
    } 
    else 
    {
      // als verbinding is gelukt, sla ingevoerde waarden op in SESSIONS en laat inhoud van de map zien dmv functie "overzicht()"
      $_SESSION['ftp_server'] = strip_tags($_POST['ftp_server']);
      $_SESSION['ftp_gebruiker'] = strip_tags($_POST['ftp_gebruiker']);
      $_SESSION['ftp_wachtwoord'] = strip_tags($_POST['ftp_wachtwoord']);
      overzicht();
    }
  }
}


function uitloggen()
{
  if (isset($_SESSION['ftp_server']))
  {
    $conn_id = ftp_connect($_SESSION['ftp_server']);
    ftp_close($conn_id);
    unset($_SESSION['ftp_server']);
    echo "<i>Je bent uitgelogd.</i><br>\n";
  }
  inlogpagina();
}


// Laat een overzicht zien van de inhoud van een map. Is de variabele map niet meegegeven, kijk dan in de root-map
function overzicht($map = './')
{
  // laat de inloginformatie zien
  echo '<p class=info><b>Ingelogd op:</b><br>';
  echo 'FTP server: ' . $_SESSION['ftp_server'] . "<br>\n";
  echo 'Gebruiker: ' . $_SESSION['ftp_gebruiker'] . "<br>\n";
  echo '</p>';
  
  // verzamel de bestanden
  $bestanden = verzamel_bestanden($map);
  if (is_array($bestanden)) echo implode("<br>\n", $bestanden);
}


// Haal d.m.v. FTP de inhoud van de map op en retourneer deze in de array $bestanden
function verzamel_bestanden($map = './')
{
  $conn_id = ftp_connect($_SESSION['ftp_server']);
  $bestanden = ftp_nlist ($conn_id, $map);
  if(!$conn_id) echo 'Connectie was niet goed<br>';
  elseif(!$bestanden) echo 'Bestanden konden niet worden opgehaald uit map '.$map.'<br>';
  else return($bestanden);
}

?>

</td></tr></table></center>
</body>
</html>

📸Canon EOS 5D IV 🚁DJI Mavic Pro 🏍️Zero SR ⚡Tesla M3 LR 🌡️Daikin US 3.5kW ☀️8815Wp 🔋Marstek Venus-E 5,12 kWh Tweakers PVOutput lijst


Acties:
  • 0 Henk 'm!

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Ik vraag me af: zit in $_SESSION['ftp_server'] wel de juiste connectie id, en niet gewoon de hostname van de ftp server.
Eerst doe je:
code:
1
$_SESSION['ftp_server'] = strip_tags($_POST['ftp_server']);

Later:
code:
1
$conn_id = ftp_connect($_SESSION['ftp_server']);

[ Voor 20% gewijzigd door jelmervos op 08-04-2008 11:22 ]

"The shell stopped unexpectedly and Explorer.exe was restarted."


Acties:
  • 0 Henk 'm!

Verwijderd

jelmervos schreef op dinsdag 08 april 2008 @ 11:20:
Ik vraag me af: zit in $_SESSION['ftp_server'] wel de juiste connectie id, en niet gewoon de hostname van de ftp server.
Eerst doe je:
code:
1
$_SESSION['ftp_server'] = strip_tags($_POST['ftp_server']);

Later:
code:
1
$conn_id = ftp_connect($_SESSION['ftp_server']);
Nee, waarom zou je een connectie id in je session willen opslaan?

In de verzamel functie wordt een nieuwe verbinding gelegd met ftp_connect, mijn eerste ingeving is dan: ftp_login?

Acties:
  • 0 Henk 'm!

  • antonboonstra
  • Registratie: Augustus 2002
  • Laatst online: 20-09 18:51

antonboonstra

8815Wp | WP | Tesla | Zero

Topicstarter
jelmervos schreef op dinsdag 08 april 2008 @ 11:20:
Ik vraag me af: zit in $_SESSION['ftp_server'] wel de juiste connectie id, en niet gewoon de hostname van de ftp server.
Eerst doe je:
code:
1
$_SESSION['ftp_server'] = strip_tags($_POST['ftp_server']);

Later:
code:
1
$conn_id = ftp_connect($_SESSION['ftp_server']);
Bedankt voor je reactie. In $_SESSION['ftp_server'] zit wel de juiste server, dus dat gaat wel goed.

Ik kom er nu echter achter dat de FTP connectie niet behouden blijft. Als ik bij regel 102 de functie ftp_pwd($conn_id); zet waarmee ik de huidige mapnaam terug zou moeten krijgen, krijg ik opeens wel een php melding dat ik niet ben ingelogd met de juiste user/password. Deze melding krijg ik nietbij ftp_nlist. Betekent dit dus dat na afloop van het php-script de FTP verbinding altijd automatisch wordt verbroken en dat je deze dus weer opnieuw moet aanmaken? Is dit normaal?

Ik dacht dat ik eenmalig kon inloggen met de functie inloggen() en de FTP verbinding pas weer verbreek als ik de functie uitloggen() aanroep, maar dit kan dus niet?

edit:
Het lijkt nog erger te zijn. De FTP connectie moet zelfs in dezelfde functie staan als waar ftp_nlist in staat. Ik kan in de functie verzamel_bestanden() niet eens een aparte functie start_ftp() aanroepen, waarin ik verbinding maak.

Moet ik dan bij elke aanroep van een FTP command in een PHP functie eerst verbinding maken? Blijft dit wel dezelfde verbinding, of log ik dan meerdere keren in met dezelfde FTP-account?

[ Voor 22% gewijzigd door antonboonstra op 08-04-2008 11:52 ]

📸Canon EOS 5D IV 🚁DJI Mavic Pro 🏍️Zero SR ⚡Tesla M3 LR 🌡️Daikin US 3.5kW ☀️8815Wp 🔋Marstek Venus-E 5,12 kWh Tweakers PVOutput lijst


Acties:
  • 0 Henk 'm!

  • megamuch
  • Registratie: Februari 2001
  • Laatst online: 08-12-2024

megamuch

Tring Tring!

Een php script heeft geen state. Dus je connectie ben je na het beeindigen van je script kwijt. Dus je zal inderdaad elke keer opnieuw moeten inloggen.

Verstand van Voip? Ik heb een leuke baan voor je!


Acties:
  • 0 Henk 'm!

Verwijderd

je kan gewoon je connection id bewaren en gebruiken in functies. je hoeft echt niet elke functie opnieuw een verbinding te leggen. let wel, je moet wel elke request een verbinding leggen, dus je connection id in je session bewaren heeft weinig nut

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$con_id = ftp_connect($server);
ftp_login($username, $password);

// bla bla
function bloep()
{
    ftp_nlist($con_id, "./");
    // bla bla
}

function bliep()
{
    ftp_get($con_id, /* en nog wat params */);
    // bla bla
}

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Het grote probleem in de code van je startpost is dat je de conn_id variabele definieerd in de function scope. Hij bestaat dus alleen binnen die functie en is weg zodra je er uit bent. Om de variabele in je hele script te kunnen gebruiken zul je hem in de global scope moeten definieren.

Op php is vast wel ergens iets te vinden over hoe je variabelen in de verschillende scopes definieerd.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1