Zu einer Zeile bringen

lisali

Erfahrenes Mitglied
Hallo!

Ich baue gerade eine Mitglieder-Suchfunktion. Wenn man anklickt, dass nur Mitglieder mit Profilfoto angezeigt werden sollen, werden auch nur diese mit Foto ausgegeben. Wenn man kein Häkchen setzt, ist es egal.

Und allgemein bleibt die Ausgabe ja immer die selbe, ob nun mit oder ohne Foto.
Ich habe folgenden Code:

PHP:
if (!empty($_POST['img']))
	{
$file = "img/users/".$user[id].".jpg";
if (file_exists($file))
		{
		echo "$user[username]"; #1
		}
	}
	else
	{
	echo "$user[username]"; #1
	}
}

Mein Problem ist jetzt, dass die (mit #1 markierte) Zeile ja dann im Grunde identisch sein soll.
Und ich werde den Code ja layout-technisch weiter ausbauen und am Ende wahrscheinlich viel Code zu stehen haben... und dieser wäre ja dann immer noch identisch.
Und das Problem ist nun, dass ich nach einer Möglichkeit suche, dass ich irgendwie den Code umbaue, dass ich eben nur eine Zeile brauche... jedoch weiß ich gerade nicht wie... rein von der Logik her.

Ich habe auch daran gedacht, dass ich einfach eine Variable für die ganze Layout-Struktur setze, aber das wäre auch nicht so sinnvoll, da es bestimmt dazwischen noch andere SELECTS, usw. geben wird.
Oder ich würde eine Funktion bauen, aber das scheint mir irgendwie verschwenderisch nur für diesen einen Fall...

Kann ich das irgendwie umbauen?

Danke im Voraus!


Liebe Grüße,

Lisa
 
Hallo!

file_exists() lässt mich vermuten dass Du in der Datenbank nicht hinterlegt hast ob ein Bild vorhanden ist oder nicht.
Ich weiss nicht wie andere es sehen, aber ich würde Dir dringend raten dieses zu ändern.

Warum?
Nun, wenn nicht bereits geschehen wird früher oder später eine Blätterfunktion hinzukommen.
Ohne den Status in der Datenbank zu hinterlegen müsstest Du alle Dateien in einem Rutsch prüfen.
Andernfalls wüsstest Du nicht wie viele Suchergebnisse Du bekommen wirst und könntest so auch nicht bestimmen wie viele Seiten es werden.

Daher mein Tip:
Lege noch eine Spalte (z.B. "Bildstatus") an.
Als default-Wert wird "0" (kein Bild) gesetzt und wenn ein Bild vorhanden ist, wird dieser Wert auf "1" gesetzt.
Wenn das Bild wieder gelöscht wird, muss der Wert natürlich auch wieder auf "0" gesetzt werden.

Nun prüfst Du ob bei der Suchfunktion $_POST['img'] angekreuzt wurde.
Wenn ja, dann könnte die Abfrage so aussehen:
PHP:
"SELECT * FROM `tabelle` WHERE `Bildstatus`=1"

Und wenn alle User (also mit und ohne Bild) angezeigt werden sollen, machst Du z.B. so eine Abfrage:
PHP:
"SELECT * FROM `tabelle`"

Du könntest diese beiden Abfragen aber auch kombinieren, z.B. so:
PHP:
"SELECT * FROM `tabelle` WHERE `Bildstatus`=".mysql_real_escape_string($_POST['img'])

Alle Abfragen kannst Du auch gleich mit LIMIT für die (kommende) Blätterfunktion kombinieren.

Für die HTML-Formatierung prüfst Du in der while()-Schleife was in der Spalte "Bildstatus" steht und gibst dem endsprechend den HTML-Code aus..... z.B. so:
PHP:
echo ($row['Bildstatus']!=0?"<img src=\"img/users/".$user['id'].".jpg\" alt=\"".$user['username']."\">":"No<br>Image");


So, ich hoffe ich habe mich da jetzt nirgendwo vertan..... ist halt nicht geprüft. *g*

Gruss Dr Dau
 
Zuletzt bearbeitet:
Neben dem was Dr. Dau geschrieben hat, wieso sollte sowas nicht funktionieren?
PHP:
<?php
if (!empty($_POST['img'])) { 
	if (file_exists("img/users/".$user[id].".jpg")) {
		$pic = $file;
	}
    else { 
		$pic = 'pfad/zum/default_bild.jpg';
    }
}
?>
<h1><?=$user['username']?></h1>
<p><img src="<?=$pic?>" /></p>


Zwischen dem PHP und dem Html kannst du doch soviele Selects machen wie du willst.
 
An Loomes:

Weil es nicht darum geht, dass das Bild entweder angezeigt oder nicht angezeigt wird, sondern die ganze Ausgabe der Benutzerspalte in der Ausgabe des Suchergebnisses gar nicht erst erfolgt. Vielleicht hast du mich missverstanden!?

An Dr. Dau:

Erstmal vielen herzlichen Dank für die Mühe! So ausführlich habe ich bisher nie hier eine Antwort bekommen. :)

An die Möglichkeit dachte ich auch schon und da ich sowieso auch vorhatte ein Bewertungssystem für das Profilbild einzubauen, habe ich jetzt die neue Tabelle "users_img" erstellt mit der Spalte user_id und rating.
An eine Extra-Spalte (wie z.B. Bildstatus) in der eigentlichen "users"-Tabelle dachte ich auch, aber mit der Extra-Tabelle "users_img" umgehe ich ja eine Extra-Spalte, die eventuell für einige Benutzer ganz leer bleiben würde und zugleich habe ich eben noch das Bewertungssystem.
Und ich dachte mir das nämlich so, dass eben nur wenn ein Eintrag überhaupt vorhanden ist in der "users_img" mit der jeweiligen user_id, muss zeitgleich logischerweise ein Bild vorhanden sein, unabhängig davon wie hoch nun die Bewertung ist (kann ja auch auf 0 gesetzt sein, der Datensatz mit der entsprechenden user_id zählt ja).

Aber jetzt habe ich einige Fragen diesbezüglich:

PHP:
"SELECT * FROM `tabelle` WHERE `Bildstatus`=".mysql_real_escape_string($_POST['img'])

Du meintest damit kombiniert man zwei SELECT-Befehle? Leider habe ich mich mit der Funktion "mysql_real_escape_string" noch nie beschäftigt... was genau passiert da jetzt? Heißt das, dass nur wenn $_POST['img'] existiert, auch danach gesucht wird oder wie genau?

Nun... und da ich nun eine weitere Tabelle - und nicht Spalte - habe, stehe ich irgendwie wieder oder immer noch auf dem Schlauch, wie genau ich am Besten vorgehen könnte.

Vielleicht liegt es daran, dass ich mich wegen der Hitze auch nicht so gut konzentrieren kann, aber irgendwie komme ich vom Ablauf-Grundgerüst im logischen Sinne noch nicht ganz hinterher.

Würde mich sehr über weitere Hilfe freuen! Vielen Dank im Voraus!

Liebste Grüße,

Lisa


Nachtrag:

Mein Code sieht momentan so aus:

PHP:
<?
if (!empty($_POST['status'])){ $check_status = " AND TIMESTAMPDIFF(MINUTE,time,NOW()) >= 15"; }
$result = mysql_query("SELECT id,username FROM users WHERE 
(gender='".$_POST['gender']."') AND 
(TIMESTAMPDIFF(YEAR,birth,NOW()) BETWEEN '".$_POST['from_age']."' AND '".$_POST['to_age']."') AND 
(plz='".$_POST['plz']."') AND 
(relationship='".$_POST['rship']."')".$check_status."");

while ($user = mysql_fetch_array($result)) 
{
if (!empty($_POST['img']))
{
$count = mysql_fetch_array(mysql_query("SELECT COUNT(user_id) FROM users_img WHERE user_id='$user[id]'"));
if (!empty($count[0]))
	{
	echo "$user[username]"; #1: Ausgabe
	}
}

?>

Hierbei erfolgt die Ausgabe logischerweise aber nur dann, wenn ein Bild vorhanden ist... und genau das ist ja das Problem. Ich weiß nicht wie ich es anstelle, dass die Ausgabe erfolgt, wenn kein Häkchen bei "nur Profile mit Foto anzeigen" gemacht worden ist, OHNE dass ich eben zwei Mal den identischen Code für die Ausgabe (#1) schreibe...
 
Zuletzt bearbeitet:
An eine Extra-Spalte (wie z.B. Bildstatus) in der eigentlichen "users"-Tabelle dachte ich auch, aber mit der Extra-Tabelle "users_img" umgehe ich ja eine Extra-Spalte, die eventuell für einige Benutzer ganz leer bleiben würde und zugleich habe ich eben noch das Bewertungssystem.
Die Extraspalte bleibt nicht leer..... entweder steht dort "0" oder "1", je nachdem ob ein Bild vorhanden ist oder nicht.

Und ich dachte mir das nämlich so, dass eben nur wenn ein Eintrag überhaupt vorhanden ist in der "users_img" mit der jeweiligen user_id, muss zeitgleich logischerweise ein Bild vorhanden sein, unabhängig davon wie hoch nun die Bewertung ist (kann ja auch auf 0 gesetzt sein, der Datensatz mit der entsprechenden user_id zählt ja).
Dann müsstest Du aber die Abfrage davon abhängig machen ob mit oder ohne Blid angezeigt werden soll.
Wenn also nur User mit Bild angezeigt werden sollen, musst Du "users_img" abfragen.
Sollen aber alle User angezeigt werden, musst Du "users" Abfragen.

In meinem Beispiel würdest Du aber immer "users" abfragen.
Und je nach Bildstatus (IF-Bedingung) einen Subselect auf "users_img" ausführen.

Aber jetzt habe ich einige Fragen diesbezüglich:

PHP:
"SELECT * FROM `tabelle` WHERE `Bildstatus`=".mysql_real_escape_string($_POST['img'])

Du meintest damit kombiniert man zwei SELECT-Befehle?
Ja, vorausgestzt $_POST['img'] ist dafür zuständig ob nur User mit Bild angezeigt werden sollen.
Wenn $_POST['img'] keinen value-Wert enthält, dann schickt das Formular entweder eine "0" (nicht angekreuzt) oder eine "1" (angekreuzt).
Daher auch die Werte "0" und "1" in der Spalte "Bildstatus".

Leider habe ich mich mit der Funktion "mysql_real_escape_string" noch nie beschäftigt... was genau passiert da jetzt?
Ein Blick ins PHP-Manual würde Dir verraten dass mysql_real_escape_string() bestimmte Zeichen maskiert.
Hiermit soll verhindert werden dass anderer Code eingefügt werden kann und somit u.U. aus jeder beliebigen Tabelle jeglicher Inhalt ausgelesen und/oder Inhalt gelöscht/geändert werden kann (SQL-Injection).
Also eine reine Sicherheitsfunktion.
Kleiner Tip: "http://de.php.net/Funktionsname" führt in den meisten Fällen zur jeweiligen Funktionsbeschreibung.
"Funktionsname" muss natürlich mit dem jeweiligen Funktionsnamen ersetzt werden, für "mysql_real_escape_string()" wäre es also http://de.php.net/mysql_real_escape_string.

Heißt das, dass nur wenn $_POST['img'] existiert, auch danach gesucht wird oder wie genau?
Nein, es wird immer gesucht..... entweder nach "0" oder nach "1" (s.o.).


Hierbei erfolgt die Ausgabe logischerweise aber nur dann, wenn ein Bild vorhanden ist... und genau das ist ja das Problem.
Du solltest Dir angewöhnen den Code leserlich zu formatieren.

Ausserdem ist es ratsam Spalten- und Tabellennamen in Backticks zu setzen.
Zum einen weil man so einfacher erkennt dass es sich um Spalten- bzw. Tabellennamen handelt und zum anderen, was noch viel wichtiger ist, man so schneller Fehler aufspüren kann (z.B. Schreibfehler).
Ausserdem dürfen bestimmte Namen nicht für Spalten/Tabellen verwendet werden, weil sie evtl. mit MySQL-Funktionen identisch sind oder in einer späteren Version identisch werden könnten.
Mit Backticks umgehst Du dieses Problem und beugst somit auch Fehlern vor.
PHP:
`spaltenname`
`tabellenname`
 
Vielen Dank für die ausführliche Erklärung und auch die Ratschläge! Darauf werde ich in Zukunft sicherlich achten.

Ich dachte, dass ich mir eben diese Extra-Spalte in der user-Tabelle sparen könnte, wenn ich doch sowieso eine user_img-Tabelle habe, aber jetzt habe ich es auch verstanden.
Ich lege eben sehr viel Wert auf Belastbarkeit der gesamten Datenbank-Struktur, usw. Aber wahrscheinlich bleibt mir da nur übrig, dass ich diese Extra-Spalte erstelle... es sei denn, man könnte das noch mit einer anderen Maßnahme lösen... wie vielleicht mit einem tabellenübergreifenden JOIN oder dergleichen, wo geprüft wird, ob selektierter Benutzer auch wirklich einen Eintrag hat (was zugleich bedeutet ein Bild ist vorhanden)?

Danke!

Liebe Grüße,

Lisa

----
Edit:

Also, ich habe es jetzt hinbekommen mit `users` LEFT OUTER JOIN `users_img` ohne eine Extra-Spalte in `users` zu erzeugen. Soweit funktioniert auch echt so ziemlich alles prima, jedoch bin ich etwas unzufrieden mit der PLZ-Suche.

Die sieht bei mir so aus:

PHP:
if (!empty($_POST['plz'])){ $check_plz = " AND (`users`.plz LIKE '".$_POST['plz']."%')"; }

Gibt man 132 ein, erhält man praktisch ja alle dessen PLZ mit 132 anfängt. Ich vergleiche das jetzt aber z.B. mit einem anderen Suchsystem einer Community und habe dort mal "00000" eingegeben.
In dem Falle würde bei meiner Suche kein Ergebnis kommen (selbst wenn es 00001 wäre, was ja dann nicht als "empty" gilt). Bei dieser Community kommen dann aber alle Mitglieder beginnend mit der PLZ "01".
Ähnlich passiert das bei der Eingabe von "12300". Da werden auch alle Mitglieder beginnend mit "123" angezeigt.
Wie wurde das wahrscheinlich realisiert?
 
Zuletzt bearbeitet:
Zurück