Diskuze: MySQL tabulka
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 11 zpráv z 11.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
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é.
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...
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>
"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.
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
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í.
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
<br>
1. tabulka "ranks"
steamId | points | lastDisplayName | lastUpdated |
- | - | - | - |
<br>
2. tabulka "ranksrussia2"
steamId | points | lastDisplayName | lastUpdated |
- | - | - | - |
<br>
3. tabulka "uconomy"
steamId | balance | lastUpdated |
- | - | - |
<br>
<br>
A chtěl bych je dát dohromady
steamId | points | lastDisplayName | lastUpdated | points | balance |
- | - | - | - | - | - |
<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 .
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)
Zobrazeno 11 zpráv z 11.