NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Úprava výpisů z databáze

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
michales
Člen
Avatar
michales:11.7.2015 13:37

Ahoj,

potřeboval bych poradit jak upravit následující script:

include "settings.php";
$promena = mysql_real_escape_string($_POST['id1']);
 $query = "SELECT l.skladba, s.Title, s.Artist, s.Composer FROM `lyrics` as l left join songs as s on s.Text = l.text_id WHERE s.`Text` = '$promena'";
$result = mysql_query($query) or die(Mysql_error());
While($results=MySQL_Fetch_Assoc($result))
{
Echo "<b style=\"font-size:13px;\">Název / Title: </b><b>".$results['Title']."</b><br><b style=\"font-size:13px;\">Interpret: </b><b>".$results['Artist']."</b><br><b style=\"font-size:13px;\">Composer: </b><b>".$results['Composer']."</b><br><br>";
echo $results['skladba'];
echo"<br>";
 }

Zobrazuje to název písně, interpreta, skladatele a samotný text písně.
Oč mi nyní jde.
Jde o to že interpretů je mnohem více ale jsou pod v jiném albu ale text písně je stejný.
ID textu písně je v proměnné Text.
Takže oč mi jde.
Potřebuji vypsat:
Title - název písně, jen jednou.
Composer - skladatel, jen jednou, je vždy jeden a ten samej.
Artist - interpret, vypsat všechny interprety kteří zpívají tuto píseň.
skladba - text písně, vypsat jen jednou.

Nyní to je takto, viz obrázek:

Odpovědět
11.7.2015 13:37
"Cíle by měly být třešínky na dortech, ne na hromadách hoven."
Avatar
michales
Člen
Avatar
michales:11.7.2015 14:05

Mínusy jste naklikali, tak teď prosím o radu

Nahoru Odpovědět
11.7.2015 14:05
"Cíle by měly být třešínky na dortech, ne na hromadách hoven."
Avatar
Odpovídá na michales
Neaktivní uživatel:11.7.2015 14:35

Ach bože, občas mám vážně pocit, že lidi, kteří sem chodí, to nemají v hlavě v pořádku. Když dostaneš mínus, asi to něco znamená. Co třeba se nad tím zamyslet?

  • Používáš několik let zastaralý ovladač, řeší se to všude, kde jsi se takový postup vůbec naučil?
  • Neoděluješ vstup od výstupu.
  • A to hlavní - tvoje otázka je strašně zmatená. Nevím, o co ti jde.

Napiš aktuální výsledek a očekávaný výsledek, formuluj otázku a pak ti můžeme pomoct.

Nahoru Odpovědět
11.7.2015 14:35
Neaktivní uživatelský účet
Avatar
michales
Člen
Avatar
Odpovídá na Neaktivní uživatel
michales:11.7.2015 14:51

Chci jen jeden prispevek a v nem toto:
Nazev, composer, text skladby toto vse jen jednou a vsechny interprety.
Nyni je to tak jak na screenu.
ze je tech prispevku nekolik a vzdy jinej interpret a ostatni je stejne.
Takze to co je stejne bude jen jednou a u interpretu budou vsichni interpreti vypsani.

Chtel jsem hned reagovat stejne urazlive jako ty, ovsem rekl jsem si ze nemam ru potrebu.

Nahoru Odpovědět
11.7.2015 14:51
"Cíle by měly být třešínky na dortech, ne na hromadách hoven."
Avatar
Odpovídá na michales
Neaktivní uživatel:11.7.2015 17:08

Pořád to je dost zmatené. Prostě chceš vypsat písničky, které máš v databázi - jejich název, skladatele, text a interpreta? Ten tvůj kód je nepoužitelný, takže tu ti ukážu, jak by to mohlo fungovat obecně:

id nazev skladatel interpret text
1 Píseň 1 Skladatel 1 Interpret 1 1
2 Píseň 2 Skladatel 2 Interpret 2 2

Nevím, proč máš text v jiné tabulce, ale budu předpokládat, že proto máš důvod:

id text
1 Text písně 1
2 Text písně 2

Písně si vybereš v SQL dotazu:

SELECT * FROM `pisne`
JOIN `texty`
ON
`texty`.`id` = `pisne`.`text`

V PDO si na dotaz zavoláš metodu fetchAll a vypíšeš:

$pisne = $dotaz->fetchAll();

V šabloně - oddělené od logiky - si písně vypíšeš pomocí foreach. Nevím, jestli je to to, co jsi chtěl, celý tvůj dotaz je dost zmatený a ani v kódu si toho moc nepřečtu. Takže pokud jsi nedostal očekávanou odpověď (a to nemyslím nijak ofenzivně), zkus otázku znovu přeformulovat.

Kódy jsou netestované a je velká pravděpodobnost, že v nich bude chyba.

Nahoru Odpovědět
11.7.2015 17:08
Neaktivní uživatelský účet
Avatar
michales
Člen
Avatar
Nahoru Odpovědět
11.7.2015 17:29
"Cíle by měly být třešínky na dortech, ne na hromadách hoven."
Avatar
Odpovídá na michales
Neaktivní uživatel:11.7.2015 17:39

Aha, už asi rozumím. Ke každé písni tedy patří jeden nebo více interpreterů. V tom případě bys měl vytvořit tabulku pro interpretery a další speciální tabulku, která bude tyto dvě tabulky spojovat. Tahle "asociační tabulka" bude mít tři sloupce: ID, PISEN_ID, INTERPRET_ID. Až se budeš v PHP ptát, jaké má píseň interprety, necháš si vypsat všechny řádky z této tabulky, které mají dané PISEN_ID. Tak dostaneš několik INTERPRET_ID, které si spojíš s tabulkou s interprety. Jestli potřebuješ nějaký orientační kód, klidně si řekni.

Editováno 11.7.2015 17:40
Nahoru Odpovědět
11.7.2015 17:39
Neaktivní uživatelský účet
Avatar
michales
Člen
Avatar
Odpovídá na Neaktivní uživatel
michales:11.7.2015 17:42

Diky.
Jsem rad ze jsme se nekam dostali.
A hlavne slusne.

Je nejaka moznost to udelat i bez pouziti dalsi tabulky?

Pokud ano, popostrcit me nejakym kodem?
Dekuji

Editováno 11.7.2015 17:43
Nahoru Odpovědět
11.7.2015 17:42
"Cíle by měly být třešínky na dortech, ne na hromadách hoven."
Avatar
Odpovídá na michales
Neaktivní uživatel:11.7.2015 17:45

Tato tabulka využívá obou klíčů a nazývá se vazební. Je to běžná praxe, tudíž se toho nemusíš bát. Pokud vím, tak minimálně MySQL to jinak neumí.

Nahoru Odpovědět
11.7.2015 17:45
Neaktivní uživatelský účet
Avatar
michales
Člen
Avatar
Odpovídá na Neaktivní uživatel
michales:11.7.2015 18:12

Nepochopil jsem přesně co si teď tímto myslel.

Nahoru Odpovědět
11.7.2015 18:12
"Cíle by měly být třešínky na dortech, ne na hromadách hoven."
Avatar
Odpovídá na michales
Neaktivní uživatel:11.7.2015 18:27

Databáze MySQL tuto vazbu jinak nezvládá. Proto potřebuješ další tabulku, která ti spojí data v jiných dvou a více tabulkách. Můžeš pak mít takový sloupec s aditivní schopností (=můžeš přidávat kolik řádků chceš). Nebo se můžeš podívat po jiných databázích, které by tuto vazbu zvládaly (nejsem si jistý, jestli taková existuje, pracuji jen s MySQL). Více se o tom dozvíš ve zdejším tutoriálu (měli by to být posledních několik dílů). http://www.itnetwork.cz/…ze-tutorialy

Editováno 11.7.2015 18:28
Nahoru Odpovědět
11.7.2015 18:27
Neaktivní uživatelský účet
Avatar
michales
Člen
Avatar
Odpovídá na Neaktivní uživatel
michales:11.7.2015 18:31

Jsme v sekci php a věřím tomu že pomocí PHP toho docílit jde.
Nechci to dělat pomocí sql dotazu.
Takže víceméně tento řádek

$query = "SELECT l.skladba, s.Title, s.Artist, s.Composer FROM `lyrics` as l left join songs as s on s.Text = l.text_id WHERE s.`Text` = '$promena'";

zůstane zachován, a po té pomocí php to udělat tak jak potřebuji.
V prvním příspěvku je vidět screen z toho co mi ten script vyhazuje.
A teď jen pomocí PHP to udělat tak jak potřebuji.
Zkusím si s tím pohrát a výsledek sem potom dám.

Nahoru Odpovědět
11.7.2015 18:31
"Cíle by měly být třešínky na dortech, ne na hromadách hoven."
Avatar
Odpovídá na michales
Neaktivní uživatel:11.7.2015 18:38

Budeš zbytečně třídit data v PHP, místo toho, aby sis vybral v SQL přesně to, co potřebuješ. Proč to komplikuješ? Zvlášť, když PHP moc neovládáš. SQL s PHP souvisí jako IT s počítačem. Jestli chceš rady ohledně PHP:

  • začni s OOP (alespoň základní úroveň, abys mohl používat knihovny třetích stran, jako je např. =>), používej nějaký moderní ovladač (třeba PDO)
  • nauč se nějaké architektury, které ti dovolí logiku oddělit od výpisu (příkladem jsou široce využívané MVP/MVC)
  • přečti si něco o prepared statements, mysql_real_es­cape_strings není zrovna dvakrát bezpečné (to platí pro všechny funkce s prefixem mysql_)

To jsou nejdůležitější, nejzákladnější a velmi nezbytné věci, které musíš ovládnout.

Editováno 11.7.2015 18:39
Nahoru Odpovědět
11.7.2015 18:38
Neaktivní uživatelský účet
Avatar
mkub
Tvůrce
Avatar
Odpovídá na michales
mkub:11.7.2015 23:50

a prejdi na novsi ovladac - na PDO (PHP Databaze Object), ktory ani nepotrebuje escapeovat, kedze pouziva prepared statements a vo verzii PHP 7 uz sa s ovladacom mysql_ nepocita a momentalne v PHP 5.x sa povazuje za zastaraly

 
Nahoru Odpovědět
11.7.2015 23:50
Avatar
Odpovídá na Neaktivní uživatel
Uživatel sítě :12.7.2015 0:04

Nechápu proč by to neměl mít v hlavě v pořádku. Toto je celkem starý postup, setkávám se s tím, poměrně často, když mám upravit starší aplikace..

Náhodou, plus za to, že to escapuje. Spíže lidé co dávají mínus aniž by uvedli důvod to nemají jaksi srovnané. Kolikrát mám dojem, že nerozumí dotazu tak proč nedat mínus..

michales: Je fakt, že je to zastaralí ovladač, přejdi na PDO jak radí mkub.

Nahoru Odpovědět
12.7.2015 0:04
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na Uživatel sítě
Neaktivní uživatel:12.7.2015 7:11

Taky jsem neříkal, že to nemá v hlavě v pořádku, když používá mysql_. To už jsem psal do seznamu věcí, které by měl v první řadě změnit.

Všude na internetu lidi za tyto funkce dostanou vynadáno, téměř ve všech novějších návodech upozorňují, že jsou funkce mysql_ deprecated, dokonce myslím, že ti PHP taky vyhubuje, že je používáš, tím si ale nejsem jistý. Každopádně mě jenom zajímalo, kde se takové funkce naučil, pokud tedy není věčným studentem od roku 2009. Rozhodně bych ho za to ale neukamenoval, byla to jen věcná poznámka, že to je špatně.

Naštvalo mě, že nedokáže normálně formulovat otázku (až na potřetí a to pomocí obrázku), přestože se jedná o triviální záležitost. Proto se lidem ani nedivím, že otázce nerozuměli.

Editováno 12.7.2015 7:13
Nahoru Odpovědět
12.7.2015 7:11
Neaktivní uživatelský účet
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 16 zpráv z 16.