Php 从数据库中提取组
好的,我有一个魔术卡网站,如果你点击主页上的某个集合,我会尝试从该集合中取出所有的卡片。www(dot)magiccards(dot)me第一页上的代码是: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($
<?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的建议清理输入。实际上,在集合和卡片之间需要一个多对多表,因为有些卡片属于多个集合。