Auslesen einer bestimmten Menge an rows + file_exists

Auslesen einer bestimmten Menge an rows + file_exists

am 23.12.2004 08:35:59 von Roman Zenner

Moin,

habe heute morgen ein Brett vorm Kopf: in einer DB stehen eine ganze
Menge von Datensätzen, wobei es zu einigen auch zugehörige files auf dem
Server gibt, die den gleichen Dateinamen wie die jeweilige id haben.
Über (file_exists) wird dann sozusagen die Datenbank mit dem filesystem
synchronisiert und das jeweilige file mit dem Datensatz angezeigt.
Soweit so gut.

Jetzt bin ich aber in einer Situation, in der ich die 5 neuesten
Datensätze aus der DB auslesen will, zu denen ein file auf dem Server
existiert. Mit LIMIT im SELECT-statement kann ich ja logischerweise
nicht arbeiten, weil meine DB ja sozusagen blind ist was diese files
angeht. Wie bekomme ich nun einen Loop hin, mit dem das script die
Existenz von einem file checkt und in der Summe nur 5 Datensätze
ausgibt? Zu allem Überfluss gibt es auch noch zwei verschiedene
locations, wo diese files sein könnten.

Gruss,
Roman

Re: Auslesen einer bestimmten Menge an rows + file_exists

am 23.12.2004 09:24:24 von Christoph Hermann

Roman Zenner schrieb:

Moin,

> habe heute morgen ein Brett vorm Kopf: in einer DB stehen eine ganze
> Menge von Datensätzen, wobei es zu einigen auch zugehörige files auf dem
> Server gibt, die den gleichen Dateinamen wie die jeweilige id haben.
> Über (file_exists) wird dann sozusagen die Datenbank mit dem filesystem
> synchronisiert und das jeweilige file mit dem Datensatz angezeigt.
> Soweit so gut.
>
> Jetzt bin ich aber in einer Situation, in der ich die 5 neuesten
> Datensätze aus der DB auslesen will, zu denen ein file auf dem Server
> existiert. Mit LIMIT im SELECT-statement kann ich ja logischerweise
> nicht arbeiten, weil meine DB ja sozusagen blind ist was diese files
> angeht. Wie bekomme ich nun einen Loop hin, mit dem das script die
> Existenz von einem file checkt und in der Summe nur 5 Datensätze
> ausgibt? Zu allem Überfluss gibt es auch noch zwei verschiedene
> locations, wo diese files sein könnten.

Ich würde das so machen (grob skizziert):

Hole 5 Datensätze aus der DB ORDER BY XY, und überprüfe wieviel Dateien Du
dann hast.
Ermittele die fehlende Anzahl der Dateien und hole soviel Datensätze aus der
DB WHERE XY grösser/kleiner je nachdem.
Das ganze kannst Du auch in eine Schleife verpacken bis die Anzahl (5)
erreicht ist.

Andererseits, wieso kann es den Fall geben dass die Datenbank inkonsistent
ist? Also dass Dateien in der DB stehen die es im Filesystem gar nicht
gibt? Ich würde eher hier ansetzen. (Für den Fall dass für einen
Datenbankeintrag keine Datei existiert wird dieser Wert eben auf NULL
gesetzt.)

HTH
Christoph

Re: Auslesen einer bestimmten Menge an rows + file_exists

am 23.12.2004 09:47:19 von Christoph Hermann

Roman Zenner schrieb:

Moin,

> > Hole 5 Datensätze aus der DB ORDER BY XY, und überprüfe wieviel
> Dateien Du
>> dann hast.
>> Ermittele die fehlende Anzahl der Dateien und hole soviel Datensätze aus
>> der DB WHERE XY grösser/kleiner je nachdem.
>> Das ganze kannst Du auch in eine Schleife verpacken bis die Anzahl (5)
>> erreicht ist.
>>
>> Andererseits, wieso kann es den Fall geben dass die Datenbank
>> inkonsistent ist? Also dass Dateien in der DB stehen die es im Filesystem
>> gar nicht gibt? Ich würde eher hier ansetzen. (Für den Fall dass für
>> einen Datenbankeintrag keine Datei existiert wird dieser Wert eben auf
>> NULL gesetzt.

> das ganze ist schnell erklärt, es handelt sich hier um ein News-System,
> bei dem User files raufladen können, also Videos oder Flashs. Nun gibt
> es aber News-items, die eben keinen multimedia-content haben, und die
> sollen separat dargestellt werden.

Und wieso steht in der Datenbank dann nicht dass keine Datei vorhanden ist?
SELECT newsid, newscontent, filename FROM news WHERE filename IS NOT NULL
LIMIT 5

Liefert Dir 5 datensätze die alle eine Datei haben.

> Und das wird eben dann ein Problem,
> wenn man eine bestimmte Anzahl von Datensätzen auslesen möchte.

Löse das Problem anstatt einen Workaround zu basteln.

> Was die Schleife angeht, wie kann ich da denn ein (file_exists)
> einbauen, sodaß php eine Grundlage hat, die Werte zu zählen?

$count = 0;
while ($count < 5) {
// hole kram
if (file_exists(...)) {
$count++;
}
}

HTH
Christoph

Re: Auslesen einer bestimmten Menge an rows + file_exists

am 23.12.2004 09:48:29 von Roman Zenner

> Hole 5 Datensätze aus der DB ORDER BY XY, und überprüfe wieviel
Dateien Du
> dann hast.
> Ermittele die fehlende Anzahl der Dateien und hole soviel Datensätze aus der
> DB WHERE XY grösser/kleiner je nachdem.
> Das ganze kannst Du auch in eine Schleife verpacken bis die Anzahl (5)
> erreicht ist.
>
> Andererseits, wieso kann es den Fall geben dass die Datenbank inkonsistent
> ist? Also dass Dateien in der DB stehen die es im Filesystem gar nicht
> gibt? Ich würde eher hier ansetzen. (Für den Fall dass für einen
> Datenbankeintrag keine Datei existiert wird dieser Wert eben auf NULL
> gesetzt.

Hallo Christoph,

das ganze ist schnell erklärt, es handelt sich hier um ein News-System,
bei dem User files raufladen können, also Videos oder Flashs. Nun gibt
es aber News-items, die eben keinen multimedia-content haben, und die
sollen separat dargestellt werden. Und das wird eben dann ein Problem,
wenn man eine bestimmte Anzahl von Datensätzen auslesen möchte.

Was die Schleife angeht, wie kann ich da denn ein (file_exists)
einbauen, sodaß php eine Grundlage hat, die Werte zu zählen?

Gruss,
Roman

Re: Auslesen einer bestimmten Menge an rows + file_exists

am 23.12.2004 10:03:30 von Roman Zenner

> Und wieso steht in der Datenbank dann nicht dass keine Datei vorhanden ist?
> SELECT newsid, newscontent, filename FROM news WHERE filename IS NOT NULL
> LIMIT 5
>
> Liefert Dir 5 datensätze die alle eine Datei haben.


Hi,

genau hier ist ja das Problem, bisher wird ja überhaupt gar nicht in der
Datenbank gespeichert, ob das file da ist oder nicht. Während des
image-upload bekommt halt das hochgeladene file die id des Datensatzes.
Jetzt wo ich darüber nachdenke, wäre es wahrscheinlich besser, hier
anzusetzen, als irgendwelche abgefahrenen Schleifenlösungen zu erfinden,
oder?

Gruss,
Roman

Re: Auslesen einer bestimmten Menge an rows + file_exists

am 23.12.2004 11:10:49 von Christoph Hermann

Roman Zenner schrieb:

Moin,

>> Und wieso steht in der Datenbank dann nicht dass keine Datei vorhanden
>> ist? SELECT newsid, newscontent, filename FROM news WHERE filename IS NOT
>> NULL LIMIT 5
>>
>> Liefert Dir 5 datensätze die alle eine Datei haben.

> genau hier ist ja das Problem, bisher wird ja überhaupt gar nicht in der
> Datenbank gespeichert, ob das file da ist oder nicht. Während des
> image-upload bekommt halt das hochgeladene file die id des Datensatzes.
> Jetzt wo ich darüber nachdenke, wäre es wahrscheinlich besser, hier
> anzusetzen, als irgendwelche abgefahrenen Schleifenlösungen zu erfinden,
> oder?

ja.
Siehe mein Beispiel oben.

mfg
Christoph

Re: Auslesen einer bestimmten Menge an rows + file_exists

am 23.12.2004 12:53:53 von dev-null-use-reply-adress

Roman Zenner schrieb:
>> Und wieso steht in der Datenbank dann nicht dass keine Datei vorhanden ist?
>> SELECT newsid, newscontent, filename FROM news WHERE filename IS NOT NULL
>> LIMIT 5
>
> genau hier ist ja das Problem, bisher wird ja überhaupt gar nicht in der
> Datenbank gespeichert, ob das file da ist oder nicht. Während des
> image-upload bekommt halt das hochgeladene file die id des Datensatzes.
> Jetzt wo ich darüber nachdenke, wäre es wahrscheinlich besser, hier
> anzusetzen, als irgendwelche abgefahrenen Schleifenlösungen zu erfinden,
> oder?

Richtig! Erweitere Deine DB-Tabelle also um eine ensprechende Spalte.
Dann schreibst Du Dir ein kleines Script, was *alle* Datensätze
durchgeht, bei jedem überprüft ob die Datei vorhanden (und vielleicht
auch lesbar) ist und dann ggf. ein UDATE auf den Datensatz macht.

Du solltest aber möglichst nur Dateinamen in der DB speichern, blos
keine Pfade. Das würde dann wieder eklig, wenn sich mal die Pfade,
z.B. bei einem Umzug, ändern. Pfade gehören immer in eine
config.inc.php, oder so.


Frohes Fest, JPM

--
http://www.textkritik.de/schriftundcharakter/sundc008tofu.ht m
http://www.kasper-online.de/goldmail/

Re: Auslesen einer bestimmten Menge an rows + file_exists

am 25.12.2004 17:15:43 von gregor herrmann

On Thu, 23 Dec 2004 12:53:53 +0100, Jens Peter Möller wrote:

> Richtig! Erweitere Deine DB-Tabelle also um eine ensprechende Spalte.
[..]
> Du solltest aber möglichst nur Dateinamen in der DB speichern,

oder alternativ einen booleschen Wert fuer "da gibts ein File dazu",
wenn der Dateiname eindeutig aus anderen Feldern (etwa der id wie beim
OP) generiert werden kann.

gregor
--
http://info.comodo.priv.at/ | gpg key ID: 0x00F3CFE4
infos zur usenet-hierarchie at.*: http://www.usenet.at/
member of https://www.vibe.at/ | how to reply: http://got.to/quote/