Вытащить группу из базы данных - PullRequest
0 голосов
/ 29 мая 2009

Хорошо, у меня есть сайт магических карт, и я пытаюсь вытащить все карты из определенного набора, если вы нажмете на набор на домашней странице. www (точка) magiccards (точка) мне код на первой странице:

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

?>

как бы код вытянул карты из каждого набора? любая помощь будет отличной. для меня это больше сайт практики.

Ответы [ 5 ]

1 голос
/ 29 мая 2009

Читайте о нормализации базы данных. То, что вы должны сделать, это иметь одну таблицу «наборов», где вы перечисляете каждый набор с идентификационным номером. Затем в базе данных ваших карт вместо имени набора у вас есть идентификационный номер, соответствующий набору.

Пример таблицы наборов:

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

Когда вы хотите перечислить наборы, вы просто выбираете все из таблицы наборов. Если вы хотите составить список карточек из набора, вы выбираете все карточки, для которых идентификатором набора является то, что вы ищете.

1 голос
/ 29 мая 2009

Я бы создал таблицу с двумя столбцами. Первый столбец - это set-id (уникальный идентификатор для всех наборов), и он будет проиндексирован для быстрого поиска. Второй столбец будет идентификатором для карт. Вы бы использовали эту таблицу для JOIN на столе, содержащем все уникальные карты

Кстати, очистить все входные данные

$cat=$_GET['cat'];

открыт для атак с использованием SQL-инъекций. Вы также должны привести его к целому числу.

0 голосов
/ 29 мая 2009
echo "Category: $cat<br>";

Это уязвимость Межсайтовый скриптинг . Поскольку вы используете этот сайт в качестве учебного сайта, вы должны знать о недостатках безопасности и о том, как их избежать. Начните с чтения сайта OWASP.

Как уже отмечали другие, у вас также есть недостаток SQL-инъекции.

Также, вот вывод с вашего сайта:

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

Похоже, вы используете неправильный тип разделителя вокруг имени таблицы. Вокруг имени таблицы используйте обратные кавычки, а не одинарные.

Вам нужно создать еще одну таблицу, чтобы записать членство каждой карты в каждом наборе. Это иногда называют «таблицей многих ко многим» или «таблицей пересечений». Это особенно верно, потому что 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_id, вы можете получить количество карт в этом наборе:

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

Учитывая set_id, вы можете получить список карт в этом наборе:

SELECT m.set_id, m.card_id, c.card_name
FROM CardSetManifest m JOIN Cards c USING (card_id);
0 голосов
/ 29 мая 2009

Из вопроса, что вы пытаетесь сделать, непонятно, например, какова взаимосвязь между двумя предоставленными сценариями PHP, и пытаетесь ли вы извлечь карты из ВСЕХ наборов или из набора ДАННЫХ ? Я постараюсь ответить на оба вопроса:

Все карты в наборе $ _GET ['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
}

Все карты во всех наборах:

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

Обратите внимание, что я настоятельно рекомендую вам использовать PDO , поскольку он защищает вас от всевозможных глупостей.

0 голосов
/ 29 мая 2009

Не совсем уверен, что вы спрашиваете, но первое, на что нужно посмотреть, так как это тренировочный сайт, это

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

, по крайней мере, для предотвращения взлома SQL-инъекций. Вы всегда должны практиковать безопасность. PHP.not on SQL Injection

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...