• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[MYSQL] Fehlermeldungen nach EXPLAIN

dertypdernixkan

New member
Morgen!

Wie oben schon fast zu erahnen ist, es geht um den mySQL-Parameter EXPLAIN.

Ich bin seit einigen Tagen daran, meine Abfragen zu optimieren. Dazu stelle ich einer jeden SELECT das Präfix EXPLAIN voran. Bisher immer mit gewünschtem Ergebnis. Nun jedoch komme ich zu einer Tabelle bei der mir stattdessen Notice um die Ohren fliegen. Was erstmal nicht schlimm ist, jeder gefundene Fehler war ein Fehler zu viel. Allerdings kapiere ich nicht, warum mir NUR dann diese Fehler angezeigt werden wenn ich EXPLAIN benutze.

PHP:
EXPLAIN SELECT u.id,u.user_id,u.user_name,u.user_avatar,u.user_sex,u.user_show FROM user AS u INNER JOIN freunde AS f ON f.friend_id = u.id WHERE f.my_id = '".$_SESSION['id']."' AND f.friendship_stand = '1' AND f.blocked = '0' AND (u.user_status != '0' OR u.user_status != '5' OR u.user_status != '6' OR u.user_status != '7') ORDER BY u.user_name ASC

Auf diesen Ergebnissen wird, falls Freunde vorhanden sind, aus der Datenbank für die onliner ebenfalls abgefragt ob sie online sind oder nicht. Diese Ergebnisse (falls vorhanden) werden ebenfalls im Weiteren aufbereitet. Ich habe im PHP-Teil alle möglichen Fälle berücksichtigt, ohen EXPLAIN kommt es nämlich zu keiner Fehler Oder Notice-Meldung.

BSP.

PHP:
} elseif (isset($row_o['online_user_id']) AND $row['user_show'] == '0') {

Die Notice:

PHP:
Notice: Undefined index: user_show in C:\xampp\htdocs\...

Kann es daran liegen, dass der Wert für "user_show" entweder 1 oder 0 ist? Wird hier der Wert 0 wie empty() bzw. !isset() behandelt?
 
Zeig mal bitte den kompletten Query wie er ausgeführt wird.

PS: "Abfragen optimieren" mit EXPLAIN? Naja... EXPLAIN ist zwar ziemlich nützlich, aber im Produktiveinsatz verursacht es nur mehr Output und verlangsamt die Abfrage...
 
Hallo j-l-n

der Query wird so ausgeführt wie er oben angegeben ist. Nur dass im Falle -Freunde vorhanden- in der WHILE noch eine Abfrage über deren Onlinstatus gemacht wird.

Ich habe ja gar nicht vor ihn im Produktiveinsatz zu verwenden sondern nur um die Abfragen zu verbesser ;)
 
Hmm... bist du sicher, dass das die richtige Stelle im Code ist? Ich kann dort nichts erkennen, was diesen Fehler hervorrufen würde. Die SQL-Abfrage sieht auch erstmal ok aus.

Kannst du uns bitte noch die komplette Fehlermeldung und bisschen mehr Code zeigen?
 
Ein paar Auffälligkeiten von mir ...

- Du verwendest einmal $row und einmal $row_o (und nur der ist auf isset() getrimmt).
- INNER JOIN wird Dir ein anderes Ergebnis liefern, wenn niemand online/verfügbar ist ("Freunde offline" würde damit IMO nicht gehen)
- u.user_status könnte auch so gehen: u.user_status BETWEEN 1 AND 4 (sofern das alle denkbaren Stati sind und Du nicht wirklich Strings nimmst)
- Ticks (`) um Spalten- und Tabellennamen würden die Abfrage beschleunigen (Du nimmst damit dem Parser Arbeit ab und identifizierst direkt die NICHT-Standardbefehle)
- meine Paranoia schreit, wenn sie eine ungeparste Session-Variable in einem Query sieht
- gibt es einen anderen Status für "friendship_stand" als 1? (womöglich "pending"?; reine Neugier)
- schreibe bitte Deine Queries nicht als Einzeiler; liest sich ultra-schlecht und wenn Du es später selbst wartest, bekommst vorzeitig einen an der Murmel

Womöglich wäre eine Abfrage auf `freunde` mit LEFT JOIN auf `user`, Bindung wie gezeigt hilfreicher - und schneller (und es wären immer alle Spalten präsent). Sinnwahrend schieße ich mal ins Blaue und ich gehe davon aus, dass "my_id" in "f" nicht der "primary key" ist.

Code:
SELECT 
	`f`.`friend_id`,
	`u`.`user_name`,
	`u`.`user_avatar`,
	`u`.`user_sex`,
	`u`.`user_show` 
FROM 
	`freunde` as `f` 
		LEFT JOIN `user` as `u` ON
			`f`.`friend_id` = `u`.`id`
WHERE 	`f`.`my_id`='" . $_SESSION['id']."' AND 
		`f`.`friendship_stand`=1 AND 
		`f.blocked`=0 AND 
		`u`.`user_status` BETWEEN 1 AND 4
ORDER BY 	`u`.`user_name` ASC;

Wie aber schon angesprochen: Drop mal die beiden CREATE-Anweisungen mit einigen INSERTS zwecks Replikation hier bei "uns".

Ansonsten gilt: Viel Erfolg!
 
@rico2009

Die Fehlermeldunegn sind immer dieselben, es geht um user_show. Der Wert ist wie gesagt entweder 1 oder 0.


@steelwheel

Ja die Stelle ist richtig, auch die Abfrage bzw. der Query ist korrekt! Dass ich einmal row und row_o benutze liegt daran, dass row_o aus einer weiteren in der while-Schleife liegenden abfrage stammt.

- INNER JOIN wird Dir ein anderes Ergebnis liefern, wenn niemand online/verfügbar ist ("Freunde offline" würde damit IMO nicht gehen)

genau aus dem Grund liegt eine zweite Abfrage in der while.

- u.user_status könnte auch so gehen: u.user_status BETWEEN 1 AND 4 (sofern das alle denkbaren Stati sind und Du nicht wirklich Strings nimmst)
- Ticks (`) um Spalten- und Tabellennamen würden die Abfrage beschleunigen (Du nimmst damit dem Parser Arbeit ab und identifizierst direkt die NICHT-Standardbefehle)

Stimmt, habe ich gar nicht mehr dran gedacht! -.-


- meine Paranoia schreit, wenn sie eine ungeparste Session-Variable in einem Query sieht

Sie ist für diesen Thread drin, hätte auch 1 2 oder 3 schreiben können :D


- gibt es einen anderen Status für "friendship_stand" als 1? (womöglich "pending"?; reine Neugier)

Es gibt noch 0 für beendete friendships mit der Option sie wieder aufzunehmen


Sinnwahrend schieße ich mal ins Blaue und ich gehe davon aus, dass "my_id" in "f" nicht der "primary key" ist.

Stimmt, ist eine Indexspalte.

Ich teste mal mit LEFT JOIN... moment

- - - Aktualisiert - - -

Okay, ich habe den Fehler für die Notice gefunden, allerdings kann ich mir nicht erklären wie der zustande kommt. EXPLAIN erzeugt zwei Leerausgaben statt die Daten der Freunde anzuzeigen.

Code:
<div id="fl"><h4>Freunde</h4><hr size="1">

<div class="buddy  " id="user_id_"><div id="msg_placeholder"><a href="javascript:pn('');"><img height="22" width="22" border="0" class="friend_pic" id="buddy_img_" name="" src="/avatars/owlee.png"></a></div><div><a class="bl_user " href="/"></a></div><span class="sex" id=""></span></div>

<div class="buddy  " id="user_id_"><div id="msg_placeholder"><a href="javascript:pn('');"><img height="22" width="22" border="0" class="friend_pic" id="buddy_img_" name="" src="/avatars/owlee.png"></a></div><div><a class="bl_user " href="/"></a></div><span class="sex" id=""></span></div>

</div>


/normal sollte es so aussehen/
<div id="fl"><h4>Freunde</h4><hr size="1">

<div class="buddy available online" id="user_id_30436169815"><div id="msg_placeholder"><a href="javascript:pn('Owlee');"><img height="22" width="22" border="0" class="friend_pic" id="buddy_img_30436169815" name="30436169815" src="/avatars/owlee.png"></a></div><div><a class="bl_user online" href="/owlee">Owlee</a></div><span class="sex" id="w"></span></div>

</div>



Jemand ne Idee warum und wieso?

- - - Aktualisiert - - -

LOL ich bin doch so bekloppt!

Ich habe vergessen print_r() zu nutzen, mit EXPLAIN werden die Daten ja auch nur in einem Array ausgegeben! Mein Fehler, kann gescjlossen werden!


Danke noch an @steelwheel dein SELECT ist gut allerdings funktioniert BETWEEN nicht
 
Zuletzt bearbeitet:
Zurück
Oben