Autor Zpráva
fiona
Profil *
Ahoj , chtěla bych se zeptat:

1. jak by měla vypadat funkce pro náhodnou změnu Title v hlavičce. Chtěla bych mít třeba tři rozdílné zápisy a ty se mi budou třeba po pul minutě měnít. - Tady vůbec netuším jak na to.
2. Na stránce mám blok s textem a i ten bych chtěla udělat tak aby se mi po 30s změnil na jiný. Textu budu mít asi pět, mám je uložené v databázy a tak asi bych potřebovala poradit jenom s tím náhodným zápisem a změnou. zatím vypisuji jenom takto ten jeden text:
<?php
          $vysledek = ("select * from leva");
          $vysledek=mysql_query($vysledek, $link) or die('Error: '.mysql_error ());
          while ($zaznam=MySQL_Fetch_Array($vysledek)) 
                  {
                     echo "
                         <H2 class='leva'>".nl2br($zaznam['nadpis'])."</H2> 
                             "
                     ;
                  };
?> 
Radovan789
Profil *
Ktomu abys mohla měnit nápis po 30 sekundách budeš potřebovat javascript, PHP to nedokáže, jediné co PHP dokáže tak po načtení stránky náhodně vybrat ten title.
fiona
Profil *
A mohl by jsi mi tedy poradit alespoň s tím title?
Keeehi
Profil
Radovan789:
Pořád to samé, toto nezvládne PHP, ale javascript.
fiona
Profil *
Aha takze oboje javascriptem? A nemáte nějaký odkaz kde to vysvětlují?
dRaGen
Profil
ach jo :( kdy se lidí konečně naućí programovat

1) nepoužívej mysql_query ... je to prasárna
2) neni hezčí psát něco jako
$db->query('select * from leva');

než
$vysledek = ("select * from leva");
$vysledek=mysql_query($vysledek, $link) or die('Error: '.mysql_error ());


4) nemáš ošetřen výstup (je to nebezpečná aplikace vůči XSS)

3) náhodný nadpis uděláš tak že si všechno uložíš do pole a pak náhodně z pole vytáhneš
          $vysledek = ("select zaznam from leva");
          $vysledek=mysql_query($vysledek, $link) or die('Error: '.mysql_error ());
          
          $data = array(); //inicializujeme pole
          
          while ($zaznam=MySQL_Fetch_Array($vysledek)){
                 $data[] = $zaznam;
          }
          
          echo "<h2 class='leva'>". nl2br(htmlspecialchars($data[rand(0,count($data))]['nadpis'], ENT_QUOTES))."</h2>";
Nox
Profil
dRaGen:
no prasárna to není, akorát v této podobně míň pohodlný... ale těžko je to jen o vzhledu zápisu a hlavně toto je očividně dotaz na začátečníka ten/ta těžko bude řešit nějaký funkci pro práci s databází, dbal...

mj. k čemu ty závorky u $vysledek = ("select * from leva"); ?
fiona
Profil *
Moc dekuji za rady, jeste se jenom zeptam na to osetreni vůči XSS? Co to vůbec je a jak na to?
Keeehi
Profil
http://cs.wikipedia.org/wiki/Cross-site_scripting
dRaGen
Profil
Nox:
je to prasácký, vyměníš mysql za pgsql a seš v prdeli. Nepočítaje že to není "čistý řešení"

ty závorky jsou samozřejmě hloupost, nevšiml jsem si jich, když jsem to kopíroval z fionina postu...
Nox
Profil
j, máš pravdu
v tomto konkrétním případě (fiona) bych to ale neřešil
Radovan789
Profil *
Slečna si přála kód tak tady to dávám, ale je to bez databáze na to si už bude muset příjd sama.

<?php
$title[0] = "Titulek cislo 1";
$title[1] = "Titulek cislo 2";
$title[2] = "Titulek cislo 3";

$title = $title[mt_rand(0, 2)];
?>
<title><?php echo $title; ?></title>


dRaGen
4) nemáš ošetřen výstup (je to nebezpečná aplikace vůči XSS)

Ošetřen výstup ? Vtom kódu nic ošetřovat nemusí, je to 100% bezpečné.
vrata
Profil *
Mužu se zeptat proč se nemá používat mysql_query, co je na tom zápisu od fiony špatné:
$vysledek = "select * from leva";
$vysledek=mysql_query($vysledek, $link) or die('Error: '.mysql_error ());


Takto se to učí snad na všech příkladech.
Radovan789
Profil *
vrata:
Tak že to co používá on ti skrátí kód o 1 řádek a pár znaků. Takže oba-dva příklady fungují úplně stejně.
Nox
Profil
Radovan789:
vdyť ona slečna už to dolování má...jen ne tu změnu

snad pojede něco jako (kdyžtak mě prosím opravte)
<?php
$vysledek=mysql_query("select nadpis from leva", $link) or die('Error: '.mysql_error ());
while ($zaznam=MySQL_Fetch_Array($vysledek)) 
  $data[] = htmlspecialchars($zaznam["nadpis"], ENT_QUOTES);
?> 


Postupná změna
(function(){
  var titly = <?php echo json_encode($data)?>;
  var title_vybrany = 0;
  var title_interval = 30000;
  var title = document.getElementsByTagName("title")[0];
  
  var title_cyklovani = setInterval(function(){
    title_vybrany = (title_vybrany + 1) % titly.length;
    title.innerHtml = titly[ title_vybrany ];
  }, title_interval);
})();


Náhodně
(function(){
  var titly = <?php echo json_encode($data)?>;
  var title_interval = 30000;
  var title = document.getElementsByTagName("title")[0];
  
  var title_cyklovani = setInterval(function(){
    title.innerHtml = titly[ Math.floor(Math.random()*titly.length) ];
  }, title_interval);
})();


Ošetřen výstup ? Vtom kódu nic ošetřovat nemusí, je to 100% bezpečné.
Teoreticky by se aplikace neměla spoléhat na to, že data v databázi jsou bezpečná, připomínka byla správná

Radovan789:
Tak že to co používá on ti skrátí kód o 1 řádek a pár znaků. Takže oba-dva příklady fungují úplně stejně.
Není pravda

OOP má mnoho výborných vlastností a umožňuje velkou flexibilitu, za těma pár znakama toho může být mnohem víc, může tam být systém co ti zajistí kompatibilitu s různými databázemi, bude dotazy posílat logujícímu objektu, cachovat... atd.

Větší, seriózní projekt opravdu pomocí kódu z [#13] nepůjde
Radovan789
Profil *
Nox:
Já ti nevím ale viz [#13] ještě používám a nikdo mě za to nevynadal.

Jinak spoléhám na to že každý VSTUP si ošetřím, chceš říct že je lepší oštřit (po druhé) i výstup ? To abych si dopsal do svích stránek :-)
fiona
Profil *
Radovan789:
[#12] Radovan789
Tady to mi připadá celkem dobré na pochopení - v databázy budu mít uložená data a ty pak pomocí výpisu načtu do pole $title? Ano?

Nox:
[#15] Nox
Bohužel tady jsem se trochu ztratila - tady nerozumím co vypisuješ:
$data[] = htmlspecialchars($zaznam, ENT_QUOTES);;

a pak ta následná funkce to už je tedy javacript? a vysvětli mi prosím tady:
var titly = <?php echo json_encode($data)?>;
co je to json_encode?

Děkuji
Nox
Profil
Radovan789:
Co já vim pro koho děláš ;)

Ošetřuje se vždy podle kontextu - pokud vkládáš do DB, ošetřuješ vzhledem k syntaxi té DB, pokud máš výstup do HTML, tak ošetřuješ s ohledem na HTML(/CSS/JS...)

Ošetřování je trochu zavádějící termín, escapování totiž je i k tomu abys prostě vkládal regulérní řetězec
nechceš mít
INSERT INTO table VALUES ('vcera rekl 'ahoj' a sel')

nastala by chyba, proto to escapuješ, aby to byl platný literál

http://phpfashion.com/escapovani-definitivni-prirucka

Pokud při vkládání do DB escapuješ dle HTML, tak už se ti vlastně ty data poškodí

fiona:
Bohužel tady jsem se trochu ztratila - tady nerozumím co vypisuješ:
druhý středník je omylem navíc

nevypisuji nic, přiřazuji záznam do pole

a pak ta následná funkce to už je tedy javacript? a vysvětli mi prosím tady:
tady PHP vpíše do JS skriptu výsledek těch nadpisů - json_encode je PHP funkce, která PHP pole převede na JSON (www.json.org) strukturu, se kterou pracuje JavaScript
Radovan789
Profil *
fiona:
co je to json_encode?

Pomatuj si že správnej kóder/kodŕka si všechno najde a přeloží: http://cz.php.net/manual/en/function.json-encode.php

jinak by to mohlo vypadat takhle (pro pochopení):

<?php
$vysledek=mysql_query("select nadpis from leva") or die('Error: '.mysql_error ());
$i = 0;
while ($zaznam=MySQL_Fetch_Array($vysledek) AND $i<100) {
$title[$i] = htmlspecialchars($zaznam, ENT_QUOTES);
$i++;
}

$title = $title[mt_rand(0, mysql_num_rows(mysql_query("select nadpis from leva")))];
?>

Nezkoušel jsem to ale mělo by to fungovat, samozřejmě kódy nade mnou jsou lepší, tohle jsem napsal pro fionu aby pochopila jak to funguje.
<title><?php echo $title; ?></title>
Nox
Profil
Radovan789:
Ono to dělá trochu něco jiného (a je teda otázka co fiona chce) - moje mění nadpis v intervalu 30s (viz. bod 1 v [#1] fiona), tvůj vybere při generování 1 náhodný nadpis a ten tam zůstane napořád

ad tvůj kód
- lepší je dát limit ($i) už do SQL ($limit = 100; "... LIMIT $limit"); a pak už nemusíš mít 2. podmínku a $i v cyklu
- poslední řádek se dá zapsat hezčej
a) informaci o počtu už dávno víš (query jsi už posílal), není třeba znova posílat
b) pro získání pouze počtu slouží SELECT COUNT(*) FROM table
Radovan789
Profil *
Jo jo, udělal jsem to narychlo a je tam dost chyb jinak použít kód z [#15].
fiona
Profil *
[#15] Nox

Tak už sem se do toho trošičku zamotala a asi nevím jak to celé propojit s tou mojí hlavičkou, myslela jsem že mi stačí uložit to do nějakého souboru.php a ten pak includovat : <title><?php include "title.php";?> </title> ale to je asi blbost a ani mi to nefunguje. Mužeš mi tedy prosím ještě říct co by tam mělo být? Děkuji
fiona
Profil *
Pls.
Když mám tedy tento kód co napíší mezi <title></title> aby se mi to měnilo? A kde přesně bych ho měla mít kód umístěný někde v hlavičce?
Děkuji
<?php
$vysledek=mysql_query("select nadpis from leva", $link) or die('Error: '.mysql_error ());
while ($zaznam=MySQL_Fetch_Array($vysledek)) 
  $data[] = htmlspecialchars($zaznam["nadpis"], ENT_QUOTES);
?> 
<script>
(function(){
  var titly = <?php echo json_encode($data)?>;
  var title_vybrany = 0;
  var title_interval = 30000;
  var title = document.getElementsByTagName("title")[0];
  
  var title_cyklovani = setInterval(function(){
    title_vybrany = (title_vybrany + 1) % titly.length;
    title.innerHtml = titly[ title_vybrany ];
  }, title_interval);
})();
</script>
Nox
Profil
Toto třeba na začátek
<?php
$vysledek=mysql_query("select nadpis from leva", $link) or die('Error: '.mysql_error ());
while ($zaznam=MySQL_Fetch_Array($vysledek)) 
  $data[] = htmlspecialchars($zaznam["nadpis"], ENT_QUOTES);
?> 


pak <title><?php echo $data[ mt_rand(0, count($data)-1 ]?></title>

a ten < script> kamkoli...třeba na konec
fiona
Profil *
[#24] Nox
Děkuji tak to to sice funguje ale nemění se to v tom intervalu, ale akorát když reloaduju stránku. Neměl by tam být ještě nějak zapojen ten script?
Příjde mi jako kdyby se takto vůbec nepoužíval.
Radovan789
Profil *
a ten < script> kamkoli...třeba na konec
Stím nesouhlasím, jestli se nepletu tak by ten script měl být pod tím PHP scriptem aby se tam vypsala proměná $data.

fiona:
Doporučuji ten <SCRIPT> umítit do BODY a PHP těsně nad TITLE
Nox
Profil
Radovan789:
j... ne úplně "kamkoli", ale "kamkoli pod PHP"

jinak je to ale jedno, může být klidně až před </body> ... často se tam dají externí skripty, pak se na ně nemusí čekat při načítání

pokud to JS pořád nebude fungovat... tak buď nám dej prosím odkaz nebo bych zkusil až bude čas něco zbastlit a vychytat chyby
fiona
Profil *
Tak bohužel, pořád se to mění pouze při realoudu, Dám sem celý kód:

<html>
<head>
<?php include "config.php"; 
   $vysledek=mysql_query("select text from title", $link) or die('Error: '.mysql_error ());
   while ($zaznam=MySQL_Fetch_Array($vysledek)) 
   $data[] = htmlspecialchars($zaznam["text"], ENT_QUOTES);
?> 
  <title id="title"><?php echo $data[ mt_rand(0, count($data)-1) ]?></title> 
  <link href="styly/stylhlavni.css" rel="StyleSheet" type="text/css" title="formal">   
</head>

<body>
<script>
(function(){
  var titly = <?php echo json_encode($data)?>;
  var title_vybrany = 0;
  var title_interval = 10;
  var title = document.getElementsByTagName("title")[0];
  
  var title_cyklovani = setInterval(function(){
    title_vybrany = (title_vybrany + 1) % titly.length;
    title.innerHtml = titly[ title_vybrany ];
  }, title_interval);
})();
</script> 

<?php include "hlavicka.php";?>  

<div id="main">
   <div id="levastrana">
        <?php include "leva-strana.php";?>   
   </div> 
   <div id="prostredek">      
   </div> 
   <div id="pravastrana">
   </div> 
<div id="clear"></div>
<div id="paticka">
</div>
</div>
</body>
</html>

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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

0