Auf Inhalt von array zugreifen

Auf Inhalt von array zugreifen

am 09.08.2006 19:25:56 von Aki

Ich habe ein Problem ....

ich denke jemand der mehr Ahnung von array=B4s hat kann mir bestimmt
helfen .

Ich habe folgendes Script um auf Dateien in einem Ordner zuzugreifen.

############################################################ ##
if(!empty($folder)) {

$fotodat =3D array(
'filename' =3D> array(),
'filepers' =3D> array(),
'fileno' =3D> array(),
'filedate' =3D> array(),
'filetyp' =3D> array(),
);

$handle =3D opendir("/home/www/............./$direct/$folder");
if($handle) {
while ($datei =3D readdir($handle)) {
if(($datei !=3D ".") && ($datei !=3D ".." )) {

$res=3Dexplode(" ",$datei);
$datname=3Dexplode("_",$res[0]);

$fodate =3D $datname[3]; // zur weiterverarbeitung des Erstellungsdatum

$datend=3Dexplode(".",$res[0]);
$typ=3D$datend[1]; // Dateityp

$res1=3Dexplode(" ",$fodate);
$datum=3Dexplode(".",$res1[0]);

$fotodat['filename'][] =3D $datei;
$fotodat['filepers'][] =3D $datname[1];
$fotodat['fileno'][] =3D $datname[2];
$fotodat['filedate'][] =3D $datum[0];
$fotodat['filetyp'][] =3D $datend[1];


array_multisort($fotodat['filename'], $fotodat['filename']);

######### ERSTES PROBLEM ##############################
Dei Datei hat eine bestimmte Zeichenfilge :
Kundennummer_Kundenname_Laufende Nummer_Bearbeitungsdatum.Dateiendung
Sollte eigentlich nach der Laufenden Nummer sortiert werden, denke aber
das geht nicht, da ich in dem Fall den dateinamen erneut
auseinandernehmen müsste
###########################################################

} } } }
closedir($handle);

foreach($fotodat as $wert =3D> $val) {
if (?????? =="jpg") {

########## Mein Hauptproblem ################################
Wie greife ich jetzt auf den Inhalt des array zu ???

$query_stat =3D " SELECT * FROM ....... WHERE url_foto_file=3D'?????' AND
kd_id=3D'$kd_id' ";
$result3 =3D mysql_query($query_stat, $conn);
$foto =3D mysql_fetch_array($result3);
$records =3D mysql_num_rows($result3);
$fotoid =3D"$foto[id]";

if($records == "0") {
$id =3D 1000 + $result3;
$fotocontainer[] =3D "

cellspacing=3D0 cellpadding=3D0>





src=3D'$image_url/$wert' width=3D'100' border=3D0>
src=3D'$admin_url/_images/sidemap/star2.gif'
border=3D'0' ALT=3D'Datei nicht geladen !'>
$pers
Foto
Nr.: $fotono
vom:
$fotodate
bgcolor=3D'#FFFFCC'>
id=3D'fotostatus' value=3D'$wert'> aktivieren
";
} else
if($foto[foto_status] =="1" ) {
......................................
} }
}

############################################################ ###############=
######################

Vielleicht kann mir jemand weiterhelfen ??

Besten dank im vorraus

Aki

Re: Auf Inhalt von array zugreifen

am 09.08.2006 23:27:14 von Ulf Kadner

Aki wrote:
> Ich habe ein Problem ....

Ja Du hast keinen Namen. :-)

> Ich habe folgendes Script um auf Dateien in einem Ordner zuzugreifen.

Ich hab das mal etwas lesbarer gestaltet. Wäre eigentlich Deine Aufgabe
gewesen! Das was Du da hingefatscht hast in eigentlich unwürdig
beantwortet zu werden!

> if(!empty($folder)) {
> $fotodat = array(
> 'filename' => array(),
> 'filepers' => array(),
> 'fileno' => array(),
> 'filedate' => array(),
> 'filetyp' => array(),
> );
> $handle = opendir("/home/www/............./$direct/$folder");
> if($handle) {
> while ($datei = readdir($handle)) {
> if(($datei != ".") && ($datei != ".." )) {
> $res=explode(" ",$datei);
> $datname=explode("_",$res[0]);
> $fodate = $datname[3];
> $datend=explode(".",$res[0]);
> $typ=$datend[1]; // Dateityp
> $res1=explode(" ",$fodate);
> $datum=explode(".",$res1[0]);
> $fotodat['filename'][] = $datei;
> $fotodat['filepers'][] = $datname[1];
> $fotodat['fileno'][] = $datname[2];
> $fotodat['filedate'][] = $datum[0];
> $fotodat['filetyp'][] = $datend[1];
> array_multisort($fotodat['filename'], $fotodat['filename']);
> ######### ERSTES PROBLEM ##############################
> # Dei Datei hat eine bestimmte Zeichenfilge :
> # Kundennummer_Kundenname_Laufende Nummer_Bearbeitungsdatum.Dateiendung
> # Sollte eigentlich nach der Laufenden Nummer sortiert werden,
> # denke aber das geht nicht, da ich in dem Fall den dateinamen
> # erneut auseinandernehmen müsste
> ########################################################
> }
> }
> }
> }
> closedir($handle);

So erst mal bis hier her.
Als erstes muss closedir($handle) in den 1. if-Zweig. Da wo es jetzt
steht erzeugt es immer dann einen Fehler wenn $folder leer ist da dann
kein $handle existiert! Weiterhin fehlt da jedwige Fehlerbehandlung!

Frage 1+2 Was ist $direct und was ist $folder? Wo kommen die beiden her?

Die Aufteilung Deines Codes ist schlecht. min. eine unnoetige
Verschachtelung.

besser (mit Korrektur):

if(!empty($folder)) {
$fotodat = array(
'filename' => array(),
'filepers' => array(),
'fileno' => array(),
'filedate' => array(),
'filetyp' => array(),
);
$handle = opendir("/home/www/............./$direct/$folder");
if($handle) {
while ($datei = readdir($handle)) {
if(($datei == '.') || ($datei == '..')) continue;
$res=explode(" ",$datei);
$datname=explode("_",$res[0]);
$fodate = $datname[3];
$datend=explode(".",$res[0]);
$typ=$datend[1]; // Dateityp
$res1=explode(" ",$fodate);
$datum=explode(".",$res1[0]);
$fotodat['filename'][] = $datei;
$fotodat['filepers'][] = $datname[1];
$fotodat['fileno'][] = $datname[2];
$fotodat['filedate'][] = $datum[0];
$fotodat['filetyp'][] = $datend[1];
array_multisort($fotodat['filename'], $fotodat['filename']);
}
closedir($handle);
}
}

> foreach($fotodat as $wert => $val) {

$fotodat existiert nur wenn $folder nicht leer ist und ein $handle
erstellt wird. Also macht es hier keinen Sinn eine schleife auf diese
Variable anzusetzen bevor nicht geprueft wurde ob den die Variable auch
existiert! Ansonsten bekommst Du ne Fehlermeldung. Wenn nicht
error_reporting(E_ALL); am Scriptanfang setzen. Ich würde das alles in
Funktionen/Methoden aufteilen da macht sich derartiges besser und wird
übersichlicher. Aber das zu erklären hab ich keinen Bock!

> if (?????? =="jpg") {

Was soll das denn sein? Willst Du hier prüfen ob die Dateiendung .jpg
ist oder willst Du pruefen ob der Dateiinhalt einr JPG-Datei entspricht?
Bei letzeren wie genau soll die Prüfung sein?

> ########## Mein Hauptproblem ################################
> Wie greife ich jetzt auf den Inhalt des array zu ???

3 Fragezeichen machen die Frage nicht fraglicher! :-)
Welchen array meinst Du.

> $query_stat = " SELECT * FROM ....... WHERE url_foto_file='?????' AND

Was bedeutet das?

> $fotoid ="$foto[id]";

Du willst hier $fotoid = $foto['id']; schreiben obwohl nichtmal das Sinn
macht.

Ich würde sagen lies Dir einfach das Manual zum Thema Arrays durch
(gleich nen Paar mal) und gehe die ganzen Beispiele durch.

MfG, Ulf

Re: Auf Inhalt von array zugreifen

am 10.08.2006 09:01:45 von Armin Aki

Hallo Ulf,

so meinen Nick habe ich nun geändert. Das der Source Code derart
unleserlich war,tut mir Leid.
Danke für die Änderung des closedir($handle);

> So erst mal bis hier her.
> Als erstes muss closedir($handle) in den 1. if-Zweig. Da wo es jetzt
> steht erzeugt es immer dann einen Fehler wenn $folder leer ist da dann
> kein $handle existiert! Weiterhin fehlt da jedwige Fehlerbehandlung!
>
> Frage 1+2 Was ist $direct und was ist $folder? Wo kommen die beiden her?

Das sind zwei Variable die über den Link, an das Script übergeben
werden (Ordnernamen)

>
> > foreach($fotodat as $wert =3D> $val) {
>
> $fotodat existiert nur wenn $folder nicht leer ist und ein $handle
> erstellt wird. Also macht es hier keinen Sinn eine schleife auf diese
> Variable anzusetzen bevor nicht geprueft wurde ob den die Variable auch
> existiert! Ansonsten bekommst Du ne Fehlermeldung. Wenn nicht
> error_reporting(E_ALL); am Scriptanfang setzen. Ich würde das alles in
> Funktionen/Methoden aufteilen da macht sich derartiges besser und wird
> übersichlicher. Aber das zu erklären hab ich keinen Bock!

Der Ordner wird erst erstellt wenn Bilder hochgeladen werden.
Leere Ordner gibt es nicht und somit auch keinen Link,
der dieses Script aufrufen könnte.


> > if (?????? =="jpg") {
>
> Was soll das denn sein? Willst Du hier prüfen ob die Dateiendung .jpg
> ist oder willst Du pruefen ob der Dateiinhalt einr JPG-Datei entspricht?
> Bei letzeren wie genau soll die Prüfung sein?

Die Dateien werden serverseitig vonm einem cgi Script
auf den Dateiinhalt beim Upload geprüft.
Da es nur .jpg & .txt Dateien in den Ordnern gibt reicht
in diesem Fall eine Prüfung der Dateienden,
da hier nur die Bilddateien angezeigt werden soll.


>
> > ########## Mein Hauptproblem ################################
> > Wie greife ich jetzt auf den Inhalt des array zu ???
>
> 3 Fragezeichen machen die Frage nicht fraglicher! :-)
> Welchen array meinst Du.

Hast Du recht, nur beantwortet hast Du sie mit Deiner Aussage auch
nicht ;-)


> > $query_stat =3D " SELECT * FROM ....... WHERE url_foto_file=3D'=
?????' AND $fotoid =3D"$foto[id]";

>
> Was bedeutet das?
Ganz einfach url_foto_file ist $fotodat['filename'][]
$foto[id] =3D ebenfalls aus dem array zu holen !
Meine Frage war : Wie greife ich darauf zu ?

MFG Armin Aki

Re: Auf Inhalt von array zugreifen

am 10.08.2006 10:30:48 von Ulf Kadner

Armin Aki wrote:
> Hallo Ulf,
>
> so meinen Nick habe ich nun geändert.

Hallo Armin!

*beifall* :-)

> Das der Source Code derart
> unleserlich war,tut mir Leid.
> Danke für die Änderung des closedir($handle);

Du must verstehen. Die Leute hier machen das in Ihrer Freizeit. Wenn man
sich da jedes mal noch durch unmengen an Code wühlen muss der nichtmal
eingerückt ist verliert man sehr schnell die Lust.

>>Frage 1+2 Was ist $direct und was ist $folder? Wo kommen die beiden her?

> Das sind zwei Variable die über den Link, an das Script übergeben
> werden (Ordnernamen)

Huiuiui. Da fliegt mir ja gleich die Mütze weg. Ich habs mir zwar schon
irgendwie denken koennen aber ich wollt nur noch sichergehen.

Du verstehst gerad nix? :-) Pass auf:
Wenn Du auf GET-Parameter (die URL-Parameter) zugreifen willst so machst
Du das in PHP ueber das superglobale Array $_GET (superglobal = steht in
allen Funktionen, Klassen etc. direkt zur Verfügung) $direct wird also
zu $_GET['direct'] etc. Das direkte ansprechen über $direct mag bei Dir
momentan noch funktionieren, aber spaetesten naechstes Jahr (PHP6)
existiert die von Dir genutzten Variable nicht mehr, da diese nur
gesetzt wird wenn in der php.ini register_globals=On ist.

Dazu existiert auch eine FAQ:

11.20. Warum funktionieren meine Formulare nicht?
http://www.php-faq.de/q/q-formular-register-globals.html

Allerdings stellt es ein absolutes Sicherheitsloch/Sicherheitsproblem
dar irgend einen Parameter ungeprueft/unbehandelt in den PHP-Code
einfliessen zu lassen!

Du must durch verschiedene, von erlaubten Inhalt abhaengige Pruefungen
durchfuehren, die sicherstellen, das Dir da nicht irgendwer Schadcode
unterjubeln will. (Das gilt fuer alle Parameter, die vom Nutzer
beeinflusst werden koennen, also auch Formularparameter ($_POST))

12.11. Prüfe importierte Parameter. Traue niemandem
http://www.php-faq.de/q/q-sicherheit-parameter.html

12.1. Wie unterscheide ich böse Variablen von guten?
http://www.php-faq.de/q/q-security-variablen.html

>>>foreach($fotodat as $wert => $val) {
>>
>>$fotodat existiert nur wenn $folder nicht leer ist
>
> Der Ordner wird erst erstellt wenn Bilder hochgeladen werden.
> Leere Ordner gibt es nicht und somit auch keinen Link,
> der dieses Script aufrufen könnte.

Du taeuschst Dich. Es kann ein Fehler entstehen. Wenn es wirklich so
waere wie Du denkst, so waere die Pruefung if (!empty(... überflüssig.

> Die Dateien werden serverseitig vonm einem cgi Script
> auf den Dateiinhalt beim Upload geprüft.
> Da es nur .jpg & .txt Dateien in den Ordnern gibt reicht
> in diesem Fall eine Prüfung der Dateienden,
> da hier nur die Bilddateien angezeigt werden soll.

Einer der vielen möglichen Wege ist über pathinfo() zu gehen. Das von
der Funktion zurueckgegebene Array (assoz.) enthaelt u.a. auch die
Dateiendung.
http://www.php.net/manual/en/function.pathinfo.php

>>>Wie greife ich jetzt auf den Inhalt des array zu ???
>>
>>3 Fragezeichen machen die Frage nicht fraglicher! :-)
>>Welchen array meinst Du.
>
> Hast Du recht, nur beantwortet hast Du sie mit Deiner Aussage auch
> nicht ;-)

Da ich nicht weis welches Array Du meinst.

>>Was bedeutet das?
>
> Ganz einfach url_foto_file ist $fotodat['filename'][]

Da fehlt der Index/Schlüssel fürs letzte Element. Aber Du iterierst ja
bereits durch $fotodat (mit foreach)

wenn Du Deine Schleife durchläufst:

foreach($fotodat as $wert => $val) {
// $val enthaelt jetzt ein numerisch indiziertes Array mit den
// vorher im Code definierten Werten
// Wenn du also auf dessen Elemente zugreifen willst, so must
// Du ebenfalls durch dieses Array Iterieren
foreach ($val as $value) {
// Und hier seht dann jedes Element in $value zur verfuegung.
}
}

> $foto[id] = ebenfalls aus dem array zu holen !
> Meine Frage war : Wie greife ich darauf zu ?

Da fällt mir auf, das Du $foto nirgendwo definiert hast. Wo kommt das
den ueberhaupt her?

MfG, Ulf

Re: Auf Inhalt von array zugreifen

am 10.08.2006 10:37:51 von Ulf Kadner

Armin Aki wrote:

> ...

Armin

Es wäre vieleich am einfachster wenn Du mal erklaerst was Du mit dem
Code genau bezwecken willst. Bzw. das was fuer Dich ein Problem
darstellt hervorzuheben und das restliche Gerassel mal wegzulassen.

Es faellt mir schwer darin eine vollstaendige Logik zu erkennen. Flacher
Code (Flat code) so wie Du ihn nutz kommt eher selten bei mir vor, da
dies die Überschaubarkeit der Logic immer schlecht beeinflusst.

Lagere alle relevanten Codeteile in eigene Funktionen/Methoden aus.

Eine zu Einlesen des Verzeichnises, usw. usf.

MfG, Ulf

Re: Auf Inhalt von array zugreifen

am 10.08.2006 11:18:52 von Armin Aki

Okay Ulf ich versuche es zu erklären.

Kundenordner :
der wird angelegt sobald die ersten Fotos geladen werden.

Nun gibt es ein Script mit dem ich die Fotos für das Web
aktivieren. bzw. deaktivieren kann.

Zuvor hatte ich das ganze über eine ganz
normale Auflistung der Fotodateien realisiert.

Fotos werden aus dem Ordner geholt, dann in einer Schleife
mittels der Dateinamen in einer MYSQL Tabelle nachgesehen,
ob diese darin enthalten sind. Sind sie enthalten, dann sind sie aktiv.

Das ganze sa in etwa so aus :
//$direct & $folder werden mit dem Link übergeben

if(!empty($folder)) {
$handle =3D opendir("/home/www/...../$direct/$folder");
if($handle) {
while ($datei =3D readdir($handle)) {
if(($datei !=3D ".") && ($datei !=3D ".." )) {

$res=3Dexplode(" ",$datei);
$datname=3Dexplode("_",$res[0]);
$mbanr =3D $datname[0]; //1te Stelle des dateiannamens die KD Nummer
$pers =3D $datname[1]; //2te Stelle des Dateinames der Name der
Person
$fotono =3D $datname[2]; //3te Stelle des Dateinames die laufende
Fotonummer
$fodate =3D $datname[3]; //Zur Weiterverarbeitung des
Erstellungsdatum

$datend=3Dexplode(".",$res[0]);
$typ=3D$datend[1]; //Dateityp

$res1=3Dexplode(" ",$fodate);
$datum=3Dexplode(".",$res1[0]);
$fotodate=3D$datum[0]; // Holt das Dateum aus dem dateinamen


if($typ == "jpg") {

//Jetzt wird kontrolliert ob die Datei in der Talle enthalten ist und
somit im Web erscheint

$query_stat =3D " SELECT * FROM web_adressfotos WHERE
url_foto_file=3D'$datei' ";
$result3 =3D mysql_query($query_stat, $conn);
$foto =3D mysql_fetch_array($result3);
$fotoid =3D"$foto[id]";

//Wenn sie nicht enthalten ist wird eine Tabelle für die Ausgabe
erstellt
//Diese beinhaltet das Foto, einige Daten wie Fotonummer, Datum der
//Erstellung und Kundenname (Diese daten kommen aus dem Dateinamen),
//sowie eine Checkbox, für die Aktivierung

if($records == "0") {
$id =3D 1000 + $result3;
$fotocontainer[] =3D "

...
";
} else {
$fotocontainer[] =3D " ...
";
} }


Allerdings hatte ich das Problem, das ich die Dateien nicht sortieren
konnte.
Nach Daten die ich aus den Dateiinformationen wie Ladedatum oder
Dateigröße bringen mir nichts.
Also bleibt mir, meines Wissens nichts anderes übrig wie das ganze in
ein array zu holen, es dann zu sortieren um es dann erst auszugeben.
Mein Problem ist, da es ein mehrdimensionales array ist, wie ich bei
bedarf auf die einzelnen Positionen im Array in der entsprechenden
Schleife zugreifen kann.
Ich habe nun im Array die einzelnen Schlüssel :

$fotodat =3D array(
filename =3D> array(),
filepers =3D> array(),
fileno =3D> array(),
filedate =3D> array(),
filetyp =3D> array(),
);

Soweit funktioniert auch alles mit dem Auszug :

print_r(array_values($fotodat)); //Den Inhalt des Arrays zu Testzwecken
auslesen

bekomme ich alle Daten aufgelistet.

Erstelle dann die Schleife :
Für jedes Bild wiederum die Abfrage und die Tabelle erstellen.

foreach($fotodat as $key =3D> $wert) {
....

Jatzt muß ich aber bei z.B. : 50 Fotos in jeder Schleife
auf die zu dem Foto gehörenden Daten zugreifen.

Das ist das ganze Problem.

Was Dein Hinweise mit den Functionen angeht, hast Du recht. Ich
klammere später so weit wie es geht alles auf, verstaue es in
Funtionen in func.inc Datein, arbeite mit der Übergabe von Variablen
um diese function auch anderweitig zu verarbeiten und trenne den HTML
Code in tpl Dateien um sie aus dem PHP rauszubekommen.
Doch erst nachdem ich das Teil fertig habe und weiß das es
funktioniert.
Ich weiß nicht ob das die funktionellste Art ist aber für mich, die
effektivste, da ich nur eine Seite öffnen muß um nach den Fehlern zu
suchen.

Ich hoffe ich habe das soweit verständlich machen können.
Es geht eigentlich nur darum auf die einzelnen Varriablen des array
($fotodat) in der Schleife zuzugreifen.

Aber auf jeden Fall mal ein Dankeschön, das Du dir die Zeit und den
Nerv dafür nimmst=20

Grüße
Armin