Column 'id' in where clause is ambiguous

Godstyle

Erfahrenes Mitglied
Hallo leute.

folgendes script beinhaltet das Problem:

PHP:
$last = time() - 300;
$min2 = 1 ;
    $chk_friend2 = mysql_query("SELECT COUNT(*) as zahl FROM `friends`, `ow_login`
	 where
	`user2` = '".$_SESSION["usid"]."' || `user1` = '".$_SESSION["usid"]."' 
	&& 
	`user1` = `id` || `user2` = `id` 
	&& 
	`last_active` >= $last ");
 if (!$chk_friend2) {
    echo "Anfrage ($ergebnis) konnte nicht ausgeführt werden : " . mysql_error();
  exit;
 }
$ausgabe2 = mysql_fetch_array($chk_friend2);

echo $ausgabe2[zahl];

Aufbau der tabellen:

ow_login = id ..... last_active
friends = id | user1 |user2 | status

jetzt soll die abfrage prüfen ob user1 und user 2 befreundet sind und wenn ja prüfen ob die befreundete Person innerhalb der letzten 5 min etwas getan hat.

Mein Problem ist nun wie der titel bereits angibt, das der wert "id" doppelt belegt ist. Kann ich dem script irgendwie mitteilen, dass er den bei User1 oder user2 eingetragenen wert mit der id die sich in ow_login befindet vergleicht?

Habe es versucht mit ow_login.id aber diese art der zuweisung wird nicht akzeptiert da er nach einer spalte mit exaktem namen sucht.

MFG
 
Als erstes mal das SQL in eine Lesbare Form bringen und im WHERE -Teil Kalmmern setzen damit wamn weiss was AND und was OR ist
SQL:
SELECT 
    COUNT(*) as zahl 
FROM 
    friends, 
    ow_login
WHERE
    (
        user2 = '{$_SESSION["usid"]}' 
        OR user1 = '{$_SESSION["usid"]}'
    )
    AND (
        user1 = id 
        OR user2 = id
    ) 
    AND
        last_active >= {$last}
Nun, du musst ow_login 2 mal anhängen und mit einem Alias versehen. Dann kannst du diese anhängen.

Das ganez wird aber noch komplizierter. Du weisst nicht, ob der Freund auf user1 oder user2 ist. Das muss man natürlich dann unterscheiden.

Mein Rohentwurf, ungetestet wie eh immer
SQL:
SELECT
    -- Anhand des Indexs die ID des freundes auslesen
    ELT(source.friend_index, source.user1, source.user2)                 AS friend_id
    -- und die lezte Aktivität
    ELT(source.friend_index, source.last_active_1, source.last_active_2) AS last_active_friend
FROM
    (
        SELECT
            f.user1, 
            f.user2,
            -- herausfinden ob der Sessionuser user1 oder user2 ist
            FIELD('{$_SESSION["usid"]}', f.user1, f.user2) AS me_index,
            -- Und den Index des freundes 
            FIELD('{$_SESSION["usid"]}', f.user2, f.user1) AS friend_index,
            l1.last_active  AS last_active_1,
            l2.last_active  AS last_active_2
        FROM
            friends AS f,
            ow_login AS l1,
            ow_login AS l2
        WHERE
            l1.id = f.user1
            AND l2.id = f.user2
            -- User 1 oder User 2 ist der Session-User
            AND '{$_SESSION["usid"]}' IN (f.user1, f.user2)
    ) AS source
WHERE
    ELT(source.friend_index, source.last_active_1, source.last_active_2) >= {$last}
 
Zuletzt bearbeitet von einem Moderator:
Hey, ersteinmal vielen dank, hab mir das mal durch gesehen und auch getestet, er scheint jedoch ein problem mit der SESSION zu haben, zumindest zeigt mir dreamweaver in alen 3 Zeilen mit session einen syntax error an. in der live version erhalte ich folgenden fehler:

Parse error: syntax error, unexpected '{' in /home/www/cwcity/hosting/v/i/vincita/htdocs/includes/freunde_on.php on line 17

das ist direkt vor der Session .

mfg

edit // was ich an dem vorgestellten script jedoch nicht sehe ist, wie ich nun die anzahl der ergebnisse finde, da ich lediglich die anzahl brauche und count nicht mehr aufgeführt wird.
 
Zuletzt bearbeitet:
Dreamwaver? Hat der ien Problem mit der curly-Syntax von PHP? Zeig doch mal wie du es implementiert hast.

Zum zweiten. Schmeiss im obersten SELECT alles Raus und häng ein COUNT(*) rein.
 
also das ist das komplette script, wird an anderer stelle eingebunden und soll lediglich die anzahl der freunde anzeigen die online sind, daher nur eine zahl.


PHP:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$last = time() - 300;
$min2 = 1 ;
    $chk_friend2 = mysql_query('SELECT count (*)
FROM
    (
        SELECT
            f.user1, 
            f.user2,
            -- herausfinden ob der Sessionuser user1 oder user2 ist
            FIELD('$_SESSION["usid"]', f.user1, f.user2) AS me_index,
            -- Und den Index des freundes 
            FIELD('{$_SESSION["usid"]}', f.user2, f.user1) AS friend_index,
            l1.last_active  AS last_active_1,
            l2.last_active  AS last_active_2
        FROM
            friends AS f,
            ow_login AS l1,
            ow_login AS l2
        WHERE
            l1.id = f.user1
            AND l2.id = f.user2
            -- User 1 oder User 2 ist der Session-User
            AND '{$_SESSION["usid"]}' IN (f.user1, f.user2)
    ) AS SOURCE
WHERE
    ELT(SOURCE.friend_index, SOURCE.last_active_1, SOURCE.last_active_2) >= {$last}');
 if (!$chk_friend2) {
    echo "Anfrage ($ergebnis) konnte nicht ausgeführt werden : " . mysql_error();
  exit;
 }
$ausgabe2 = mysql_fetch_array($chk_friend2);

echo $ausgabe2[zahl];


 ?>


$min2 =1; bedeutet das die user mindestens den freundes status 1 haben müssen da 0 automatisch gesetzt wird wenn die anfrage raus geht und diese leute sollen logischer weise nicht angezeigt werden.
 
Zuletzt bearbeitet:
habe das nun geändert jedoch macht weder dreamweaver noch der testseite irgendwelche anstallten es zu ändern. Es bleibt beim parser error
 
Man sollte auch nicht mit dreamwaver PHP programmieren. Ich meide alle Programme die meinen mir sagen zu müssen wie mein Code auszusehen hat.

Du kannst den SQL-String auch so zusammensetzen wie du es vorher hattest. Ich habe die Complex (curly) syntax gewählt, weil sie am lesbarsten ist.
 
So, es hat eine weile gedauert da ich es auch selbst testen wollte.
folgendes script:

PHP:
    $chk_friend2 = mysql_query("
			SELECT COUNT(*)  as zahl
					FROM
						friends AS f,
						ow_login AS l1,
					WHERE
						f.user1 = '".$_SESSION['usid']."'
						OR
						f.user2 = '".$_SESSION['usid']."'
						AND l1.id = f.user1
						OR l1.id = f.user2
						AND f.status >= 1
						AND l1.last_active >= $last");

fehler:
Anfrage () konnte nicht ausgeführt werden : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE f.user1 = '1' OR f.user2 = '1' AND l1.id = f.user1' at line 5

leider kam ich mit der umstellung in deinem script nicht wirklich zu recht da ich die syntax fehler nicht in den Griff bekommen habe. wobei bei meiner neuen Version benfalls syntax fehler entstehen.

Ich habe das gefühl ich entferne mich mehr von meinem Ziel als das ich der Lösung näher komme.
 
Ein Komma zuviel nach l1.
Dort wo du das zweite ow_login entfernt hast.

Da die diese Art von Fragen sehr oft kommt, habe ich mal ein Tutorial geschrieben wie man am besten auf Fehlersuche geht.
PHP MySQL Debug Queries
Geh es doch mal durch und falls du die Lösung nicht findest, poste mal das ausgegebe SQL-Statement ins Forum.
 
Zurück