Zum Inhalt springen

PHP/mySQL Frage

Erstellt am 10. August 2003 · 5 Antworten · letzte Antwort am 11. August 2003

Tags: Frage

Shinji ·

Hallo !

Schreibe gerade an einem Backendmodul und hänge bei einer einfachen mySQL Abfrage.

Ich möchte in ALLEN Tabellen in der Spalte 'image' nach dem Namen webdesign.jpg suchen lassen. Mit meinem PHP Code wird die Datei auch in zwei Tabellen gefunden. Und zwar in tt_content und tt_guest. Das ist aber völliger Quatsch, denn in tt_guest existiert weder eine Spalte 'image' noch der Text 'webdesign.jpg'.

Das selbe mit der Datei 'Skaten_Kind_durch.JPG' die nur in der 'image' Spalte der Tabelle tt_news vorkommen sollte. Mein Script findet die aber überhaupt nicht in einer der Tabellen.

Warum bloß wird nichts in tt_news gefunden, dafür aber immer in tt_guest in der es keine Bilder gibt?

Das sprengt hier eventuell den Rahmen, aber könnte eventuell jemand einmal das Script überfliegen und mir sagen ob er auf Anhieb einen Fehler findet?

// $todelete ist ein Array mit allen Dateinamen aus uploads/pics

$delpic = $delpic2 = 0;
foreach ($todelete as $value){
    $query0 = "show tables";
    $res0 = mysql(TYPO3_db,$query0);
    while ($table = mysql_fetch_array($res0)) {
        // Suche in allen Tabellen nach einem GELÖSCHTEN Verweis auf $value
        $query = "SELECT * FROM ".$table[0]." WHERE deleted = 1 AND image = '$value'";

        // Suche in allen Tabellen nach einem Verweis auf $value
        $query2 = "SELECT * FROM ".$table[0]." WHERE image = '$value'";

        if ($res = mysql(TYPO3_db,$query)) $result = mysql_fetch_assoc($res);
        if ($res2 = mysql(TYPO3_db,$query2)) $result2 = mysql_fetch_assoc($res2);

        // Gibt es einen gelöschten Verweis auf $value kann $value auch gelöscht werden
        if ($result["image"] == $value) $delpic = $delpic+1;

        // Gibt es einen Verweis auf $value kann $value nicht gelöscht werden
        if ($result2["image"] == $value) $delpic2 = $delpic2+1;

    } // ENDE While-Schleife
    if ($delpic > 0) {
        $content .= "<tr>";
        $content .= "<td bgcolor="#FFAD37">$value</td><td bgcolor="#E0FF82" width="40"><a href="index.php?cmd=clear&file=$value" onCLick>".$LANG->getLL("clear")."</a></td>";
        $content .="</tr>";
    }

    if ($delpic2 == 0) {
        $content .= "<tr>";
        $content .= "<td bgcolor="#C0FF03">$value</td><td bgcolor="#E0FF82" width="40"><a href="index.php?cmd=clear&file=$value" onCLick>".$LANG->getLL("clear")."</a></td>";
        $content .="</tr>";
    }
    $delpic = $delpic2 = 0;
}  // ENDE ForEach

Den kompletten Code gibt es als Extension mit dem "Privat lookup key" 2178-c24c

Ich würde mich riesig freuen, wenn mir jemand helfen könnte.

Gruß
Thorsten

Shinji ·

Ich habe jetzt herausgefunden das es wohl am Dateinamen liegt. Wenn ich z.B. in phpMySQL in der Suche den String

Skaten_Kind_durch.JPG

eingebe und "genau diese Zeichenkette" angebe wird nicht gefunden. Gebe ich jedoch "alle Wörter" oder "als regulären Ausdruck" an wird der Suchstring in der Tabelle sys_log und tt_news gefunden wie es sein sollte.

Was muss ich denn anstatt

WHERE image = '$value'

schreiben damit die Strings mit den _ gefunden werden?

Habe es auch schon einmal mit

WHERE image LIKE '%$value%'

versucht. hat aber auch nicht funktioniert. :-(

Gruß
Thorsten

dj.​picasso ·

Hi Shinji,

also erst einmal würde ich zu Deinem Skript sagen:
Hiermit hast Du eine Möglichkeit gefunden Deinen Server komplett in die Knie zu zwingen, und das noch nicht einmal lang- sondern kurzfristig.

1. // $todelete ist ein Array mit allen Dateinamen aus uploads/pics
Hier wird ja wohl einiges an Daten zusammenkommen!
... und dann schickst Du eine foreach + while-Schleife mit 2 Queries hinterher
2. foreach ($todelete as $value){
3. while ($table = mysql_fetch_array($res0)) {
// Suche in allen Tabellen nach einem GELÖSCHTEN Verweis auf $value
$query = "SELECT * FROM ".$table[0]." WHERE deleted = 1 AND image = '$value'";
// Suche in allen Tabellen nach einem Verweis auf $value
$query2 = "SELECT * FROM ".$table[0]." WHERE image = '$value'";

Das erst einmal dazu.
Zu Deiner Query:
Das kann erst einmal nur mit LIKE '%$value%' funktionieren.
Ich würde an Deiner Stelle mal die Übergabe der $value kontrollieren.
Bist Du Dir sicher, dass sie so ankommen, wie Du es meinst?
Lass Dir doch mal mit echo $query; anzeigen, wie die Queries aussehen.

Generell:
Du solltest Dir überlegen, ob es keine andere Möglichkeit gibt, Deine Queries anders aufzubauen.
Ich weiß zwar nicht was Du machen möchtest, aber schon mal über die Verwendung von IN nachgedacht.

Ciao
Der DJ

Shinji ·

Hallo !

Was ich machen will?
Ich will im Verzeichnis uploads/pics alle nicht mehr benötigten Dateien per Mausklick löschen lassen. Aber dazu muss ich ja

1) Alle vorhandenen Dateien auslesen und in ein Array speichern
2) Kontrollieren ob die Datei in einer Tabelle benutzt wird
3) Kontrollieren ob die Datei in einer Tabelle benutzt wird, die Zeile aber das deleted Bit gesetzt hat.

Wenn NICHT 2) => Datei zum Löschen freigeben
Wenn 3) zutrifft => Datei zum Löschen freigeben

Dafür muss ich halt für jede Datei die beiden Abfragen durchführen, oder?

Aber ich glaube, ich sehe das Problem.
Es ist der Datentyp des Image Feldes. Der ist nämlich BLOB bzw TinyBLOB. Und wenn ich da mit einer Abfrage drangehe wird nur der erste Dateiname ausgelesen. Die zweite Datei wird nicht beachtet.

Ich habe es schon einmal mit

SELECT * FROM tt_news WHERE image RLIKE BINARY bild01.jpg'

probiert. Wenn man später mit print_r() das Array ausgibt erhält man z.B.

'bild01.jpg, bild02.jpg'

Ein

SELECT * FROM tt_news WHERE image RLIKE BINARY bild02.jpg'

bringt jedoch kein Ergebnis.

Nein, mit IN habe ich es noch nicht probiert.
Was macht IN denn?

Gruß
Thorsten

dj.​picasso ·

Hi,

also bei mir funktioniert folgendes einwandfrei (habe es getestet):
Für ein einzelnes Bild:
SELECT * FROM tt_news WHERE image like '%bildername_250_neu.jpg%'

Hier bekommst Du alle Datensätze mit entsprechend der Liste der Bilder (aber alles mit nur einer Query)
SELECT * FROM tt_news WHERE image in ('Bild1.jpg', 'Bild2.jpg')

Du solltest dann noch den * durch die Feldnamen ersetzen. Ist schneller!

Ciao
Der DJ

Shinji ·
dj.picasso schrieb

SELECT * FROM tt_news WHERE image in ('Bild1.jpg', 'Bild2.jpg')

Das mit dem IN sollte ich mir einmal ansehen.
Danke.

Habe in der Zwischenzeit das Problem auf meine Art gelöst. :-)
Kannst dir die Extension ja einmal ansehen:

Lookup key: 2179-2670

Gruß
Thorsten