Problem: Auslesen von Werten

Harry Fan8

Mitglied
Hey,

ich habe zwei Tabellen, einmal eine Tabelle, in denen die Scripts abgespeichert sind und die andere Tabelle, in der zugeordnet werden soll, welcher User welche Scripts zu seiner Scriptkollektion hinzugefügt hat.

Tabelle mit scripts:
ID script_name author_name version description release_date downloads payment info_and_download
1 Testscript Harry_Fan8 1.2 Ein einfaches Script. 29.03.2014 0 Free <a href="scripts.php?id=1"><span class="glyphicon ...
2 Anderes Script Harry_Fan8 1.1 Ein einfaches Script. 30.03.2014 0 Free <a href="scripts.php?id=2"><span class="glyphicon ...

Tabelle für Scriptkollektion:
user_id -- added_scripts
2 1
2 2

Bis jetzt sieht das so bei mir aus:
PHP:
$connect = mysqli_connect($host, $username, $password, $smf_database) or die("Fehler beim Verbindungsaufbau zur Datenbank!"); // Verbindung wird zur Datenbank mit usern hergestellt
                    $result = mysqli_query($connect, "SELECT id_member FROM smf_members WHERE member_name = '".mysqli_real_escape_string($connect, $_SESSION['Benutzername'])."'");
                    
                    while($row = mysqli_fetch_object($result))
                    {
                        $smf_id = $row->id_member;
                    }
                    
                    $connect = mysqli_connect($host, $username, $password, $database) or die("Fehler beim Verbindungsaufbau zur Datenbank!");
                    $result = mysqli_query($connect, "SELECT added_scripts FROM added_scripts WHERE user_id = '".mysqli_real_escape_string($connect, $smf_id)."'");

                    while($row = mysqli_fetch_array($result))
                    {
                        $added = $row['added_scripts'];
                    }

                    $result = mysqli_query($connect, "SELECT ID, script_name, author_name, version, release_date FROM scripts WHERE ID = '".mysqli_real_escape_string($connect, $added)."'");
                   
                    echo "Scripts:";
                    echo "<table class=\"table table-striped\">";
                    echo "<tr class=\"danger\">";
                    echo "<th>#</th>";
                    echo "<th>Scriptname</th>";
                    echo "<th>Author</th>";
                    echo "<th>Version</th>";
                    echo "<th>Release date</th>";
                    echo "<th></th>";
                    echo "</tr>";
                    
                    while($row = mysqli_fetch_row($result))
                    {
                        echo "<tr>";
                        for($col = 0; $col < count($row); $col++)
                        {
                            echo "<td>$row[$col]</td>";
                        }
                        echo "</tr>";
                    }
                    echo "</table>";
Bis jetzt gibt er mir immer nur ein Ergebnis aus. :/ Meine Vermutung ist es, dass er vielleicht die Variable $added, wenn er was gefunden hat immer neu überschreibt. Ich habe es schon versucht mit einer Liste und mit arrays zu lösen, aber bislang ohne Erfolg.

Wie löse ich dieses Problem?

Danke im Vorraus.

Harry Fan8
 
Zuletzt bearbeitet:
Hallo,

also erstmal, das doppelte mysqli_connect() raus, das macht den Code erstens unleserlich und zweitens langsam. Arbeite mit einer Verbindung für alle Queries.

Zweitens solltest du dir das Konzept von JOINs mal ansehen, dann kannst du die drei Queries nämlich zu einem zusammen fassen. Ungefähr so:

Code:
SELECT m.id_member AS id_member, s.id AS id_script, s.script_name, s.author_name, s.version, s.release_date
FROM `mf_members` m 
INNER JOIN `added_scripts` a ON a.user_id = m.id_member
INNER JOIN `scripts`s ON s.ID = a.added_scripts
WHERE m.member_name = 'xxx'

Dann kann dein Code nämlich so aussehen:

PHP:
// Connect to db
$connect = mysqli_connect($host, $username, $password, $database) or die("Fehler beim Verbindungsaufbau zur Datenbank!");

// Assemble SQL statement
$sql = sprintf("SELECT s.id AS id_script, s.script_name, s.author_name, s.version, s.release_date "
 . "FROM `mf_members` m "
 . "INNER JOIN `added_scripts` a ON a.user_id = m.id_member "
 . "INNER JOIN `scripts` s ON s.ID = a.added_scripts "
 . "WHERE m.member_name = '%s'", 
   mysqli_real_escape_string($_SESSION['Benutzername']));

// Execute assembled statement
$result = mysqli_query($connect, $sql) or die("Error executing sql $sql: " . mysqli_error());

// Output
echo "Scripts:";
echo "<table class=\"table table-striped\">";
echo "<tr class=\"danger\">";
echo "<th>#</th>";
echo "<th>Scriptname</th>";
echo "<th>Author</th>";
echo "<th>Version</th>";
echo "<th>Release date</th>";
echo "<th></th>";
echo "</tr>";
                    
while($row = mysqli_fetch_row($result))
{
  echo "<tr>";
  for($col = 0; $col < count($row); $col++)
  {
    echo "<td>$row[$col]</td>";
  }
  echo "</tr>";
}

echo "</table>";

Das ist nicht nur viel übersichtlicher, es ist vor allem fehlerunanfälliger.

Versuche so viel es geht, zusammen zu fassen. Weniger Code bedeutet weniger WTFs/m, bedeutet weniger Fehler ;-)
 
Zurück