PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP für Fortgeschrittene und Experten (http://www.selfphp.de/forum/forumdisplay.php?f=13)
-   -   Problem mit einer Funktion (http://www.selfphp.de/forum/showthread.php?t=3620)

markusschmitt 11.03.2003 23:07:00

Problem mit einer Funktion
 
Also nach dem des was ich bisher gemacht hat nur mist ausgibt hab ich mich dazu überwunden eine rekursive Funktion zu schreiben allerdings versteh ichs nicht so richtig. Hab bisher das:

PHP-Code:

function rekursiv($nlist)
{
  
$nlist ftp_nlist($openftp_pwd($open));
  for(
$i =0$i sizeof($nlist); $i++)
  {
    
$verz ftp_pwd($open);
    
fwrite($fx"<a href=ftp://$benutzername:$passwort@$servername:$port$verz/$nlist[$i]>[url]ftp://[/url]$benutzername:$passwort@$servername:$port$verz/$nlist[$i]</a>"."n");
    
$size ftp_size($open"nlist[$i]");
    if (
$size == "-1")         // ist der returnwert von $size = "-1"? Wenn ja dann Verzeichnis. Wenn nicht eine Datei.
    
{
      
ftp_chdir($open$nlist[$i])
      
rekursiv($nlist);
    }
  }


Ich bekomm ne Fehlermeldung wenn ich die Datei aufruf für die Zeile: "rekursiv($nlist);"

Des weiteren versteh ich nicht so richtig von was ich die Funktion abhängig machen muss also von $nlist oder $nlist[i] oder was anderes?
Es soll jedes Verzeichnis durchlaufen werden. Wie ruf ich die Funktion aus meinem Haupcode aus? Geht das so?
rekursiv($nlist);
oder muss ich davor $nlist noch Hauptcode definieren oder reicht das aus?

Mfg Markus

Greg G 12.03.2003 08:09:46

Ich kenn mich mit den FTP-Befehlen nicht aus. Aber vielleicht kann ich dir ein paar Hinweise geben:

Wenn du die Funktion mit dem Argument $nlist aufrufst, und dann das Argumant in der ersten Zeile der Funktion wieder überschreibst, kannst du es auch ganz weglassen.
Das ist wohl nicht gemeint, das Argument $ordner müsste irgendwie der aktuelle Verzeichnisname sein. Dahin müsstest du dann in der ersten Zeile chdir($ordner) machen.
Nach dem rekursiven Aufruf der Funktion rekursiv($ordner . "/". $unterordner); oder so ähnlich, wirst du wahrscheinlich nochmal chdir($ordner) machen, da die ftp-Funktionen sich nicht merken, in welcher Rekursionsebene deines Programms sie sind.

Der Fehler den du kriegst, dürfte das fehlende Semikolon in der Zeile vor rekursiv($nlist) sein.

Am besten gibst du hier immer auch an, was für eine Fehlermeldung ausgegeben wird, anstatt
Ich bekomm ne Fehlermeldung wenn ich die Datei aufruf für die Zeile: "rekursiv($nlist);"

Dann kann man dir schneller helfen.

GG

markusschmitt 12.03.2003 11:55:16

Du meinst also ich sollte das vom Pfad und den Unterverzeichnis abhängig machen also so inetwa
PHP-Code:

function rekursiv($ordner."/".$unterordner)
{
  
$nlist ftp_nlist($openftp_pwd($open));
  for(
$i =0$i sizeof($nlist); $i++)
  {
    
$verz ftp_pwd($open);
    
fwrite($fx"<a href=ftp://$benutzername:$passwort@$servername:$port$verz/$nlist[$i]>ftp://$benutzername:$passwort@$servername:$port$verz/$nlist[$i]</a>"."n");
    
$size ftp_size($open"nlist[$i]");
    if (
$size == "-1")         // ist der returnwert von $size = "-1"? Wenn ja dann Verzeichnis. Wenn nicht eine Datei.
    
{
      
ftp_chdir($open$nlist[$i]);
      
$ordner ftp_pwd($open);
      
$unterordner ftp_nlist($openftp_pwd($open));
      
rekursiv($ordner."/".$unterordner);
    }
  }


Nochmal zum alten Code. Für die Zeile mit dem Funktionsaufruf im Hauptcode
PHP-Code:

$suchname $suche".txt";
touch($suchname);
$fx fopen ($suchname "a");
rekursiv($nlist);  //für die Zeile bekomm "Parse error: parse error in C:apachehtdocsftpindex12.php on line 170"
fclose(fx); 

Wenn des sich die Stelle nicht merken kann dann durchläuft er mit doch nicht alle Verzeichnisse oder ist das jetzt mit $ordner."/.$unterordner erledigt weil ich da dann immer andere Verzeichnisse hab und der Pfad ist auch immer anderst?

Nochwas ich habs jetzt mal abgeändert und gespeichert aber bekomm für die function rekursiv($ordner."/".$unterordner) ne Fehlermeldung. '/' geht auch nicht also ich denk mal das ich den / weglassen muss aber das wäre ja denk ich mal nicht so schlimm.

Mfg Markus

Greg G 12.03.2003 13:29:06

Die Definition der Funktion soll nur eine Variable annehmen.

PHP-Code:



function rekursiv($verz)
{
  global 
$open;
  
$nlist ftp_nlist($open$verz);
  for(
$i =0$i sizeof($nlist); $i++)
  {
    
fwrite($fx"<a href=ftp://$benutzername:$passwort@$servername:$port$verz/$nlist[$i]>ftp://$benutzername:$passwort@$servername:$port$verz/$nlist[$i]</a>"."n");
    
$size ftp_size($open"nlist[$i]");
    if (
$size == "-1")         // ist der returnwert von $size = "-1"? Wenn ja dann Verzeichnis. Wenn nicht eine Datei.
    
{
      
rekursiv($verz."/".$nlist[$i]);
    }
  }


Nimms bitte nicht wortwörtlich, sondern schau halt, wie es passt. Sind sicher auch bugs drin.

Wie du globale Variablen ansprichst musst du noch mal nachsehen, weiß nicht, ob das mit global $open so klappt.
Außerdem müssen die übrigen Variablen
$benutzername:$passwort@$servername
usw. ja auch global sein.

Aufruf aus dem Hauptprogramm mit rekursiv("/das/ist/mein/Pfad");

GG

markusschmitt 12.03.2003 13:48:11

Ups was mach ich denn, bin ich jetzt total bescheuert?
Bitte sagt nicht Ja ;)

PHP-Code:

<?php
set_time_limit
(120);
if (
$suche)
{
//---------------Funktionsbeginn------------------
    
function rekursiv($ordner)
    {
        
$nlist ftp_nlist($openftp_pwd($open));
        for(
$i =0$i sizeof($nlist); $i++)
        {
            
$verz ftp_pwd($open);
            
fwrite($fx"<a href=ftp://$benutzername:$passwort@$servername:$port$verz/$nlist[$i]>ftp://$benutzername:$passwort@$servername:$port$verz/$nlist[$i]</a>"."n");
            
$size ftp_size($open"nlist[$i]");
            if (@
ftp_chdir($open"nlist[i]"))
            {
                
$ordner ftp_pwd($open);
                  
//$unterordner = ftp_nlist($open, ftp_pwd($open));
                
rekursiv($ordner);
            }
        }
    }

Des würde doch überhaupt nicht funktionieren so weil $unterordner ein Array ist und und ich keine spezielles Element daraus benannt hab also müsste ich rein von $ordner ausgehen.
Die Variablen benutzername usw. sind im Hauptcode so benannt:
PHP-Code:

global $servername,$benutzername,$passwort,$port,$open

Bekomm aber trotzdem für die Zeile eine Fehlermeldung!
PHP-Code:

...
$fx fopen ($suchname "a");
rekursiv($ordner);  //hier kommt parse error
fclose(fx);
... 


Ich hab rekursiv($ordner); schon mal mit // weggemacht aber selbst dann sagt er mir für die Zeile ein parse error aus

Des gibts doch nicht

Mfg Markus

Greg G 12.03.2003 14:14:10

bei fopen fehlt das Komma.

Wenn du das so machen willst (mit ftp_pwd) brauchst du wahrscheinlich gar keinen Parameter.
Also ist der Aufruf und die Deklaration
rekursiv();

Du musst dann nur im Hauptprogramm in das richtige ftp-Verzeichnis gehen.

Und dann entweder
PHP-Code:

           if (@ftp_chdir($open"nlist[i]"))
            {
                
rekursiv();
                
ftp_chdir($open"..");
            } 

um wieder aus dem Unterverzeichnis rauszuspringen, oder das ftp_chdir($open, "..");
ganz am Ende deiner Funktion.

GG

markusschmitt 12.03.2003 14:35:39

"Du musst dann nur im Hauptprogramm in das richtige ftp-Verzeichnis gehen. "

Ich will eigentlich aus dem root Verzeichnis alle Dateien und Unterverzeichnisse samt den dort enthaltenen Dateien alle auslesen. Deshalb hab ich zumindest gedacht das ich das vom Pfad in dem ich bin abhängig machen muss. Eigentlich ist es so gedach das sich die Funktion aufteilt also

| ("|" ist das root)
|
|--Hauptverzeichnis 1
| |- Datei 1.1
| |- Datei 1.2
|
|
|--Hauptverzeichnis 2
| |- Unterverzeichnis 2.1
| | |- Unterverzeichnis 2.1.1
| | | |-Datei 2.1.1.1
| | |- Unterverzeichnis 2.1.2
| | | |- Datei 2.1.2.1
| | | |- Datei 2.1.2.2
| |- Unterverzeichnis 2.2
| | |-Datei 2.2.1
| |- Datei 2.1
....
Es soll also in jedes Verzeichnis rein gehen. Zum Beispiel er soll mir das Unterverzeichnis von Hauptverzeichnis 2 Auslesen das wäre dann Unterverzeichnis 2.1 und Unterverzeichnis 2.2 . Als nächstes soll er mir dann das Unterverzeichnisse von 2.1 und 2.2 auslesen also beide und nicht nur das erste (2.1). So hab ich mir das eigentlich gedacht und daher von $ordner abhängig gemacht.

Mfg Markus

Greg G 12.03.2003 14:43:36

Dann verstehe ich nicht, warum du andererseits immer ftp_pwd verwenden willst, wenn du gleichzeitig noch den Ordner übergeben möchtest??

GG

markusschmitt 12.03.2003 16:28:29

Deshalb wollte ich ja das Verzeichnis und der Ordner angeben.
Der bisher in $nlist[i] steht.
Was man machen könnte wäre innerhalb der If und vor dem Aufruf der Funktion.
$unterordner = $nlist[i];
und dann der Aufruf mit
rekursiv($ordner, $unterordner);

Wäre das jetzt eine Lösung meines Probs?

Mfg Markus

markusschmitt 13.03.2003 01:34:47

OK habs geschafft. Das Verzeichnis sowie alle Unterverzeichnisse werden aufgelistet. Morgen Früh oder Mittag mach ich mich an das Suchskript. Mal sehen wies läuft und ich das anpacke. Wenn alles läuft schreib ich ein Tut da so was bisher noch nicht existiert.

Mfg Markus


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:21:15 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.