DB SELECT funktioniert nicht

Jacy

Mitglied
Hallo zusammen,

ich habe ein Problem, meine DB Anfrage funktioniert einfach nicht und ich verzweifle langsam. Ich hab alles ausprobiert und rumgebastelt,aber ich weiß nicht,warum es nicht funkioniert.

Hier das Skript:

PHP:
<?php 
$mysqli= new mysqli("localhost","jb110","","u-jb110"); 

if($_GET['id']) { 
$id = (int) $_GET['id']; 
$ergebnis=$mysqli->query("SELECT ean,album.titel AS titel1,jahr,cover,name,genre,label,nummer, 
track.titel AS titel2,laenge 
 FROM album WHERE aID=? 
                                    INNER JOIN kuenstler ON album.kID = kuenstler.kID 
                                    INNER JOIN genre ON album.gID = genre.gID 
                                    INNER JOIN label ON album.lID = label.lID  
                                    INNER JOIN track ON album.aID = track.aID ;"); 
echo "<table border='1px solid;'>\n"; 
while ($zeile=$ergebnis->fetch_array()) { 
  echo "<tr><td>".htmlspecialchars($zeile["ean"])."</td>" 
       ."<td>".htmlspecialchars($zeile["titel1"])."</td>" 
       ."<td>".htmlspecialchars($zeile["jahr"])."</td>" 
       ."<td>".htmlspecialchars($zeile["cover"])."</td>" 
       ."<td>".htmlspecialchars($zeile["name"])."</td>" 
       ."<td>".htmlspecialchars($zeile["genre"])."</td>" 
       ."<td>".htmlspecialchars($zeile["label"])."</td>" 
       ."<td>".htmlspecialchars($zeile["nummer"])."</td>" 
       ."<td>".htmlspecialchars($zeile["titel2"])."</td>" 
       ."<td>".htmlspecialchars($zeile["laenge"])."</td>" 
       ."</tr>\n"; 
    } 
echo "</table>"; 

$ergebnis->close(); 
$mysqli->close(); 
} 
?>

Mein Problem ist das WHERE. Bevor ich das eingefügt habe,hatte es funkioniert, seither bekomme ich folgende Fehlermeldung: Fatal error: Call to a member function fetch_array() on a non-object in /Users/jb110/public_html/cd/testmy2.php on line 12

Kann mir irgendjemand weiterhelfen?
 
IMHO gehören JOINs und FROM vor ein WHERE. Außerdem hast ein Prepared-Statement-Platzhalter verwendet, rufst aber die Query-Methode. Du solltest prepare() rufen und dann bind_param() oder bind_value() sowie bind_result() auf das Statement anwenden:

PHP:
$statement=$mysqli->prepare("SELECT ean,album.titel AS titel1,jahr,cover,name,genre,label,nummer, 
track.titel AS titel2,laenge 
 FROM album 
 INNER JOIN kuenstler ON album.kID = kuenstler.kID 
 INNER JOIN genre ON album.gID = genre.gID 
 INNER JOIN label ON album.lID = label.lID  
 INNER JOIN track ON album.aID = track.aID
 WHERE aID=?");
$statement->bind_value('i', $aid);
$statement->bind_result($ean, $titel1, $jahr, $cover, $name, $genre, $label, $nummer, $titel2, $laenge);

while($statement->fetch())
{
  echo $ean;
  echo $titel1;
  /* .... */
}
 
Das Problem muss irgendwie in der Abfrage liegen, ich habe deinen Code ausprobiert, aber bekomme selbe Fehlermeldung: Fatal error: Call to a member function bind_value() on a non-object in /Users/jb110/public_html/cd/testmy2.php on line 15

Bevor ich das WHERE eingesetzt habe,ging es,liegt es vllt daran,dass aID nur in der Tabelle Album vorkommt und nicht in allen Tabellen?
 
Dann probier doch mal das hier:

PHP:
$statement=$mysqli->prepare("SELECT ean,album.titel AS titel1,jahr,cover,name,genre,label,nummer, 
track.titel AS titel2,laenge 
 FROM album 
 INNER JOIN kuenstler ON album.kID = kuenstler.kID 
 INNER JOIN genre ON album.gID = genre.gID 
 INNER JOIN label ON album.lID = label.lID  
 INNER JOIN track ON album.aID = track.aID
 WHERE aID=?");
if(!$statement && $mysqli->errno) {
  die( $myqli->error );
}
$statement->bind_value('i', $aid);
 
Hmpf, habe nach einbetten die Fehlermeldung erhalten, dass aID nicht eindeutig ist (hatte übersehen,dass es in Tabelle Track ebenfalls das Feld aID gibt). Habe es jetzt so abgeändert,aber alles,was ich jetzt bekomme ist eine weiße Seite :((

PHP:
<?php
error_reporting(E_ALL);
$mysqli= new mysqli("localhost","jb110","yod6ahlaeY","u-jb110");

if($_GET["id"]) {  
$id = (int) $_GET["id"];  
$statement=$mysqli->prepare("SELECT ean,album.titel AS titel1,jahr,cover,name,genre,label,nummer, 
track.titel AS titel2,laenge 
 FROM album 
 INNER JOIN kuenstler ON album.kID = kuenstler.kID 
 INNER JOIN genre ON album.gID = genre.gID 
 INNER JOIN label ON album.lID = label.lID  
 INNER JOIN track ON album.aID = track.aID
 WHERE album.aID=?");
if(!$statement && $mysqli->errno) {
  die( $mysqli->error );
}
$statement->bind_param('i', $album["aID"]);
$statement->bind_result($ean, $titel1, $jahr, $cover, $name, $genre, $label, $nummer, $titel2, $laenge);
 
while($statement->fetch())
{
  echo $ean;
  echo $titel1;
  echo $jahr;
  echo $cover;
  echo $name;
  echo $genre;
  echo $label;
  echo $nummer;
  echo $titel2;
  echo $laenge;
  
}
      
$statement->close();  
$mysqli->close();  
}
?>
 
Hast du die Fehler-Anzeige aktiviert?

PHP:
// In die erste Zeile des Scripts
error_reporting( E_ALL | E_STRICT );
ini_set( 'display_errors', 1);
 
Das Problem ist,dass die echos an allen Stellen,wo ich sie eingebaut habe,funktionieren. Ich schätze einfach,dass das Problem die Abfrage ist und diese leer ist oder irgendwas in der Art, aber ich weiß echt nicht,wie ich das rauskriegen soll :(
 
$statement->num_rows sollte da weiterhelfen.

Aber ich habe den Fehler entdeckt, und ich habe ihn eingebaut :-(

Nach dem bind_result() gerufen wurde, müsstest du das Statement ausführen:

PHP:
$statement->bind_result($ean, $titel1, $jahr, $cover, $name, $genre, $label, $nummer, $titel2, $laenge);

$statement->execute(); // Präpariertes Statement ausführen
 
while($statement->fetch())
 
Zurück