Bir veritabanından bir grup çekerek

5 Cevap php

Tamam ben bir sihirli kartları siteyi ve ana sayfada sette tıklarsanız belirli bir kümesinden tüm kartları çekmeye çalışıyor im var. www (nokta) magiccards (nokta) Bana ilk sayfada kodu:

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

?>

ve gelen sayfadaki kodu:

    <?

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

?>

nasıl kod her kümesinden kartları yukarı çekin olurdu? Herhangi bir yardım büyük olurdu. Bu benim için bir uygulama sitenin daha fazladır.

5 Cevap

Ben iki sütunu olan bir tablo oluşturmak istiyorum. İlk sütun set-id (tüm setleri için benzersiz bir tanımlayıcı) ve hızlı aramalar için endeksli olacaktır. İkinci sütun kartları için id olacaktır. Eğer tüm benzersiz kartları içeren masaya JOIN için bu tabloyu kullanabilirsiniz

BTW, tüm girdileri

$cat=$_GET['cat'];

SQL enjeksiyon saldırıları açıktır. Ayrıca bir tamsayı döküm gerekir.

Veritabanı Normalleştirme kadar okuyun. Ne yapmak gerektiğini bir kimlik numarası ile her set liste "setleri" bir tablo var olduğunu. Sonra kartları veritabanında, yerine grubu adını kalmadan, kümesine karşılık gelen bir kimlik numarası var.

Örnek tablo ayarlar:

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

Örnek kartlar tablosu:

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

Eğer setleri listelemek istediğinizde, sadece setleri tablodan her şeyi seçmek. Bir kümesinden kartlarını listelemek istediğiniz zaman set kimlik aradığınız ne olursa olsun tüm kartları seçin.

Senin soran, ama bu bir uygulama alanı olarak görmek bakmak için ilk şey ne olduğunu gerçekten emin değil

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

at the very least to prevent SQL injection hacks. You should always practice security. PHP.not on SQL Injection

Bu yapmanız için çalışıyoruz ne sorunuza net değil - örneğin, ne sağlanan iki PHP arasındaki ilişki, ve bir VERİLECEKTİR kümesinden TÜM setleri, veya kartları kartları çekmeye çalışıyorsun? Her iki cevap çalışacağım:

Set $ ​​_GET ['kedi'] Tüm kartlar:

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

Tüm setleri tüm kartlar:

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

Ben şiddetle aptallık her türlü sizi korur gibi, PDO kullanmanızı tavsiye unutmayın.

echo "Category: $cat<br>";

Bu Cross-Site Scripting açığına tabidir. Eğer bir uygulamadır site olarak bu kullanıyorsanız bu yana, bunları önlemek için nasıl güvenlik açıkları farkında olmalı ve. OWASP siteyi okuyarak başlayın.

Diğerleri de belirtildiği gibi, aynı zamanda bir SQL Injection kusur var.

Ayrıca, burada sitenizden çıkışı bulunuyor:

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

Eğer tablo adı etrafında sınırlayıcı yanlış tür kullanarak konum gibi görünüyor. Arka-tırnak değil, tablo adı tek tırnak kullanın.

Her sette her kartın üyelik kaydetmek için, başka bir tablo oluşturmanız gerekir. Bu bazen bir "çok-çok tablo" ya da denir "kesişme tablo." IIRC, bazı Magic kartları birden fazla setleri ait olabilir, çünkü bu özellikle doğrudur.

Yani burada ben yapardım nasıl:

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

Yani verilen bir set_id bu sette kartların sayı alabilirsiniz:

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

Verilen Bir set_id bu sette kartların bir listesini alabilirsiniz:

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