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

PHP PHP Úprava výpisů z databáze American English version English version

Avatar
michales
Člen
Avatar
michales:

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  -5 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:

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

Nahoru Odpovědět  -1 11.7.2015 14:05
"Cíle by měly být třešínky na dortech, ne na hromadách hoven."
Avatar
Inoue Yūki
Redaktor
Avatar
Odpovídá na michales
Inoue Yūki:

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  +2 11.7.2015 14:35
Avatar
michales
Člen
Avatar
Odpovídá na Inoue Yūki
michales:

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
Inoue Yūki
Redaktor
Avatar
Odpovídá na michales
Inoue Yūki:

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
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
Inoue Yūki
Redaktor
Avatar
Odpovídá na michales
Inoue Yūki:

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  +1 11.7.2015 17:39
Avatar
michales
Člen
Avatar
Odpovídá na Inoue Yūki
michales:

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  -1 11.7.2015 17:42
"Cíle by měly být třešínky na dortech, ne na hromadách hoven."
Avatar
Inoue Yūki
Redaktor
Avatar
Odpovídá na michales
Inoue Yūki:

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
Avatar
michales
Člen
Avatar
Odpovídá na Inoue Yūki
michales:

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
Inoue Yūki
Redaktor
Avatar
Odpovídá na michales
Inoue Yūki:

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
Avatar
michales
Člen
Avatar
Odpovídá na Inoue Yūki
michales:

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  -3 11.7.2015 18:31
"Cíle by měly být třešínky na dortech, ne na hromadách hoven."
Avatar
Inoue Yūki
Redaktor
Avatar
Odpovídá na michales
Inoue Yūki:

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  +3 11.7.2015 18:38
Avatar
mkub
Redaktor
Avatar
Odpovídá na michales
mkub:

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  +2 11.7.2015 23:50
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na Inoue Yūki
Marek Z.:

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  ±0 12.7.2015 0:04
Chybami se člověk učí, běžte se učit jinam!
Avatar
Inoue Yūki
Redaktor
Avatar
Odpovídá na Marek Z.
Inoue Yūki:

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  +1 12.7.2015 7:11
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.