2009-05-28 17 views
0

Alles in allem habe ich eine Zauberkartenseite und versuche alle Karten aus einem bestimmten Set zu ziehen, wenn Sie auf das Set auf der Startseite klicken. www (dot) magiccards (dot) mir der Code auf der ersten Seite lautet:Ziehen einer Gruppe aus einer Datenbank

<?php 

require("mysqlconnect.php"); 

$query = "SELECT COUNT(*) AS `Rows`, `set`,id FROM `magic_cards_copy` GROUP BY `set` ORDER BY `set`"; 

$result = mysql_query($query) or die(mysql_error()); 

// Print out result 
while($row = mysql_fetch_array($result)){ 
    $setlink = $row[1]; 
    $setlink = str_replace(" ", "", $setlink); 
    $setlink = strtolower($setlink); 
    $setlink = preg_replace("/[^a-z0-9]./","",$setlink); 
    $setlink .= "-c-$row[2]"; 
    $setlink .= ".html"; 

    $navigation .= "< href=\"$setlink\">$row[1]</a> <small><i>($row[0])</i></small>"; 
} 

require("template.php"); 

?> 

und der Code auf der Seite, ist kommt:

<? 

require("mysqlconnect.php"); 

$cat=$_GET['cat']; 

echo "Category: $cat<br>"; 

$query = "SELECT * FROM `magic_cards_copy` WHERE id = $cat "; 

$result = mysql_query($query) or die(mysql_error()); 
$row = mysql_fetch_array($result); 
echo "Set: $row[1]<br>"; 

?> 

wie Sie den Code, die Karten nach oben ziehen hätte von jedem Satz? Jede Hilfe wäre großartig. das ist eher ein Übungsplatz für mich.

Antwort

0

Nicht wirklich sicher, was Ihre Fragen, aber das erste, was zu betrachten, da dies zu sehen, ist ein Übungsplatz

ist
$cat = mysql_real_escape_string($_GET['cat']); 

zumindest SQL-Injection-Hacks zu verhindern. Du solltest immer Sicherheit üben. PHP.not on SQL Injection

0

Es ist nicht klar von der Frage ist, was Sie zu tun versuchen - zum Beispiel, was ist die Beziehung zwischen dem beide PHP-Skripte zur Verfügung gestellt, und versuchen Sie, die Karten aus allen Sätzen, oder die Karten zu ziehen aus ein gegebenes Set? Ich werde versuchen, beide zu beantworten:

Alle Karten im Set $ ​​_GET [ 'Katze']:

<?php 
$dbh = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'dbuser', 'dbpass'); 
$stmt = $dbh->prepare('SELECT cardname from magic_cards_copy where set = :set'); 
$stmt->bindParam(':set', $_GET['cat'], PDO::PARAM_STR); 
$stmt->execute(); 

while ($card = $stmt->fetch(PDO::FETCH_ASSOC)) { 
    // display card here 
} 

Alle Karten in allen Sätzen:

<?php 
$dbh = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'dbuser', 'dbpass'); 
$query = $dbh->query('SELECT cardname from magic_cards_copy'); 

while ($card = $query->fetch(PDO::FETCH_ASSOC)) { 
    // display card here 
} 

Beachten Sie, dass ich Ihnen dringend empfehlen Verwenden Sie PDO, denn es schützt Sie vor allerlei Torheit.

1

Ich würde eine Tabelle erstellen, die zwei Spalten hat. Die erste Spalte ist die Set-ID (eine eindeutige Kennung für alle Sets) und würde für schnelle Suchvorgänge indiziert werden. Die zweite Spalte wäre die ID für die Karten. Sie würden diese Tabelle für einen JOIN auf dem Tisch verwenden, um alle einzigartigen Karten

BTW enthält, sanieren alle Eingaben

$cat=$_GET['cat']; 

zu SQL-Injection-Angriffe offen ist. Sie sollten es auch in eine Ganzzahl umwandeln.

+0

Ja, wenn Sie nicht eine vorbereitete Aussage verwenden, Sie müssen die Eingaben bereinigen, wie Patrick es vorschlägt. – TML

1

Lesen Sie auf Datenbank-Normalisierung. Was Sie tun sollten, ist eine Tabelle von "Sets", wo Sie jedes Set mit einer ID-Nummer auflisten. Dann haben Sie in Ihrer Kartendatenbank anstelle des festgelegten Namens eine ID-Nummer, die dem Satz entspricht.

Beispiel stellt Tabelle:

id set 
------------------ 
1  Set One Name 
2  Set Two Name 

Beispiel Karten Tabelle:

id setid card 
------------------------------------- 
1  1  Card One from First Set 
2  1  Card Two from First Set 
3  2  A card from Second Set 

Wenn Sie Sätze auflisten möchten, können Sie einfach alles aus der Sets Tabelle auswählen. Wenn Sie Karten aus einem Set auflisten möchten, wählen Sie alle Karten aus, bei denen die Set-ID die gesuchte ist.

+0

Eigentlich würde man zwischen den Sätzen und Karten eine Viele-zu-Viele-Tabelle brauchen, weil einige Karten zu mehreren Sätzen gehören. –

0
echo "Category: $cat<br>"; 

Dies unterliegt einer Cross-Site Scripting Sicherheitslücke. Da Sie dies als Übungsplatz verwenden, sollten Sie Sicherheitslücken kennen und diese vermeiden. Beginnen Sie mit dem Lesen der OWASP-Site.

Wie andere bemerkt haben, haben Sie auch einen SQL Injection-Fehler.

Auch hier ist Ausgabe von Ihrer Website:

Category: 143345 
Set: Alliances 
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 ''magic_cards_copy' 
WHERE category = 'Alliances' LIMIT 40' at line 1 

Sieht aus wie Sie die falsche Art von Trennzeichen um die Tabellennamen verwenden. Verwenden Sie für den Tabellennamen keine umgekehrten Anführungszeichen.

Sie müssen eine weitere Tabelle erstellen, um die Mitgliedschaft jeder Karte in jedem Satz aufzuzeichnen. Dies wird manchmal als "Viele-zu-Viele-Tabelle" oder "Kreuztabelle" bezeichnet. Dies gilt insbesondere, weil IIRC, einige Magic-Karten zu mehreren Sets gehören können.

Also hier ist, wie ich es tun würde:

CREATE TABLE CardSets (
    set_id INT PRIMARY KEY AUTO_INCREMENT, 
    set_name VARCHAR(40) 
); 

CREATE TABLE Cards (
    card_id INT PRIMARY KEY AUTO_INCREMENT, 
    card_name VARCHAR(40) 
    -- other card attributes, color, flavor text, etc. 
); 

CREATE TABLE CardSetManifest (
    set_id INT NOT NULL, 
    card_id INT NOT NULL, 
    -- other attributes of card specific to a given set, e.g. rarity 
    PRIMARY KEY (set_id, card_id), 
    FOREIGN KEY (set_id) REFERENCES CardSets(set_id), 
    FOREIGN KEY (card_id) REFERENCES Cards(card_id) 
); 

ein So gegeben set_id Sie die Anzahl der Karten in diesem Satz bekommen:

SELECT set_id, COUNT(*) FROM CardSetManifest GROUP BY set_id; 

Bei einer set_id Sie eine Liste bekommen der Karten in diesem Satz:

SELECT m.set_id, m.card_id, c.card_name 
FROM CardSetManifest m JOIN Cards c USING (card_id); 
Verwandte Themen