Datenbankabfrage und Inhalt eines Verzeichnisses

03/11/2012 - 09:57 von Sigbert Helle | Report spam
Hallo Leute,

eh ich mich (mal wieder) völlig verzettele, frage ich lieber mal:

Ich frage aus einer DB (MySQL) eine Liste "tblListe" ab (zur Zeit ca.
3500 Eintràge). Das Ergebnis soll nur die Eintràge enthalten, deren ID
mit einem (bzw. zwei) Dateinamen aus einem Verzeichnis "Dateien"
übereinstimmen, z.B. ID: 4231 - Dateien A-4231.pdf und A-4231-X.pdf
Die Anzahl der Dateien in "Dateien" bleibt wohl immer deutlich unter der
Anzahl der Datensàtze in tblListe.

Wie gehe ich da sinnvoll vor:
1. Abfrage aus der DB mit allen Datensàtzen, dann die auslesen für die
file_exists etwas liefert
oder
2. mit readdir das Verzeichnis auslesen und dann eine Abfrage machen,
die gleich die passenden Datensàtze ausliest?

Ich würde mich als leicht fortgeschrittenen Anfànger bezeichnen.
Die erste Variante ist mir klar. Das mache ich auch schon bei diversen
Abfragen, wo dann beim Erzeugen einer html-Seite jeweils geschaut wird,
ob solch eine Datei in "Dateien" vorhanden ist und dann auf der Seite
ein Link gebastelt wird.
Wie ich Nr. 2 (das mir sinnvoller erscheint)anpacken soll, weiß ich
nicht: Ich hab das Ergebnis von readdir, und dann?

Gruß
Sigbert Helle
 

Lesen sie die antworten

#1 Ulf K.adner
03/11/2012 - 13:21 | Warnen spam
On 03.11.2012 09:57, Sigbert Helle wrote:

Wie gehe ich da sinnvoll vor:
1. Abfrage aus der DB mit allen Datensàtzen, dann die auslesen für die
file_exists etwas liefert



ui :-)

oder
2. mit readdir das Verzeichnis auslesen und dann eine Abfrage machen,
die gleich die passenden Datensàtze ausliest?



Eher 2.

Wie ich Nr. 2 (das mir sinnvoller erscheint)anpacken soll, weiß ich
nicht: Ich hab das Ergebnis von readdir, und dann?



Was soll passieren nenn nicht ein oder zwei, sondern mehr Dateien mit
selben numerischen Dateinamensanteil existieren? Da wàre die
Verfahrensweise nàhmlich u.U. anders falls nur die beachtet werden
sollen die maximal 2x vorkommen.

Wenn das egal ist:

$files = array();
$sql = 'SELECT `foo`, `bar` FROM `table` WHERE (';
if ( $handle = \opendir('/foo/bar') )
{
$i = 0;
while ( false !== ( $item = eaddir($handle) ) )
{
if ( '.' $item || '..' $item ) continue;
$filename = \basename($item);
if ( !\preg_match('~^A-([1-9]\d*)(-X)?\.pdf$~', $filename, $m) )
continue;
$id = \intval( $m[1] );
if ( \in_array($id, $files) ) continue;
$files[] = $id;
if ($i > 0) $sql .= ' || ';
$sql .= "`id`={$id}";
$i++;
}
\closedir( $handle );
}
if ( $i < 1 ) die('Es gibt nix zu tun!');
$sql .= ')';

Und Dann das $sql Statement am DBMS ausführen.

Aber wenn es sich um viele Dateien handelt wird das unperformant.

Gruß, Ulf

Ähnliche fragen