« 1 2 »
Autor Zpráva
PP06
Profil
Ahojte, chcel by som si vytvorit databazu filmov, ale narazam na problem menom php :( Zvladol som spravit script ktory robi tabulku v subore, ale nech robim co robim, tak databaza strajkuje. Ano googlil som aj mi to funguje, ale iba z dvoma hodnotami, ako nahle pridam tretiu alebo dalsiu tak to do databazy nezapise nic. Tak som googlil znova a nasiel som aj take navody, lenze kazdy jeden je pisany tak ako keby som php ovladal, co je problem, pretoze toto je moj prvy pokus z php (a dufam ze posledny). Ale k veci takto vypada moj formular:

  <FORM ACTION="Spracuj.php" METHOD="POST"><TABLE ALIGN="LEFT" BORDER="0">
   <TR><TD COLSPAN="6"><P>Názov filmu:</P></TD>
       <TD COLSPAN="4"><P>Umiestnenie:</P></TD></TR>
   <TR><TD COLSPAN="6"><INPUT TYPE=TEXT SIZE=50 NAME=Nazov></TD>
       <TD COLSPAN="2"><SELECT NAME=Umiestnenie SIZE=1>
               <OPTION VALUE=Akcne>Akčné
               <OPTION VALUE=Dobrodruzne>Dobrodružné
               <OPTION VALUE=Dokument>Dokumenty
               <OPTION VALUE=Horory>Horory
               <OPTION VALUE=Historicke>Historické
               <OPTION VALUE=Komedie>Komédie
               <OPTION VALUE=Ostatne>Ostatné
               <OPTION VALUE=Romanticke>Romantické
               <OPTION VALUE=Rozpravky>Rozprávky
               <OPTION VALUE=SciFi>SciFi
               <OPTION VALUE=Serialy>Seriály</SELECT></TD>
       <TD><INPUT TYPE=CHECKBOX CHECKBOX NAME=3D VALUE="3D"></TD>
       <TD WIDTH="80"><P>3D</P></TD></TR>
   <TR><TD COLSPAN="10"><P>Žáner:</P></TD></TR>
   <TR><TD><INPUT TYPE=CHECKBOX CHECKBOX NAME=Akcny VALUE="Akčný"></TD><TD WIDTH="80"><P>Akčný</P></TD>
       <TD><INPUT TYPE=CHECKBOX CHECKBOX NAME=Detektivny VALUE="Detektívny"></TD><TD WIDTH="80"><P>Detektívny</P></TD>
       <TD><INPUT TYPE=CHECKBOX CHECKBOX NAME=Dobrodruzny VALUE="Dobrodružný"></TD><TD WIDTH="80"><P>Dobrodružný</P></TD>
       <TD><INPUT TYPE=CHECKBOX CHECKBOX NAME=Dokument VALUE="Dokument"></TD><TD WIDTH="80"><P>Dokument</P></TD>
       <TD><INPUT TYPE=CHECKBOX CHECKBOX NAME=Drama VALUE="Dráma"></TD><TD WIDTH="80"><P>Dráma</P></TD></TR>
   <TR><TD><INPUT TYPE=CHECKBOX CHECKBOX NAME=Fantasy VALUE="Fantasy"></TD><TD WIDTH="80"><P>Fantasy</P></TD>
       <TD><INPUT TYPE=CHECKBOX CHECKBOX NAME=Historicky VALUE="Historický"></TD><TD WIDTH="80"><P>Historický</P></TD>
       <TD><INPUT TYPE=CHECKBOX CHECKBOX NAME=Horor VALUE="Horor"></TD><TD WIDTH="80"><P>Horor</P></TD>
       <TD><INPUT TYPE=CHECKBOX CHECKBOX NAME=Katastroficky VALUE="Katastrofický"></TD><TD WIDTH="80"><P>Katastrofický</P></TD>
       <TD><INPUT TYPE=CHECKBOX CHECKBOX NAME=Komedia VALUE="Komédia"></TD><TD WIDTH="80"><P>Komédia</P></TD></TR>
   <TR><TD><INPUT TYPE=CHECKBOX CHECKBOX NAME=Kresleny VALUE="Kreslený"></TD><TD WIDTH="80"><P>Kreslený</P></TD>
       <TD><INPUT TYPE=CHECKBOX CHECKBOX NAME=Krimi VALUE="Krimi"></TD><TD WIDTH="80"><P>Krimi</P></TD>
       <TD><INPUT TYPE=CHECKBOX CHECKBOX NAME=Rodinny VALUE="Rodinný"></TD><TD WIDTH="80"><P>Rodinný</P></TD>
       <TD><INPUT TYPE=CHECKBOX CHECKBOX NAME=Romanticky VALUE="Romantický"></TD><TD WIDTH="80"><P>Romantický</P></TD>
       <TD><INPUT TYPE=CHECKBOX CHECKBOX NAME=Rozpravka VALUE="Rozprávka"></TD><TD WIDTH="80"><P>Rozprávka</P></TD></TR>
   <TR><TD><INPUT TYPE=CHECKBOX CHECKBOX NAME=Serial VALUE="Seriál"></TD><TD WIDTH="80"><P>Seriál</P></TD>
       <TD><INPUT TYPE=CHECKBOX CHECKBOX NAME=SciFi VALUE="SciFi"></TD><TD WIDTH="80"><P>SciFi</P></TD>
       <TD><INPUT TYPE=CHECKBOX CHECKBOX NAME=Thriller VALUE="Thriller"></TD><TD WIDTH="80"><P>Thriller</P></TD>
       <TD><INPUT TYPE=CHECKBOX CHECKBOX NAME=Vojnovy VALUE="Vojnový"></TD><TD WIDTH="80"><P>Vojnový</P></TD>
       <TD><INPUT TYPE=CHECKBOX CHECKBOX NAME=Western VALUE="Western"></TD><TD WIDTH="80"><P>Western</P></TD></TR>
   <TR><TD COLSPAN="10" ALIGN="RIGHT"><INPUT TYPE="submit" NAME="Vlozene" VALUE="Vložiť film"></TD></TR>
  </TABLE></FORM>

Toto je subor spracuj.php (mam este iny, ale tento mi pripada lepsi, ked tak poslem aj ten druhy):
<?php
 if (isset($_POST['Nazov']) && isset($_POST['Vlozene']))
  {if (get_magic_quotes_gpc()) {$_POST['Nazov'] = stripslashes($_POST['Nazov']);}
   @$Spojenie = MySQL_Connect("localhost","Domov","xxxxx") or die('Pripojenie k serveru zlyhalo!');
   MySQL_Select_DB("Filmy") or die('Nepodarilo sa označiť databázovú tabuľku!');
    Date('d.m.Y') = $Datum;
    $_POST['Akcny'] = $Akcny;
    $_POST['Detektivny'] = $Detektivny;
    $_POST['Dobrodruzny'] = $Dobrodruzny;
    $_POST['Dokument'] = $Dokument;
    $_POST['Drama'] = $Drama;
    $_POST['Fantasy'] = $Fantasy;
    $_POST['Historicky'] = $Historicky;
    $_POST['Horor'] = $Horor;
    $_POST['Katastroficky'] = $Katastroficky;
    $_POST['Komedia'] = $Komedia;
    $_POST['Kresleny'] = $Kresleny;
    $_POST['Krimi'] = $Krimi;
    $_POST['Rodinny'] = $Rodinny;
    $_POST['Romanticky'] = $Romanticky;
    $_POST['Rozpravka'] = $Rozpravka;
    $_POST['Serial'] = $Serial;
    $_POST['SciFi'] = $SciFi;
    $_POST['Thriller'] = $Thriller;
    $_POST['Vojnovy'] = $Vojnovy;
    $_POST['Western'] = $Western;
    $_POST['3D'] = $3D;
    $_POST['Nazov'] = $Nazov;
    $_POST['Umiestnenie'] = $Umiestnenie;
   $sql = mysql_query("INSERT INTO Filmy(Datum,Akcny,Detektivny,Dobrodruzny,Dokument,Drama,Fantasy,Historicky,Horor,Katastroficky,Komedia,Kresleny,Krimi,Rodinny,Romanticky,Rozpravka,Serial,SciFi,Thriller,Vojnovy,Western,3D,Nazov,Umiestnenie) VALUES('$Datum','$Akcny','$Detektivny','$Dobrodruzny','$Dokument','$Drama','$Fantasy','$Historicky','$Horor','$Katastroficky','$Komedia','$Kresleny','$Krimi','$Rodinny','$Romanticky','$Rozpravka','$Serial','$SciFi','$Thriller','$Vojnovy','$Western','$3D','$Nazov','$Umiestnenie')");
    if($sql){echo "Záznam bol úspešne vložený do databázy!";} else {echo "Záznam sa nepodarilo vložiť do databázy!";}
  else {die('Nebol zadaný žiaden názov');}}
 mysql_close();
?>
Uz fakt neviem kde robim chybu alebo ako to spravit.
A prosim odpustite si spravy typu ze som uplne blby, ano som preto sem pisem o pomoc, ak mi dakto pomoze, tak dakujem.
juriad
Profil
V tom kusu kódu je mraky chyb. Takové množství, že skoro nemá smysl se pokoušet to spravovat. Nechceš se PHP naučit pořádně? K tomu HTML se nebudu vyjadřovat, sice funguje, ale... Návrh databáze také není dobrý.

Chyby v PHP (kvůli kterým to nefunguje):
1) Hodnoty se přiřazují zprava do leva, tedy na řádcích 6 - 29 zaměň levou a pravou stranu rovnítka.
2) Na 27. řádku se pokoušíš použít proměnnou $3D - proměnné ale nesmí začínat číslovkou, změň ji třeba na $z3d (a stejně potom také její použití na 30. řádku).

A piš prosím s diakritikou, tvůj projev je špatně srozumitelný.
lionel messi
Profil
PP06:
Po opravení najväčších chýb, ktoré ti vytkol juriad, popracuj na databázovom návrhu. V prvom rade by ma zaujímalo, či chceš mať jeden film v jednej alebo viacerých kategóriách (napr. Hľadá sa Nemo - bude v len v kreslených, alebo ho budeš chcieť zaradiť aj medzi rozprávky/rodinné). Odporúčam skôr druhú možnosť (podobný film môže časť užívateľov hľadať pod jedným žánrom a časť pod iným, keďže sa vzájomne prelínajú).

Mať v jednej tabuľke 22 stĺpcov na žáner filmu síce zaváňa originalitou, ale zároveň aj ťažkosťami. Predstav si, že budeš chcieť (alebo musieť) pridať novú kategóriu, napr. o biografických filmoch. Pridáš do tabuľky ďalší stĺpec Biograficky a jeden záznam za druhým upravíš? Budeš sa v db vyznať? Bude sa ti dobre spravovať? Dokážeš jednoducho napísať všetky dotazy, ktoré budeš potrebovať?

Odstráň celú vytvorenú databázu. Začni tým, že vytvoríš tabuľku filmy. Každému filmu pridáš nejaký unikátny primárny kľúč (ak ho už nepoužívaš, predpokladám, že nie). Na to budeš potrebovať stĺpec nazvaný príslovečne id (odporúčam začínať názvy db stĺpcov malým písmenom) a pomocou AUTO_INCREMENT zaistíš jeho zvýšenie o 1 vždy pre každý nový vložený záznam. Stĺpec Umiestnenie vôbec nepotrebuješ, uchováva duplicitnú informáciu, s kategóriami pracuješ inak.

Tabuľka filmy teda bude vyzerať zhruba takto:
id | nazov
1 | Harry Potter a kameň mudrcov
2 | Psycho
3 | Hľadá sa Nemo
4 | Jumanji

Budeš pokračovať vytvorením novej tabuľky kategorie. Tá bude opäť obsahovať stĺpec id (fungovať bude na rovnakom princípe ako v tabuľke filmy) a kategoria. Trebárs takto:

id | kategoria
1 | Fantasy
2 | Horor
3 | Kreslený
4 | Rodinný
5 | Komédia
6 | Akčný
…

Celú prácu zavŕšiš tvorbou tzv. väzobnej tabuľky filmy_kategorie_vazba, kde na základe primárnych kľúčov oboch tabuliek spojíš filmy s príslušnými kategóriami takto:

id_filmu | id_kategorie
1 | 1
2 | 2
3 | 3
3 | 4
3 | 5
4 | 1
4 | 4
…

Teda Harry Potter bude len v kategórii Fantasy, Psycho medzi horormi, Hľadá sa Nemo zároveň v kreslených, rodinných i komédiách a Jumanji medzi rodinými a fantasy, čo lepšie zodpovedá skutočnosti a s údajmi sa bude pracovať omnoho lepšie.

Proces, ktorý som načrtol, sa nazýva normalizácia databáze, prečítaj si o tom čosi viac.
PP06
Profil
juriad: riadky 6-29 som mal aj opacne, nefungovalo to ani tak (toto je posledny pokus co som našiel niekde na nete), respektíve pri 2 premmenných to fungovalo tak i tak. Premmennú 3d upravim (dik za info).

lionel messi: Áno filmy budú mať viac kategórií, tak ako si písal. Prekvapím ťa ale ID som v tabulke mal. Dokonca mám v tabuľke aj dátum. A umiestnenie nechcem rušiť, pretože na každý žáner nebude zvlášť zložka (napr.: nemo by musel byť potom umiestnený v rozprávkach aj v kreslených aj v rodinných a to je zbytočné plytvanie miestom). Takže namiesto toho potrebujem len dalšiu informáciu kde sa ten film nachádza.

Tvoj návrh databázy sa mi celkom páči, niečo také som našiel aj na nete, len to bolo písane moc odborne. K mojmu učeniu php, to bych neriskoval, vážne by to ohrozilo stabilitu celého internetu :D (ved vidíš tie moje kódy)

A ako by teda malo vypadať zadanie 1 filmu do viacerých tabuliek? (1.tabulka=názov, 2. tabulka=žánre, 3.tabulka= dátum, 4.tabulka=umiestnenie). Pretože stále mi zostáva 24 premenných, ktoré dáko musím poslať do databáze.
mimochodec
Profil
PP06:
A ako by teda malo vypadať zadanie 1 filmu do viacerých tabuliek?

Přidáš film do tabulky "filmy". Zjistíš ID, které mu bylo přiřazeno. Pak přidáš řádek do tabulky filmy_kategorie_vazba. ID filmu znáš, ID žánru taky - získáš ho z toho <select>u.

edit: až teď mě napadlo, že ses ptal trochu na něco jiného, než jsem myslel, takže doplňuju:
<select> má volbu multiselect, která umožní vybrání více voleb. Všechny ty volby vezmeš z GETu, stejně jako v tom prvním případě jednou vložíš film, zjistíš jeho ID a pak uděláš insert pro každou z těch položek zvlášť. Jestli máš pocit, že těch položek bude časem "strašně" moc, tak se tím netrap. Přesně na to jsou databáze stavěné a jejich pocit "strašně moc" nezačíná ani u sedmimístných čísel.
PP06
Profil
mimochodec: Dik za odpoveď, ale takýchto odpovedí je plný internet, ešte tam bývajú aj časti kódu vytrhnuté z kontextu a aj keď to dám dokopy tak to nefunguje. Takže toto mi moc nepomohlo, na začiatku som vravel ze php vobec neovláadam (a ani sa mi ho nechce učiť kôli jednej veci), Takže ak by sa dalo trocha viac polopatisticky.
mimochodec
Profil
PP06:
Já mám skoro pocit, že ty nechceš radu, kterou bys měl pochopit, ale řešení, které bys nakopíroval a ono to fungovalo. Kostru až do detailů popsal lionel messi, já jsem doplnil, jak s tím zacházet. Nejdřív se pokus vstřebat, jak mají být data uspořádána, tzn. [#3]. Další věcí je, jak to obsluhovat, tzn, [#5]. S konkrétním kódem ti někdo může pomoct, nepůjde to ale bez toho, že bys chápal, co děláš.
PP06
Profil
Čo som pochopil (aspon dufam):
vytvoril som si databázu "filmy" z tabilkami "nazov-filmu" "datum_filmu" "umiestnenie_filmu" "zaner_filmu" "vazobna_tabulka"

Tabulky "nazov, datum," majú dva stĺpce "id" a "hodnotu".
Tabulky "umiestnenie, zaner" majú tiež dva stĺpce "id" a "hodnotu" kde ale hodnota je už zapísaná a dalšia sa dopĺnať nebude (možno vínimočne).
Vazobná tabulka ma stlpce "id_filmu" "id_datumu" "id_umiestnenia" "id_zanru" (pri tejto tabulke som si neni istý či mám doplnit ešte jedinečné id pre tuto tabulku, kedže všetky ostatné stĺpce môžu mať rovaké hodnoty).

No a princíp by mal byť taký že vložím hodnotu do tabulky "nazov-filmu" a "datum_filmu" (to ešte zvládam), potom zistím id záznamu z tabuliek. Vložím ho do vazobnej tabulky a doplním tam id z tabuliek "umiestnenie_filmu" a "zaner_filmu". A tým by mal byť záznam kompletný. Takže takto som to pochopil (dúfam že správne) a práve tento posledný krok mi nieje vôbec jasný ako to celé urobit.

A áno celý kód by bol ideálny, ale to mi asi nik nenapíše, tak bych bol vdačný aj za hociaký iný opajcovaný odkialkolvek čo robí presne to isté. (síce nad tým strávim zase mnoho hodín premýšlania a upravovania ale aspoň sa zas o kúsok pohnem). Pretože ked mi dáš len <select> multiselect a GET, tak ztoho neviem bohužial nič :(
mimochodec
Profil
PP06:
ok, ukázka, jak vypsat do formuláře všechny žánry a jak je pak zpracovat.

Nejdřív ve formuláři:

<?php
        echo "<form action='zpracuj.php' method='post'>";
        echo "Název filmu: <input name='nazev'><br>";
        echo "<select name='zanry' multiple='multiple' size='10'>";
        
          $qry = "SELECT * FROM zanry ORDER BY nazev";
          $vysledek=mysql_query($qry);
          $radku=mysql_num_rows($vysledek);
          
          if ($radku>0) {
            while ($zaznam=MySQL_Fetch_Array($vysledek)):
              echo "<option value='".$zaznam["ID"]."'>".$zaznam["nazev"]."</option>";
            endwhile;
          };

        echo "</select>";
        echo "<input type='submit' value='Odešli'>";
        echo "</form>";
?>

V tom formuláři budeš mít těch prvků víc, resp. všechny, co potřebuješ. Ukazuju jen ten select. Taky podotýkám, že nad tím se musíš připojit k databázi. Jestli nevíš jak, zeptej se.

V souboru zpracuj.php pak bude:
<?php
// zase pripojeni k databázi 
if (isset($_POST['nazev'])) {

  $nazev = $_POST["nazev"];
  $zanry = $_POST["zanry"];

  $qx = "INSERT INTO filmy (nazev)
  VALUES 
  ( '".$nazev."')
  ";
  
  $ret=mysql_query($qx);
  
  $idfilmu=mysql_insert_id();


  foreach ($zanry as $zanr) {

    $qx = "INSERT INTO filmy_zanry (IDfilmu, IDzanru)
    VALUES 
    ( ".$idfilmu.", ".$zanr.")
    ";
    
    $ret=mysql_query($qx);
  }
}
?>

Doufám, že tam není zbytečně moc překlepů. Ber na vědomí, že ty z formuláře odeslané údaje budeš muset ještě ošetřit kvůli bezpečnosti, ale pro pochopení podstaty (a protože jsem lín) sem to ošetření teď nepíšu. Vyzkoušej si to, testuj, dej vědět.
PP06
Profil
mimochodec: funguje to na 99% Problém je asi niekde v riadku 18 (foreach). Celé to inak robí to čo má: zapíše to film do svojej tabulky a zistí jeho ID a potom to ID zapíše do vazobnej tabulky spolu z id žánru, ale spraví to iba ked nahradím foreach natvrdo a mám označenú jednu hodnotu:
  $id_zanru = $_POST["zaner"];
(to znamená že som pripojený k databázi, mám vybratú tabulku a zapisujem do správnych stĺpcov).

Ak tam nechám to foreach tak do vazobnej tabulky nezapíše nič. Snažil som sa to neakú tu hodinu naštudovať a nájsť chybu, ale nenašiel som :(

<?php
   @$spojenie = MySQL_Connect("localhost","Domov","xxxxx") or die('Pripojenie k serveru zlyhalo!');
   MySQL_Select_DB("filmy") or die('Nepodarilo sa označiť databázovú tabuľku!');
if (isset($_POST['nazov'])) {
 
  $nazov = $_POST["nazov"];
  $zaner = $_POST["zaner"];
  
  $qx = "INSERT INTO nazov_filmu (nazov)
  VALUES 
  ( '".$nazov."')
  ";
  
  $ret = mysql_query($qx);
  
  $id_filmu = mysql_insert_id();
 
  foreach ($zaner as $id_zanru) {
 
    $qx = "INSERT INTO vazobna_tabulka (id_filmu, id_zanru)
    VALUES 
    ( ".$id_filmu.", ".$id_zanru.")
    ";
    
    $ret = mysql_query($qx);
  }
}
?>
mimochodec
Profil
PP06:
Pardon, byla tam chybka. V tom formuláři si oprav:

    echo "<select name='zaner[]' multiple='multiple' size='10'>";
PP06
Profil
mimochodec:
Chcel som sa spýtat ešte na jednu vec, keďže vo výsledku budem chcieť zoraďovať filmy aj abecedne (napr všetky filmy začínajuce A), mal by som si vytvoriť v databázi ďalšiu tabulku zo začiatočnými znakmi a tie priradiť ku filmom (pomocov dákeho kódu pri vkladaní filmov do databázy), alebo sa to dá riešiť az potom z celého názvu filmu (ak druhá možnosť stačí mi áno, riešiť sa to pokúsim najskvôr sám, až za mesias vás budem znova otravovať :) ).

A vlastne ešte si načal ošetrenie bezpečnosťi, myslím že máš na mysli vstupné hodnoty, aby som omylom nezadal blud.
V podstate mám len 4 vstupné premmenné (názov, dátum, umiestnenie, žáner). Dátum je generovany (neviem či sa dá dáko ošetrit), umiestnenie a žáner majú pevne definované hodnoty načítane z databázy (tu je možné asi ošetrenie či je premenná číslo) a pri názve sa bojím toho že ak niekedy budem potrebovať vložiť dáky špeciálny znak tak to nepôjde, pretože to ošetrenie nepustí.

A ošetrenie neuspešného vloženia záznamu už máam (aké také) Alebo si mal na mysli ešte dáke iné ošetrenie bezpečnosti?
mimochodec
Profil
PP06:
zoraďovať filmy aj abecedne

SELECT ... ... ORDER BY nazev - řazení je věcí dotazu. Žádné extra pole nebo tabulka nejsou potřeba.

ošetrenie bezpečnosťi, myslím že máš na mysli vstupné hodnoty
Mám na mysli ošetření na trase mezi formulářem a vložením do databáze. Zkus si do toho formuláře zadat jméno Chris O'Dowd. Dotaz se neprovede, protože

INSERT INTO nazov_filmu (nazov)  VALUES 'Chris O'Dowd'

Pro ošetření vstupů (říká se tomu escapování) se používá php.net/manual/en/function.mysql-real-escape-string.php

Další věcí je tam kde do databáze má jít číslo (třeba v tom poli id žánrů), zajistit, aby nic než číslo neprošlo. K tomu použij php.net/manual/en/function.intval.php
Vždycky počítej s tím, že tam, kde je formulář, je vidět stránka, která hodnoty zpracovává a jak se mají jmenovat. Když je někde ve formuláři nějaké id něčeho, představ si situaci, kdy ti tam někdo místo čísla podstrčí třeba hodnotu "5 OR ID=10". Slož si ten dotaz a domysli, co to udělá, když nebudeš mít ošetřeno, aby ta hodnota byla integer.
PP06
Profil
mimochodec:
Tak som sa to pokúsil spraviť a narazil som pri tom ošetrovaní na dve chyby:
Prvá je v riadku 3 či vložím dáky názov filmu do poľa alebo ho nechám prázdne, tak to vyhodnoťí ako platný názov, ale keď nezadám žiaden žáner tak to vyhodnotí správne ako chybu, prečo isset pri názve nefunguje? (respektíve čím to nahradíť aby som sa vyhol zadaniu filmu bez názvu?

Druhá chyba je v riadku 7, ako náhle som tam vložil intval, tak to prestalo fungovať (a bolo jedno či som mal označený jeden alebo viac žánrov), pokiaľ tam nebol fungovalo to perfektne.
 @$spojenie = MySQL_Connect("localhost","Domov","xxxxx") or die('Pripojenie k serveru zlyhalo!');
 MySQL_Select_DB("Filmy") or die('Nepodarilo sa označiť databázovú tabuľku!');
  if (isset($_POST['nazov']) && isset($_POST['zaner']) && isset($_POST['vlozene'])) {
   $nazov = mysql_real_escape_string($_POST["nazov"]);
   $datum = Date('d.m.Y');
   $id_umiestnenia = intval($_POST["umiestnenie"]);
   $zaner = intval($_POST["zaner"]);

   $qx = "INSERT INTO nazov_filmu (nazov)
   VALUES ( '".$nazov."')";
   $ret = mysql_query($qx) or die('Neplatný názov filmu!');
   $id_filmu = mysql_insert_id() or die('Nepodarilo sa načítať hodnotu z databázy');

   $qx = "INSERT INTO datum_filmu (datum)
   VALUES ( '".$datum."')";
   $ret = mysql_query($qx) or die('Chybný dátum!');
   $id_datumu = mysql_insert_id() or die('Nepodarilo sa načítať hodnotu z databázy');

   foreach ($zaner as $id_zanru) {
     $qx = "INSERT INTO vazobna_tabulka (id_filmu, id_umiestnenia, id_datumu, id_zanru)
     VALUES ( ".$id_filmu.", ".$id_umiestnenia.", ".$id_datumu.", ".$id_zanru.")";
     $ret = mysql_query($qx);

     if($ret){echo "Záznam bol úspešne vložený do databázy!";} else {echo "Záznam sa nepodarilo vložiť do databázy!";}
   }
  } else {echo "Nebol zadaný žiaden názov, alebo žáner!";}
 mysql_close($spojenie);
 echo "<meta http-equiv='refresh' content='5;url=index.php'>";
?>
lionel messi
Profil
PP06:
prečo isset pri názve nefunguje? (respektíve čím to nahradíť aby som sa vyhol zadaniu filmu bez názvu?

Pretože jazyková konštrukcia isset iba kontroluje, či bola premenná nastavená, nie jej obsah. Ak chceš zabrániť odoslaniu prázdnej hodnoty, máš viacero možností:

1. Po issete ešte použiť $_POST["zaner"] != "".
2. Použiť namiesto isset konštrukciu empty. Musíš ale dať pozor na dve veci: Empty vráti true, keď je premenná nenastavená/prázdna a navyše sa ako prázdna vyhodnotí aj 0.
3. Použiť pretypovanie na pravdivostnú hodnotu if($_POST["zaner"]). Hodnota 0 podobne ako v bode 2 však neprejde, pretože sa pretypuje na false.
mimochodec
Profil
Ještě doplním jednu věc. Nevím, co je "datum filmu", ale ať už je to datum premiéry, datum vložení k tobě do DB, nebo ještě něco jiného, prostě pokud jeden film = jedno toto datum, není důvod ho ukládat v extra tabulce.
Tedy použil bych:

$qx = "INSERT INTO filmy (nazov, datum)   VALUES ( '".$nazov."', '".$datum."')";
PP06
Profil
Ja viem že som otravný a aj to ze som z php úplne blbý, ale čo teda z tou druhou chybou?

$zaner = intval($_POST["zaner"]);

Bez intervalu to funguje, sím to nejde ani zo zadaným jedným žánrom ani z viacerými. Snažil som sa to vylúštiť z toho amerického manuálu čo si poslal, hladal som aj riešenie v normálnom jazyku, ale všetko čo som našiel sa týkalo buď jednej hodnoty alebo intervalu ktorý definovaly ručne. A aj ked som skúšal tie riešenia výsledok bol vždy že to nešlo, ako to mám teda ošetrit?
juriad
Profil
Tak přesuň ten intval z 7. řádku (tam dej jen kontrolu is_array). A intval volej až na 21. řádku kolem $id_zanru.
PP06
Profil
Ďakujem všetkým za rady.
PP06
Profil
Ako som sľuboval tak riešim aj načítavanie dát z databázy, a keďže sa mi to dákym zázrakom podarilo spraviť samotnému, tak nechcem zbytočne zakladať ďalšiu tému kôli jednej otázke, ktorú neviem sám vyriešiť.

Takže zhrnutie: mám vazobnú tabulku kde okrem iných sú stĺpce id_filmu a id_zanru, tie odkazujú každý na vlastnú tabuľku, kde filmy sú zadávane a žánre sú už definované.

Robím výber z databázy pomocov príkazu SELECT viem to zoradiť, vyfiltrovať.... jediné čo neviem je žlúčiť dva a viac riadkov do jedného. Príklad môjho výpisu:
Avatar - Scifi
Avatar - Akčný
Avatar - 3D

A chcel by som aby to vypísalo do jedného riadku takto:
Avatar - Scifi, Akčný, 3D

Čo som sa dočítal tak by sa to malo robiť neako pomocov GROUP BY, ale veškeré čské návody čo som našiel riešily iba spočítanie riadkov a to mi je nanič.

Môj select vypadá takto (toto je len pre písmeno A, viem že to mám hrozne napísané, ale funguje to):
$vysledok = mysql_query("SELECT datum, nazov, umiestnenie, zaner
    FROM vazobna_tabulka, datum_filmu, nazov_filmu, umiestnenie_filmu, zaner_filmu
    WHERE id_datumu=idd AND id_filmu=idf AND id_umiestnenia=idu AND id_zanru=idz AND nazov LIKE 'A%'ORDER BY nazov", $spojenie);
lionel messi
Profil
PP06:
Čo som sa dočítal tak by sa to malo robiť neako pomocov GROUP BY

Dobre si sa dočítal. :-)

ale veškeré čské návody čo som našiel riešily iba spočítanie riadkov a to mi je nanič.

Tu funguje zoskupenie na úplne rovnakom princípe:

SELECT datum, nazov, umiestnenie, zaner
    FROM vazobna_tabulka, datum_filmu, nazov_filmu, umiestnenie_filmu, zaner_filmu
    WHERE id_datumu=idd AND id_filmu=idf AND id_umiestnenia=idu AND id_zanru=idz AND nazov LIKE 'A%' GROUP BY nazov ORDER BY nazov

Mimochodom, prečo nepoužívaš spájanie tabuliek pomocou JOIN?
PP06
Profil
"Mimochodom, prečo nepoužívaš spájanie tabuliek pomocou JOIN?"
Pretože toto riešenie mi fungovalo ako prvé.

To čo si mi poradil som skúšal, riadky z rovnakým názvom iba zmiznú a zostane vždy len ten prvý. Čiže z toho mojho prikladu to vypíše iba:
Avatar - Scifi
Ale zvyšné žánre sa neobjavia, asi radšej priložím zvyšok kódu, možno je chyba tam.
   $vysledok = mysql_query("SELECT datum, nazov, umiestnenie, zaner
    FROM vazobna_tabulka, datum_filmu, nazov_filmu, umiestnenie_filmu, zaner_filmu
    WHERE id_datumu=idd AND id_filmu=idf AND id_umiestnenia=idu AND id_zanru=idz AND nazov LIKE 'A%' GROUP BY nazov ORDER BY nazov", $spojenie);
    echo '<BR><BR><B>Všetky filmy začínajúce sa A:</B><BR><BR>';
    echo '<TABLE RULES="ROWS" ALIGN="LEFT" BORDER="1" BORDERCOLOR="#FFFFFF" WIDTH="590">';
    echo '<TR><TD WIDTH="75"><B>Dátum:</B></TD><TD><B>Názov:</B></TD><TD><B>Žáner:</B></TD><TD WIDTH="160"><B>Umiestnenie:</B></TD></TR>';
    while ($zaznam = mysql_fetch_array($vysledok) ): 
     echo '<TR><TD><P>';
     echo $zaznam["datum"];
     echo '</P></TD><TD><P>';
     echo $zaznam["nazov"];
     echo '</P></TD><TD><P>';
     echo $zaznam["zaner"];
     echo '</P></TD><TD WIDTH="160"><P>';
     echo $zaznam["umiestnenie"];
     echo '</P></TD></TR>';
    endwhile;
    echo "</TABLE>";
mimochodec
Profil
PP06:
Toto bych řešil jinak. Nech ten dotaz jak byl (nebo ho přepiš do podoby s JOINem, jak někdo poradí, ale ať je ten výsledek stejný) a pak postupuj podle této logiky:

$poslednipouzity = '';

 while ($zaznam = mysql_fetch_array($vysledok) ): 

    if ($poslednipouzity != $zaznam["nazov"]) {
     echo "<tr><td>".$zaznam["nazov"]."</td><td>";
   }

 echo $zaznam["zaner"]." ";

    if ($poslednipouzity != $zaznam["nazov"]) {
     "</td></tr>";
   }

     
    $poslednipouzity = $zaznam["nazov"];
  endwhile;
Zamysli se, co to dělá a uprav si to podle svých potřeb.
PP06
Profil
Kód funguje, ale má to jeden háčik (tvoj riadok 11 a12).
Výsledná tabuľka má vypadat:
dátum-názov-žáner-umiestnenie
1.1.2000-avatar-scifi, 3d, akčné-C://blabla
...

Podľa tvojho návrhu to robí to že žáner 3d a akčné vypíše až za umiestnenie. (Dokázal som to upraviť aj tak aby bol žáner vypísaný správne, ale potom zase posúvalo celý stĺpec umiestnenia o jeden riadok.) Skúšal som do ciklu WHILE vložiť ešte jeden ktoý to mal vyriešiť, ale asi nemoze vzorec vypadat:
While
....
 while
 ....
 endwihle
 ...
endwhile 
To som skúšal spravit aj ako vlastnú funkciu, ale to mi už vôbec nefungovalo (asi iba kôli chybám). Tak som sa potom pokúšal tú podmienku spravit pomocov IF, ale tá ma zase problém že sa nevracia a test robí len 1x.

Toto je kód kde vypisuje druhý a ďalší žáner filmu až za umiestnenie:
   $vysledok = mysql_query("SELECT datum, nazov, umiestnenie, zaner
    FROM vazobna_tabulka, datum_filmu, nazov_filmu, umiestnenie_filmu, zaner_filmu
    WHERE id_datumu=idd AND id_filmu=idf AND id_umiestnenia=idu AND id_zanru=idz ORDER BY idf DESC LIMIT 0,10", $spojenie);
    echo '<BR><BR><B>Posledných desať pridaných filmov:</B><BR><BR>';
    echo '<TABLE RULES="ROWS" ALIGN="LEFT" BORDER="1" BORDERCOLOR="#FFFFFF" WIDTH="590">';
    echo '<TR><TD WIDTH="75"><B>Dátum:</B></TD><TD><B>Názov:</B></TD><TD><B>Žáner:</B></TD><TD WIDTH="160"><B>Umiestnenie:</B></TD></TR>';
    $poslednipouzity = '';
    while ($zaznam = mysql_fetch_array($vysledok) ): 
     if ($poslednipouzity != $zaznam["nazov"]) {
      echo '<TR><TD><P>';
      echo $zaznam["datum"];
      echo '</P></TD><TD><P>'.$zaznam["nazov"].'</P></TD><TD><P>';
     } if ($poslednipouzity == $zaznam["nazov"]) {echo ", ";}
      echo $zaznam["zaner"];

    if ($poslednipouzity != $zaznam["nazov"]) {
     echo '</P></TD><TD><P>';
     echo $zaznam["umiestnenie"];
     echo '</P></TD></TR>';
   }

     $poslednipouzity = $zaznam["nazov"];
    endwhile;
    echo "</TABLE>";}
mimochodec
Profil
Nevím, jestli ti přesně rozumím, ale nevyřešilo by se to tím, kdyby sis to umístění pamatoval v nějaké proměnné a vypsal až tam, kde ho potřebuješ?

while ($zaznam = mysql_fetch_array($vysledok) ): 

  if ($poslednipouzity != $zaznam["nazov"]) {
    echo "<tr><td>".$zaznam["nazov"]."</td><td>";
    $umiestnenie = $zaznam["umiestnenie"];
  }
  
  echo $zaznam["zaner"]." ";
  
  if ($poslednipouzity != $zaznam["nazov"]) {
    echo "</td><td>".$umiestnenie;
    echo "</td></tr>";
  }
  
  $poslednipouzity = $zaznam["nazov"];
endwhile;
PP06
Profil
Skôr si myslím že by tá logika mala vypadať takto:
vypíše dátum,názov
**vypíše žáner
porovná či sa vypísaný názov rovná z nasledujúcim názvom.
-ak nie vypíše umiestnenie, ak áno vypíše ďalší žáner
-ak áno vráti sa na **

Niečo také ako si písal ty, len to tvoje testuje vypísaný názov z predchádzajúcim názvom a to je problém, trebalo by to testovat vypísaný z ďalším

Alebo ma napadlo či by nebolo vhodnejšie riešenie (ale neviem či sa to dá, alebo ako sa to dá)
vypíše dátum
spočíta počet rovnakých názvov = $vysledok (číslo)
vypíše názov
vypíše $vysledok žánrov
vypíše umiestnenie

Len neviem ako funguje čítanie z databázy, či sa dá vtých riadkoch hore dolu listovať a vracat sa a podobné operácie, alebo to ide len rad za radom.
Takto vypadá výsledok tvojho pôvodného kódu:

A takto z premennou umiestnenie:

Všetky žánre (okrem toho prvého ku každému filmu) to pchá až za tabulku v kóde sú vlastne vypísane medzi riadky tabuľky </tr>....<tr>
mimochodec
Profil
Obrázky nezafungovaly. Můžeš sem dát html kód vygenerovaný tím mým druhým kódem? Stačí jen ten jeden řádek.
PP06
Profil
</TABLE></FORM>
  <BR><BR><B>Posledných desať pridaných filmov:</B><BR><BR><TABLE RULES="ROWS" ALIGN="LEFT" BORDER="1" BORDERCOLOR="#FFFFFF" WIDTH="590"><TR><TD WIDTH="75"><B>Dátum:</B></TD><TD><B>Názov:</B></TD><TD><B>Žáner:</B></TD><TD WIDTH="160"><B>Umiestnenie:</B></TD></TR><TR><TD><P>17.10.2015</P></TD><TD><P>Avatar</P></TD><TD><P>3D</P></TD><TD WIDTH="160"><P></P></TD></TR>, SciFi, Akčný<TR><TD><P>16.10.2015</P></TD><TD><P>Anno</P></TD><TD><P>Dokument</P></TD><TD WIDTH="160"><P></P></TD></TR><TR><TD><P>15.10.2015</P></TD><TD><P>ooo</P></TD><TD><P>Detektívny</P></TD><TD WIDTH="160"><P></P></TD></TR>, Dobrodružný<TR><TD><P>15.10.2015</P></TD><TD><P>pppp</P></TD><TD><P>Katastrofický</P></TD><TD WIDTH="160"><P></P></TD></TR><TR><TD><P>02.10.2015</P></TD><TD><P>fffffff</P></TD><TD><P>Rodinný</P></TD><TD WIDTH="160"><P></P></TD></TR>, Kreslený<TR><TD><P>02.10.2015</P></TD><TD><P>nero</P></TD><TD><P>Rodinný</P></TD><TD WIDTH="160"><P></P></TD></TR></TABLE> </BODY>
Síce tam chýba to umiestnenie ale to je jedno, robí to to isté (stále sa stým hrám).
mimochodec
Profil
Takže od toho druhého filmu dál už je to ok? Proč se ten první vypíše takhle, to úplně nechápu. Když si ten dotaz dáš přímo přes PMA do databáze, vráti ti to něco takového?

Avatar, Scifi
Avatar, Akční
Avatar, třetížánr
druhýfilm, žánr
třetí film, žánr
PP06
Profil
nieje to ok ani dalej, záznam avatar má 3 žánre, tie ďalšie dva čo sú za tabuľkov patria iným filmom.

Ono to robí to že prvý žáner každého filmu vypíše dobre, ale ak má niektorý film viac žánrov, tak to umiestni za tabuľku (respektive v kóde mimo riadky </tr>!!!tu!!!!<tr>).
Tu máš krajší výpis, aby si sa vtom lepšie zorientoval:

<TABLE RULES="ROWS" ALIGN="LEFT" BORDER="1" BORDERCOLOR="#FFFFFF" WIDTH="590"><TR><TD WIDTH="75"><B>Dátum:</B></TD><TD><B>Názov:</B></TD><TD><B>Žáner:</B></TD><TD WIDTH="160"><B>Umiestnenie:</B></TD></TR>
      <TR><TD><P>17.10.2015</P></TD>
      <TD><P>Avatar</P></TD>
      <TD><P>3D</P></TD>
     <TD><P>Filmy\SciFi</P></TD></TR>, SciFi, Akčný
      <TR><TD><P>16.10.2015</P></TD>
      <TD><P>Anno</P></TD>
      <TD><P>Dokument</P></TD>
     <TD><P>Filmy\Akčné</P></TD></TR>
      <TR><TD><P>15.10.2015</P></TD>
      <TD><P>ooo</P></TD>
      <TD><P>Detektívny</P></TD>
     <TD><P>Filmy\Komédie</P></TD></TR>, Dobrodružný
      <TR><TD><P>15.10.2015</P></TD>
      <TD><P>pppp</P></TD>
      <TD><P>Katastrofický</P></TD>
     <TD><P>Filmy\Akčné</P></TD></TR>
      <TR><TD><P>02.10.2015</P></TD>
      <TD><P>fffffff</P></TD>
      <TD><P>Rodinný</P></TD>
     <TD><P>Filmy\Dokumenty</P></TD></TR>, Kreslený
      <TR><TD><P>02.10.2015</P></TD>
      <TD><P>nero</P></TD>
      <TD><P>Rodinný</P></TD>
     <TD><P>Filmy\Romantické</P></TD></TR></TABLE>
« 1 2 »

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0