Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

Diskuze: MySQL tabulka

PHP PHP MySQL tabulka American English version English version

Aktivity (1)
Avatar
Jan Kubáč
Člen
Avatar
Jan Kubáč:7.10.2016 22:26

Zdravím, poradil by mi někdo jak na tabulku vypsanou z MySQLu? V mysql databázi mám 3 tabulky a z každé bych chtěl jednu hodnotu zobrazit na webu v jednom řádku/tabulce. Jestli je to vůbec možné.

MySQL podrobněji:

  1. tabulka "ranks" ve které jsou sloupce: "steamId", "points", "lastUpdateName"
  2. tabulka "ranks2" ve které je sloupec: "points"
  3. tabulka "uconomy" ve které je sloupec: "balance"
steamID lastUpdateName points points balance
- - - - -

tabulku mám momentálně takhle:

<div class="content-loader">

<table cellspacing="0" width="100%" id="rank2" class="table table-striped table-hover table-responsive">
<thead>
<tr>
<th>steamId</th>
<th>points</th>
<th>lastDisplayName</th>
<th>lastUpdated</th>
</tr>
</thead>
<tbody>
<?php
require_once 'dbconfig.php';
$steamId = $_SESSION['steamId'];
$steamprofile['steamid'] = $_SESSION['steam_steamid'];
$stmt = $db_con->prepare("SELECT `steamId`, `points`, `lastDisplayName`, `lastUpdated`
FROM `ranksrussia2` WHERE `steamId` = ?");
$stmt->execute(array($steamprofile['steamid']));
$stmt->execute();
        while($row=$stmt->fetch(PDO::FETCH_ASSOC))
        {
                ?>
                <tr>
                <td><?php echo $row['steamId']; ?></td>
                <td><?php echo $row['points']; ?></td>
                <td><?php echo $row['lastDisplayName']; ?></td>
                <td><?php echo $row['lastUpdated']; ?></td>
                </tr>
                <?php
        }
        ?>
</tbody>
</table>

</div>
 
Odpovědět 7.10.2016 22:26
Avatar
Hando
Člen
Avatar
Hando:7.10.2016 23:00

Ahoj.

SELECT `steamId`, `points`, `lastDisplayName`, `lastUpdated`
FROM `ranksrussia2` WHERE `steamId` = ?

Vždyť tady taháš data jen z jedné tabulky, která navíc chybí v tvém výčtu tabulek. Nemotáš dohromady tabulky a databázi? Jsou ty tabulky nějak propojené?
Jinak samozřejmě výpis ze tří tabulek není takový problém, buďto třeba '... FROM table1, table2 (atd.)', nebo pomocí JOIN, pokud jsou nějak propojené.

 
Nahoru Odpovědět 7.10.2016 23:00
Avatar
Hando
Člen
Avatar
Odpovídá na Jan Kubáč
Hando:7.10.2016 23:08

Doplněno (nemůžu už upravit předchozí příspěvek :( )


Nyní vidím, že používáš kód, který ti někdo napsal ve vlákně zobrazeni-mysql-databaze-pres-steamid, ale zřejmě práci s databází teprve poznáváš. Doporučuji se podívat na nějaký tutorial, třeba ten zdejší: MySQL, jinak budeš při každém dotazu jen hádat, co se to vlastně děje...

Editováno 7.10.2016 23:09
 
Nahoru Odpovědět 7.10.2016 23:08
Avatar
Jan Kubáč
Člen
Avatar
Odpovídá na Hando
Jan Kubáč:7.10.2016 23:17

neznám to správné pojmenování v phpmyadmin je název Tabulek "ranks", "ranks2" a "uconomy" a všechny jsou v jedné databázi.

Zkoušel jsem, ale timto se nezobrazí vůbec nic

<div class="content-loader">

<table cellspacing="0" width="100%" id="rank2" class="table table-striped table-hover table-responsive">
<thead>
<tr>
<th>steamId</th>
<th>points</th>
<th>lastDisplayName</th>
<th>lastUpdated</th>
<th>balance</th>
</tr>
</thead>
<tbody>
<?php
require_once 'dbconfig.php';
$steamId = $_SESSION['steamId'];
$steamprofile['steamid'] = $_SESSION['steam_steamid'];
$stmt = $db_con->prepare("SELECT `steamId`, `points`, `lastDisplayName`, `lastUpdated`
FROM `ranksrussia2, uconomy` WHERE `steamId` = ?");
$stmt->execute(array($steamprofile['steamid']));
$stmt->execute();
        while($row=$stmt->fetch(PDO::FETCH_ASSOC))
        {
                ?>
                <tr>
                <td><?php echo $row['steamId']; ?></td>
                <td><?php echo $row['points']; ?></td>
                <td><?php echo $row['lastDisplayName']; ?></td>
                <td><?php echo $row['lastUpdated']; ?></td>
                <td><?php echo $row['balance']; ?></td>
                </tr>
                <?php
        }
        ?>

</tbody>
</table>

</div>
 
Nahoru Odpovědět 7.10.2016 23:17
Avatar
Hando
Člen
Avatar
Odpovídá na Jan Kubáč
Hando:7.10.2016 23:31

"ranks", "ranks2" a "uconomy" a všechny jsou v jedné databázi

MySQL podrobněji:

tabulka "ranks" ve které jsou sloupce: "steamId", "points", "lastUpdateName"
tabulka "ranks2" ve které je sloupec: "points"
tabulka "uconomy" ve které je sloupec: "balance"

"SELECT `steamId`, `points`, `lastDisplayName`, `lastUpdated`
FROM `ranksrussia2, uconomy` WHERE `steamId` = ?"

A kde máš tabulku 'ranksrussia2'? Navíc pokud používáš WHERE klauzuli, musíš specifikovat, ke které tabulce z from (pokud jich je víc než jedna) patří.

Mimochodem, pokud má jeden vypsaný řádek na té tvé stránce reprezentovat údaje k jednomu hráči (což hádám ze SteamID), tak bys měl těm tabulkám nějak říct, které řádky patří k sobě. Pokud tedy netajíš něco ve svém výpisu "MySQL podrobněji". :)

Zkoušej si ty dotazy přímo v PHPMyAdminu, nebo Admineru (nevím, co používáš), jakmile ti budou fungovat, tak je převeď do php - ušetříš si práci hledáním chyby ve dvou kódech naráz.

 
Nahoru Odpovědět 7.10.2016 23:31
Avatar
Jan Kubáč
Člen
Avatar
Odpovídá na Hando
Jan Kubáč:7.10.2016 23:59

tabulku ranksrussia2 jsem uvedl jen jako příklad, pouze jsem spletl názvy, nejde o názvy ale o funkci kterou mám použít snad ne.

WHERE steamId - "steamId" mám obsažené v každé tabulce

 
Nahoru Odpovědět 7.10.2016 23:59
Avatar
Hando
Člen
Avatar
Odpovídá na Jan Kubáč
Hando:8.10.2016 2:16

Takže když spustíš samotný dotaz na databázi přímo v konzoli PHPMyAdminu, tak ti to vrátí kloudný výsledek? To je potřeba dát prvně do pořádku.

WHERE steamId - "steamId" mám obsažené v každé tabulce

Jestli máš steamId v každé tabulce a odpovídají si, tak je můžeš lehce propojit pomocí JOIN. Ale uvádíš částečné informace, to je věštění z křišťálové koule. S tím hodně štěstí. :)

 
Nahoru Odpovědět 8.10.2016 2:16
Avatar
Jan Kubáč
Člen
Avatar
Jan Kubáč:8.10.2016 11:38

Dotaz v databázi? nevím co bych tam měl zkoušet. Přímo na webu to funguje

Co je ještě potřeba uvést? Mám tři tabulky

1. tabulka "ranks"

steamId points lastDisplayName lastUpdated
- - - -



2. tabulka "ranksrussia2"

steamId points lastDisplayName lastUpdated
- - - -



3. tabulka "uconomy"

steamId balance lastUpdated
- - -





A chtěl bych je dát dohromady

steamId points lastDisplayName lastUpdated points balance
- - - - - -
 
Nahoru Odpovědět 8.10.2016 11:38
Avatar
Petr Linhart
Člen
Avatar
Odpovídá na Jan Kubáč
Petr Linhart:8.10.2016 12:13
<div class="content-loader">

        <table cellspacing="0" width="100%" id="rank2" class="table table-striped table-hover table-responsive">
                <thead>
                <tr>
                        <th>steamId</th>
                        <th>points (ranks)</th>
                        <th>lastDisplayName</th>
                        <th>lastUpdated</th>
                        <th>points (ranks2)</th>
                        <th>balance</th>
                </tr>
                </thead>
                <tbody>
                <?php
                require_once 'dbconfig.php';
                /**
                 * $steamId = $_SESSION['steamId']; zbytečné, zbylo z pokusů
                 * $steamprofile['steamid'] = $_SESSION['steamId']; tohle je v includovaném souboru
                 */
                $stmt = $db_con->prepare("SELECT ranks.id, ranks.steamId, ranks.points, ranks.lastDisplayName, ranks.lastUpdated, ranks2.points AS points2, uconomy.balance
                        FROM ranks
                        INNER JOIN ranks2 ON ranks.steamId = ranks2.steamID
                        LEFT JOIN uconomy ON ranks.steamId = uconomy.steamId
                        WHERE ranks.steamId = ?");
                $stmt->execute(array($steamprofile['steamid']));
                // $stmt->execute(); tohle je navíc, máš to o řádek výš
                                while($row=$stmt->fetch(PDO::FETCH_ASSOC))
                                {
                                        echo "<td>". $row['steamId']."</td><td>". $row['points'] ."</td><td>". $row['lastDisplayName'] ."</td><td>". $row['lastUpdated'] ."</td><td>". $row['points2'] ."</td><td>". $row['balance'] ."</td>";
                                }
                                ?>

                </tbody>
        </table>
</div>

Odstraň ty zbytečné řádky co sis tam nakopíroval minule. A uprav dotaz na db tak aby spojila tabulky na základě steamId.
Hando ti dobře radil, aby sis prošel výukové lekce k Mysql a Databáze v PHP pro začátečníky .

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 8.10.2016 12:13
Avatar
Jan Kubáč
Člen
Avatar
Jan Kubáč:8.10.2016 12:59

jestli se mohu ještě zeptat, co znamená to ranks.id v SELECTu? Když to vynechám vše funguje. A teď kdybych chtěl přidat další tabulku, stačí funkce LEFT JOIN jestli to chápu správně? Děkuji

 
Nahoru Odpovědět 8.10.2016 12:59
Avatar
Petr Linhart
Člen
Avatar
Odpovídá na Jan Kubáč
Petr Linhart:8.10.2016 13:31

ranks.id vybírat nemusíš, dotaz na něm není závislý, jedná se jen o sloupec v tabulce ranks sloužící jako primární klíč.

Na dotaz přes více tabulek slouží klauzule JOIN. Ta má ale více podob a je potřeba zvolit tu správnou podle potřeby a závislostí dat v tabulkách.
Existují:
INNER JOIN (často psáno jen JOIN)
LEFT JOIN (nebo LEFT OUTER JOIN)
RIGHT JOIN (nebo RIGHT OUTER JOIN)
FULL OUTER JOIN

Vysvětlení najdeš v článku 7. díl - MySQL krok za krokem: Dotazy přes více tabulek (JOIN)

 
Nahoru Odpovědět 8.10.2016 13:31
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.