Php 从数据库中提取组

Php 从数据库中提取组,php,mysql,Php,Mysql,好的,我有一个魔术卡网站,如果你点击主页上的某个集合,我会尝试从该集合中取出所有的卡片。www(dot)magiccards(dot)me第一页上的代码是: <?php require("mysqlconnect.php"); $query = "SELECT COUNT(*) AS `Rows`, `set`,id FROM `magic_cards_copy` GROUP BY `set` ORDER BY `set`"; $result = mysql_query($

好的,我有一个魔术卡网站,如果你点击主页上的某个集合,我会尝试从该集合中取出所有的卡片。www(dot)magiccards(dot)me第一页上的代码是:

    <?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");

?>

页面上的代码是:

    <?

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>";

?>


代码如何从每套卡片中提取卡片?任何帮助都会很好。对我来说,这更像是一个练习网站。

我不太清楚你的要求,但首先要看到的是,这是一个练习网站

$cat = mysql_real_escape_string($_GET['cat']);
至少可以防止SQL注入黑客。你应该经常练习安全。

问题不清楚您想做什么-例如,提供的两个PHP脚本之间的关系是什么,您是想从所有集合中提取卡片,还是从给定集合中提取卡片?我将尝试回答这两个问题:

集合中的所有卡$\u获得['cat']:

<?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
}

我将创建一个包含两列的表。第一列是集合id(所有集合的唯一标识符),它将被编入索引以便快速查找。第二列是卡的id。您可以将此表用于包含所有唯一卡的表上的联接

顺便说一句,清理所有输入

$cat=$_GET['cat'];

易受SQL注入攻击。您还应该将其强制转换为整数。

阅读数据库规范化。您应该做的是有一个“集合”表,其中列出每个集合的ID号。然后,在您的卡数据库中,您没有设置名称,而是有一个与该设置对应的ID号

示例集表格:

id    set
------------------
1     Set One Name
2     Set Two Name
示例卡表:

id    setid   card
-------------------------------------
1     1       Card One from First Set
2     1       Card Two from First Set
3     2       A card from Second Set
如果要列出集合,只需从集合表中选择所有内容。当你想从一组卡片中列出卡片时,你可以选择所有卡片,其中集合ID是你想要的

echo "Category: $cat<br>";
看起来您在表名周围使用了错误的分隔符。在表名周围使用反引号,而不是单引号

您确实需要创建另一个表,以记录每套卡的会员资格。这有时被称为“多对多表”或“交集表”。这尤其正确,因为IIRC,一些魔术卡可以属于多个集合

下面是我的做法:

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)
);
因此,给定一个
set\u id
,您可以得到该集合中的卡数:

SELECT set_id, COUNT(*) FROM CardSetManifest GROUP BY set_id;
SELECT m.set_id, m.card_id, c.card_name
FROM CardSetManifest m JOIN Cards c USING (card_id);
给定一个
set\u id
,您可以获得该集合中的卡片列表:

SELECT set_id, COUNT(*) FROM CardSetManifest GROUP BY set_id;
SELECT m.set_id, m.card_id, c.card_name
FROM CardSetManifest m JOIN Cards c USING (card_id);

是的,如果您不打算使用准备好的语句,您需要按照Patrick的建议清理输入。实际上,在集合和卡片之间需要一个多对多表,因为有些卡片属于多个集合。