SELECT über 3 Tabellen bringt Fehler

julia29

Erfahrenes Mitglied
Hallo,

die nachfolgenden Zeilen bringen mir ständig den Fehler

Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /var/www/....

hier meine Zeilen
PHP:
$abfrage = "SELECT `jos_vm_favorites`.*, `jos_vm_product`.*, `a_kat`.* 
FROM `jos_vm_favorites` 
LEFT JOIN*** `jos_vm_product` ON `jos_vm_favorites`.`product_id` = `jos_vm_product`.`product_id`
LEFT JOIN*** `jos_vm_favorites` ON `a_kat`.`katnr` = `jos_vm_favorites`.`product_id`
WHERE `jos_vm_favorites`.`user_id`= '".$kdnr2."'
ORDER BY fav_date DESC
LIMIT $start, $eintraege_pro_seite";

Lasse ich die 3. Tabelle `a_kat`
und die 2. LEFT JOIN Zeile weg, also die Suche über 2 Tabellen, funktioniert alles einwandfrei. Beide Felder `katnr`und `product_id` sind vom Typ (INT). Die Feldnamen selber habe ich richtig geschrieben.
Wo könnte mein Fehler liegen?

P.S.: LEFT JOIN*** wird hier mit 3 *** angezeigt, dies ist bei mir natürlich nicht so.
 
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.
 
Hallo,

vielen Dank für die Antworten, bin aber bisher noch nicht recht weitergekommen.
Daher hier zur besseren Übersicht den kompletten PHP-Code.

Ziel: ich brauche eine Druckseite mit einem "statischen Kopfteil" für einen Kunden, der aus zwei Tabellen
`kd_konto`
`jos_users`

zusammengebaut wird (ab #### START Kopfdaten ##########), sowie einer anschließenden Liste mit vielen Daten dieses einen Kunden, die aus zwei anderen SQL-Tabellen
`jos_vm_favorites`
`jos_vm_product`

erzeugt wird (ab #### START Listdaten ##########).
Diese Seite habe ich so schon länger, bisher ohne Störungen, im Einsatz (siehe Screnshot).


PHP:
<?php session_start(); ?>
<HTML> 
<HEAD> 
  <meta http-equiv="content-type" content="text/html;charset=iso-8859-1" />
</HEAD> 
<BODY> 

<?PHP
error_reporting(E_ALL);

// Definiert die Parameter für den Datenbank Connect
define("DB_HOST","localhost"); // MySQL hostname
define("DB_NAME","usr_webxxx"); //MySQL db-name
define("DB_USER","webxxx"); //MySQL User
define("DB_PASS","xxxx"); // MySQL Passwort

// Datenbank Connect herstellen
$db = @MYSQL_CONNECT(DB_HOST,DB_USER,DB_PASS) or die("Datenbank-Connect fehlgeschlagen");
$db_check = @MYSQL_SELECT_DB(DB_NAME) or die("Datenbank momentan nicht erreichbar");
$table1 = jos_vm_favorites;

#echo session_save_path(); 
# Übernahme der Variablen
$kdnr = "" . $_SESSION['userName_x2'] . " ";
$kdnr2 = "" . $_SESSION['userName_x22'] . " ";

#### START Kopfdaten  ##########
   $sql = mysql_query("SELECT `jos_users`.*, `kd_konto`.* 
   FROM `jos_users`
   LEFT JOIN `kd_konto` ON `jos_users`.`kdnr` = `kd_konto`.`kdnr`
   WHERE `jos_users`.`kdnr` = '{$kdnr}'");

   $row = mysql_fetch_array($sql) or die(mysql_error());

# Daten aus jos_users
$name = $row["name"];
$vorname = $row["vorname"];
$tel = $row["tel"];
$email = $row["email"];
$strasse = $row["strasse"];
$plz = $row["plz"];
$ort = $row["ort"];
$text = $row["text"];

$seite = $_GET["seite"];  //Abfrage auf welcher Seite man ist

//Wenn man keine Seite angegeben hat, ist man automatisch auf Seite 1
if(!isset($seite))
   {
   $seite = 1;
   }

//Einträge pro Seite: Hier 25 pro Seite
$eintraege_pro_seite = 50;

//Ausrechen welche Spalte man zuerst ausgeben muss:

$start = $seite * $eintraege_pro_seite - $eintraege_pro_seite;
$x1= ("<FONT SIZE=\"-1\" FACE=\"Arial\">");
$x2= ("<FONT SIZE=\"-2\" FACE=\"Arial\">");
    echo "
   <FONT SIZE=\"-0\" FACE=\"Arial\"><BLOCKQUOTE><b><u>Artikelliste</u></b><FONT SIZE=\"-1\" FACE=\"Arial\"> <br> 
   f&uuml;r Kunde..............:&nbsp;&nbsp; $vorname $name &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KD-Nr.: $kdnr <br>
   Strasse, PLZ, Ort..:&nbsp;&nbsp; $strasse, $plz $ort <br>
   e-Mail...................:&nbsp;&nbsp; $email &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Telefon: $tel
   
</BLOCKQUOTE>";
#### ENDE Kopfdaten  ##########

#### START Listdaten  ##########
	echo "
   <table border=\"0\" cellspacing=\"0\" cellpadding=\"1\">
   <tr bgcolor=\"#cccccc\"><FONT SIZE=\"-1\" FACE=\"Arial\">
   <td width=30>$x2 KD-Nr</td>
   <td width=50>$x2 Favo-Nr.</td><td width=50>$x2 Art-Nr.</td>
   <td width=40>$x2 Art.-Gruppe</td><td width=100>$x2 </td>
   <td width=30>$x2 Anz</td><td width=200>$x2 Titel</td>
   <td width=40>$x2 </td>
   <td width=100>$x2 Datum</td>
      </tr>
   ";

# , `a_kat`.*

$abfrage = "SELECT `jos_vm_favorites`.*, `jos_vm_product`.* 
FROM `jos_vm_favorites` 
LEFT JOIN*`jos_vm_product` ON `jos_vm_favorites`.`product_id` = `jos_vm_product`.`product_id`
WHERE `jos_vm_favorites`.`user_id`= '".$kdnr2."'
ORDER BY fav_date DESC
LIMIT $start, $eintraege_pro_seite";

# LEFT JOIN*** `jos_vm_favorites` ON `a_kat`.`katnr` = `jos_vm_favorites`.`product_id`

$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis)) #*/

    {
    	$kdnr2 = $row->user_id;	
    	$anzahl = $row->product_qty;	
    	$aunr = $row->product_id;
    	$artnr = $row->product_sku;
    	$group = $row->feld30;
    	$titel = $row->product_s_desc;
    	$datum = $row->fav_date;
    	
# Zusammenbau der List-Tabelle
echo "<tr bgcolor=\"#ffffff\"><FONT SIZE=\"-1\" FACE=\"Arial\">";
echo "<td VALIGN=top>$x2 $kdnr</td>";
echo "<td VALIGN=top><font color=\"#999999\">$x2 $aunr</td>";
echo "<td VALIGN=top>$x2 $artnr</td>";
echo "<td VALIGN=top>$x2 $group</td>";
echo "<td VALIGN=top>$x2 $group</td>";
echo "<td VALIGN=top>$x2 $anzahl</td>";
echo "<td VALIGN=top>$x2 $titel</td>";
echo "<td VALIGN=top>$x2 </td>";
echo "<td VALIGN=top>$x2 $datum</td>";

echo "</tr>";
echo "<tr><td COLSPAN=9>";
echo "<hr>"; 
echo "</td>"; 
echo "</tr>";  
   }

echo "</table>";
#### ENDE Listdaten  ##########

$result = mysql_query("SELECT * 
FROM $table1
WHERE user_id= '".$kdnr2."'");
$menge = mysql_num_rows($result);

//Errechnen wieviele Seiten es geben wird
$wieviel_seiten = $menge / $eintraege_pro_seite;

//Ausgabe der Seitenlinks:
$menge = number_format($menge, 0, ',', ' ');
echo "<hr>$x2<u>Favoriten...:</u>&nbsp;&nbsp;$menge &nbsp;&nbsp;<br>";
#echo "<hr>$x2<u>Gesamt:</u>&nbsp;&nbsp;$menge <br>";
echo "<div align=\"left\">";
echo "$x2<u>Seite..........:</u>&nbsp; ";


//Ausgabe der Links zu den Seiten
for($a=0; $a < $wieviel_seiten; $a++)
   {
   $b = $a + 1;


   if($seite == $b)
      {
      echo "  $x2<b>$b</b> ";
      }

   else
      {
      echo "  $x2<a href=\"?seite=$b\">$b</a> ";
      }


   }
echo "</div>"; 
echo "</br>";
?>


Nun kommt mein Problem.
Jetzt wird eine weitere Spalte mit "Gruppen-Namen" benötigt, Die Gruppen-Nr. finde ich bereits in der Tabelle `jos_vm_product` was diese Nr. jedoch bedeutet steht nur in der Kategorie-Tabelle
`a_kat`.
Also füge ich in meiner bisher einwandfrei funktionierenden Select-Abfrage die entsprechende
Tabelle `a_kat` hinzu. Außerdem eine weitere Verknüpfungszeile mit LEFT JOIN.

PHP:
$abfrage = "SELECT `jos_vm_favorites`.*, `jos_vm_product`.*, `a_kat`.*
FROM `jos_vm_favorites` 
LEFT JOIN*`jos_vm_product` ON `jos_vm_favorites`.`product_id` = `jos_vm_product`.`product_id`
LEFT JOIN*** `jos_vm_favorites` ON `a_kat`.`katnr` = `jos_vm_favorites`.`product_id`
WHERE `jos_vm_favorites`.`user_id`= '".$kdnr2."'
ORDER BY fav_date DESC
LIMIT $start, $eintraege_pro_seite";

Jetzt erscheint die Fehlermeldung:
Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /var/www/

Nehme ich in der List-Abfrage die 3. Tabelle und die LEFT JOIN-Zeile wieder raus, funktioniert alles wieder wie bisher, eben nur ohne Gruppen-Name. Also so verkehrt kann meine Abfrage bisher ja nicht sein.

Wie kann ich nun aus der Tabelle `a_kat` neben der Gruppen-Nr auch noch den Gruppen-Namen in meiner Liste darstellen?
 

Anhänge

  • Artikellist1.jpg
    Artikellist1.jpg
    79,1 KB · Aufrufe: 12
Kleine Frage am Rande. Was machen die vielen ** bei den JOINs?
SQL:
FROM `jos_vm_favorites` 
LEFT JOIN*`jos_vm_product` ON `jos_vm_favorites`.`product_id` = `jos_vm_product`.`product_id`
LEFT JOIN*** `jos_vm_favorites` ON `a_kat`.`katnr` = `jos_vm_favorites`.`product_id`

Und, ich habe oben ja eine Anleitung zum debuggen gepostet. Wie sieht das genereirte SQL aus und was für eine MySQL-Fehlermeldung kommt beim Testen?
 
Zuletzt bearbeitet von einem Moderator:
Hallo Yaslaw,

mit den vielen * * * bei den JOINS entsteht immer nur wenn ich den PHP-Code aus meinem Editor hier in das Eingabefeld in Tutorials als 'PHP' einkopiere. Auf diese Eigenart hatte ich weiter oben schon drauf hingewiesen (hier jetzt mal nur als 'CODE').

hier mein SQL Statement:
Code:
SELECT `jos_vm_favorites`.*, `jos_vm_product`.*, `a_kat`.* 
FROM `jos_vm_favorites` 
LEFT JOIN `jos_vm_product` ON `jos_vm_favorites`.`product_id` = `jos_vm_product`.`product_id`
LEFT JOIN    `jos_vm_favorites` ON `a_kat`.`katnr` = `jos_vm_favorites`.`product_id`
WHERE `jos_vm_favorites`.`user_id`= '63'

Hier die Fehlermeldung:
#1064 - 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 'JOINÂ `jos_vm_product` ON `jos_vm_favorites`.`product_id` = `jos_vm_product`.`pr' at line 3

Aber wo könnte der Fehler stecken?
 
Zuletzt bearbeitet:
WOher kommt dieses  in der Fehlermeldung? Auch ein Copy-Fehler?

Nebenbei. user_id ist hoffenltich eine Zahl. Dann auch als Zahl behandeln...
 
Ja, ist eine Zahl, hatte ich falsch gesetzt, Fehler bleibt jedoch.
Die Darstellung  in der Fehlermeldung wird bei mir so angezeigt ... siehe Screenshot, als wenn das 2. Zeichen " ' " nicht dargestellt werden könnte.
 

Anhänge

  • Fehler.jpg
    Fehler.jpg
    80,7 KB · Aufrufe: 7
Di bindest 2 mal die Tabelle jos_vm_favorites ein ohne das du Aliase verwendest. Woher soll SQL wissen, welche der 2 Tabellen du nachher mit dem Prefix `jos_vm_favorites` ansteuerst? Versuche mal das ganze mit Tabellenaliasen.

Oder du nimmst beim 2ten Join die Tabelle a_kat anstelle von jos_vm_favorites...
 
Welchen Zeichensatz verwendest du denn in deinem Dokument und mit welchem Zeichensatz ist die Datei gespeichert?
 
Zurück