21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
Autor Zpráva
Vision
Profil *
Zdravím,
chtěl bych se zeptat zda-li byste mi mohli pomoci.


Budu mít stránku s přehledem novinek a z názvu by byl odkaz který by vypadal takhle: www.xxx.cz/novinka.php?id=1 podle id novinky.
novinka.php by byla přednastavená na to aby se tam všechno zapsalo z DB podle ID novinky.

Nevím jak bych tohle celé mohl udělat.
Děkuji předem za vaši pomoc :)
Kcko
Profil
Vision:
Já bych Ti i poradil, kdybys to napsal tak, aby to pochopil i průměrný lidoop.

+ dodej co už máš hotové a kde je konkrétně problém.
leorond
Profil
Nemyslíš náhodou aby po kliknutí na odkaz který bude obsahovat například nadpis to uživatele hodilo na celý článek?
Vision
Profil *
Nemám hotové nic v tomhle směru.

Řekněme,že budu mít novinku.

<a href="novinka.php?id=1/2/3"><h3>Nadpis</h3>

A ten nadpis bude odkazem na novinka.php?id=1 podle id novinky v databázi.

A na novinka.php?id=1 bude ta daná novinka zobrazena s možnosti komentáře atp.


leorond:
Nemyslíš náhodou aby po kliknutí na odkaz který bude obsahovat například nadpis to uživatele hodilo na celý článek?
Přesně tak to myslím
leorond
Profil
Jsem u PC a tady je kód který používám já se vším všudy.

Mám to řešené takto:

ukaz.php
<?php
include    ("funkce/textreplace.php");
if(isset($_GET['id']))
{
    $ukaz    =    mysql_query("SELECT * FROM Novinky WHERE id = ".intval($_GET['id']).");
    if(mysql_num_rows($ukaz)==0) 
    { 
        echo "Novinka nebyla nalezena!";
    }
    else
    { 
        $ukaz_novinku["text"]    =    replace_text('remove',    htmlspecialchars($ukaz_novinku["text"]));
        $ukaz_novinku["text"]    =    replace_text('show',    $ukaz_novinku["text"]);
        while ($ukaz_novinku=MySQL_Fetch_assoc($ukaz))
            echo ("<table id='novinky_tab'>
                        <tr><td width='600'><img class='obrazek_novinky' src='admin/galerie/".$ukaz_novinku["obrazek"]."'></td></tr>
                        <tr><td class='nadpis'><a>".htmlspecialchars($ukaz_novinku["nadpis"])."</a></td></tr>
                        <tr><td class='text'>".$ukaz_novinku["text"]."</td></tr>
                        <tr><td class='podpis_datum'>Autor: <b>".htmlspecialchars($ukaz_novinku["podpis"])."</b> Vloženo: ".date(" d.m.Y, H:i:s ", $ukaz_novinku["datum"])."</td></tr>
                    </table>");
    }
}
else
{ 
    header("Location: /");
}
?>

textreplace.php
<?
function    replace_text($type,    $text)
{
    if    ($type    ==    'add')
    {
        $find    =    array(
            "'\n'",
            "'\r'",
        );
        $replace    =    array(
            "<br>",
            "",
        );
    }
    elseif    ($type    ==    'remove')
    {
        $find    =    array(
            "'&lt;br&gt;'"
        );
        $replace    =    array(
            "<br>"
        );
    }
    elseif    ($type    ==    'show')
    {
        $find    =    array(
            "'  '",
            "'\[b\](.*?)\[/b\]'i",
            "'\[i\](.*?)\[/i\]'i",
            "'\[u\](.*?)\[/u\]'i",
            "'\[img\](.*?)\[/img\]'i",
            "'\[url\](.*?)\[/url\]'i",
            "'\[url=(.*?)\](.*?)\[/url\]'i",
            "'\[quote\](.*?)'",
            "'\[/quote\]'",
            "'\[quote=(.*?)\](.*?)'",
            "'\[size=(.*?)\](.*?)'",
            "'\[/size\]'",
            "'\[color=(.*?)\](.*?)'",
            "'\[/color\]'",
        );
        $replace    =    array(
            " &nbsp;",
            "<b>\\1</b>",
            "<em>\\1</em>",
            "<u>\\1</u>",
            "<a href='\\1'><img alt='' style='max-width:500px;' src='\\1'></a>",
            "<a href=\"\\1\" rel=\"nofollow\" target=\_blank\">\\1</a>",
            "<a href=\"\\1\">\\2</a>",
            "<div class=\"quote\">\\1",
            "</div>",
            "<div class=\"quote\"><font size='-2'>Sms by <strong><a  onmouseover=\"return overlib('".view_info."');\" onmouseout=\"return nd();\" href='/Search/Nickname/\\1'><font color=#00ff00>\\1</font></a></strong> ;</font><br><br>\\2",
            "<font style='font-size: \\1px;'>\\2",
            "</font>",
            "<font style='color: \\1;'>\\2",
            "</font>",
        );
    }
    $text    =    preg_replace($find,$replace,$text);
    return    $text;
}
?>

odkaz
<a href='?strana=foto/ukaz&amp;id=".urlencode($zaznam["id"])."'>

Nevím zda je to 100% ale pro MySQL bez rozšíření MySQLi podle mého názoru postačující.

Upraveno z důvodu špatného příkladu pro nováčky.
Vision
Profil *
Jo přesně to myslím. Děkuji moc :)


A mohl bych se ještě zeptat jak bych mohl zablokovat přímo ukaz.php aby se na to nikdo nedostal pokud se tam nedostane jen přímo přes ID?
leorond
Profil
.htaccess

Smazáno autorem!
Moderátor jenikkozak: A vráceno moderátorem. Podobné mazání příspěvků už nedělej, znehodnocuješ tím diskusi.
Fisir
Profil
Skript od leoronda prosím nepoužívat, obsahuje bezpečnostní díru a navíc špatné programátorské postupy!


Reaguji na leoronda:
• části URL se escapují pomocí funkce urlencode()
• proměnné, které posíláš SQL dotazem do databáze musíš vždy escapovat – viz funkce mysql_real_escape_string() (v tomto případě stačí přetypovat na číslo – intval())
• potlačovat výpis (s tím ale také i logování) chyb pomocí @ je špatný
• HTML kód se escapuje funkcí htmlspecialchars()

Reaguji na Visiona:
leorondův skript prosím nepoužívej, důvody jsem popsal výše. Můžeš si jej vzít jako příklad, jaké konstrukce se při tomto úkolu využívají. Kód ale nekopíruj, je naprogramovaný špatně. Také nepoužívej funkce začínající mysql_, protože jsou zastaralé a v další verzi PHP (7) budou odstraněny. Využij buď velmi podobné MySQLi nebo PDO.

A mohl bych se ještě zeptat jak bych mohl zablokovat přímo ukaz.php aby se na to nikdo nedostal pokud se tam nedostane jen přímo přes ID?
Piš prosím srozumitelně, není ti rozumět.
lionel messi
Profil
leorond:

Oceňujem, že sa snažíš poradiť, ale v kóde [#5] si sa však uchýlil k niekoľkým praktikám, ktoré by si začiatočníkovi rozhodne nemal dávať za vzor:

• Vkladať priamo do dotazu bez akéhokoľvek ošetrenia $_GET ["id"] je veľké bezpečnostné riziko. Ak bude paramater obsahovať apostrof, dotaz zlyhá, prípadne útočník získa plnú moc nad databázou. Keďže id je číslo, postačí na ošetrenie pretypovanie (napr. pomocou intval).

• Zavináč pred mysql_fetch_array (mimochodm, lepšie by bolo fetch_assoc) je fuj. Chybové hlášky sa týmto spôsobom nepotláčajú, na produkčnom serveri síce majú byť vypnuté, ale pomocou zodpovedajúcich konfiguračných direktív.

• Zátvorky okolo echo sú zbytočné, je to jazyková konštrukcia, nie funkcia.

• Písať mysql_query a o riadok MySQL_Fetch_Array je vhodná cesta k neprehľadnému kódu, istá štábna kultúra by nebola na zahodenie (väčšina programátorov píše vždy mysql_query a pod.

• Extenzia MySQL je od PHP 7 odstránená.

+ absolútne nesprávne použitie escapovania namiesto htmlspecialchars už zmienil Fisir.
leorond
Profil
Pánové věta Mám to řešené asi nějak takto neznamená že to mám přesně takto ale popisuje to princip a je to maximum co zvládnu v autobuse cestou domů z práce.

Navíc je jasné že když tam je jen výpis z DB a tabulka tak to asi ošetřené nijak nebude.

A to že tam je potlačení chybové hlášky @ nebo že jsem použil tabulku pro zápis místo výpis je stále víc než věčné vaše hlášky nauč se z google, stačí hledat a podobně.

A mohl bych se ještě zeptat jak bych mohl zablokovat přímo ukaz.php aby se na to nikdo nedostal pokud se tam nedostane jen přímo přes ID?
Piš prosím srozumitelně, není ti rozumět.

Fisir myslím že to napsal dost srozumitelně.

A ted k tomu vašemu MySQLi, kdo z vás dvou má půl webu v MySQL a druhou v MySQLi? Pochybuji že když začnete něco jedním způsobem tak v půlce začnete jiným a pokud se pletu tak by jste se měli mým chybám zasmát.

Místo aby jste pomohli a napsali třeba jak ten kód opravit nebo upravit aby byl OK, radši tady budete psát jak moc je to špatně.

Smazáno autorem!
Moderátor jenikkozak: Vráceno moderátorem.
Fisir
Profil
Reaguji na leoronda:
věta Mám to řešené asi nějak takto neznamená že to mám přesně takto ale popisuje to princip
Ten tvůj kód je ale z principu špatný. Lepší by bylo princip popsat slovně, protože někteří nešťastníci jsou schopni využít a zkopírovat jakýkoliv funkční (občas i nefunkční) kousek kódu, bez ohledu na to, jak kvalitní je a jaké připomínky se k němu objevily.

je jasné že když tam je jen výpis z DB a tabulka tak to asi ošetřené nijak nebude
To tedy jasné není, protože když je někde SQL příkaz, každý schopný programátor jej má automaticky ošetřený (ať už automaticky pomocí prepared statements, nebo tam sám dosazuje správné escapovací funkce). Co se týče HTML a URL, tak uznávám, že možná používáš šablonovací systém a sem jsi to jen rychle přepsal, takže správně escapuješ až v šabloně, ale to neospravedlňuje použití špatných escapovacích funkcí, které budí dojem, že je to v pořádku.

to že tam je potlačení chybové hlášky @ nebo že jsem použil tabulku pro zápis místo výpis je stále víc než věčné vaše hlášky nauč se z google, stačí hledat a podobně
Zjevným a ztraceným začátečníkům se snažíme pomoci. Buď jim poskytneme ukázku kódu (ale takovou, která je na určité úrovni), nebo jim popíšeme princip a odkážeme na příslušné funkce či návody. Nemá smysl začátečníky jen odkázat na Google, protože většinou ani neví, jak se věc, kterou hledají, jmenuje.
Myslím, že když jim rozvinutou diskusí popíšeme, jak kód funguje a společně s tazatelem se dobereme řešení, odnese si z toho víc, než kdybychom mu ihned poskytli hotový kód. Tady nejsme na StackOverflow, tazatel má prostor a možnosti pokládat další otázky, pokud něčemu neporozuměl.
Také se domnívám, že z důvodů popsaných výše byla tvá „ukázka principu“ pro začátečníky škodlivější, než dobře mířený odkaz na nějaký návod.

myslím že to napsal dost srozumitelně.
Prosím, osvětli mi, co znamená zablokovat přímo ukaz.php, aby se na to nikdo nedostal, pokud se tam nedostane jen přímo přes ID.

kdo z vás dvou má půl webu v MySQL a druhou v MySQLi?
Web mám v PDO. Pokud ale správně čtu, Vision píše, že nemá hotové nic v tomhle směru. Takže by bylo nejlepší, kdyby to už od začátku dělal pořádně.

Místo aby jste pomohli a napsali třeba jak ten kód opravit nebo upravit aby byl OK, radši tady budete psát jak moc je to špatně.
Ty body, které jsem v reakci na tebe vypsal, tam nejsou jen na parádu, stačí si je přečíst.

↓ Příspěvek [#12] jsem viděl, přečetl a moc nepochopil, je to velmi zvláštně psané. Byla by ale škoda udusit původní dotaz, takže se zdržím reakce.
leorond
Profil
Fisir:
Ok takže pokud je z principu špatný jak ty tvrdíš, znamená to že nefunguje? No je to čím dál lepší.

Pokud ti to není jasné když vidíš pár řádků jen tak spláskaných během 5 minut někde v autobuse na mobilním telefonu tak jak jsi vlastně zjistil že je ten kód špatnej?
Moderátor jenikkozak: Prosím, nevkládej na Diskusi jako ukázku skripty „spláskané“ během 5 minut v autobuse na mobilu.

Víš tvůj dotaz na Vision ohledně jeho otázky zda jde zakázat spuštění scriptu ukazka.php při najetí přímou adresou například web.cz/ukazka.php je jasným důkazem toho že mu chceš pomoci. Ano právě jsi pomohl ten skript 100% opravit :D tím že jsi napsal pár bodů co je špatně a někdo kdo absolutně nechápe php tak právě opustil stránku.

-> BOD 3

No a jsme zase u toho chápání :D
Třeba já jako normálně uvažující, průměrně inteligentní člověk jsem to pochopil že v tomhle směru nemá hotového nic.
Prosím překladatele / Nemám ještě nic z toho na co se ptám.
Běžně webové stránky začínáš takovýmto? xD

Stále nevidím že by jsi poradil Vision s něčím ohledně tématu? Nebo se pletu? Soudíš mne za to že chci někoho alespon nasměrovat dobrým směrem ale sám to podle sebe umíš nejlíp, no ale tak kdo je tu ten co chce pomoct?


Smazáno autorem!
Moderátor jenikkozak: Vráceno moderátorem. Podobné neurvalé jednání – jakým je mazání příspěvků – tu nebudeme tolerovat.
Fisir
Profil
Reaguji na Visiona:
Předpokládám tedy, že chceš mít odkazy ve tvaru novinka.php?id=x. Číslo x z URL adresy najdeš v poli $_GET:
example.com/novinka.php?id=1 »
echo $_GET['id']; // vypíše 1

Pro ověření, že je parametr id nastavený (tj. že návštěvník nepřišel pouze na example.com/novinka.php) můžeš použít funkci isset(), která vrátí true, pokud je parametr nastavený, jinak false:
if(isset($_GET['id'])){
    // pokračovat výpisem novinky
} else {
   /* vynadat návštěvníkovi, že není vybraná žádná novinka
      (ačkoliv by bylo lepší místo toho zobrazit přehled všech novinek) */
}

Na základě parametru id pak vybereš odpovídající novinku z databáze (předpokládám použití rozšíření MySQLi):
$query = $db->query('SELECT * FROM news WHERE id='.intval($_GET['id']));

Pak by bylo vhodné zkontrolovat, jestli daná novinka existuje (nikdy nevěř vstupu od návštěvníka, může ti podstrčit jakékoliv ID), zkontrolujeme tedy, zda počet nalezených řádků není nula:
if($query->num_rows === 0){
    // novinka se zvoleným ID neexistuje
} else {
    // v pořádku, novinka existuje
}

Pak už jenom stačí vypsat samotnou novinku (nejprve si musíme data z výsledku databázového dotazu převést do pole):
$news = $query->fetch_assoc();
echo('<h1>'.htmlspecialchars($news['title']).'</h1>');
echo('<p>'.htmlspecialchars($news['text']).'</p>');
(Pokud budeš chtít mít v novince HTML kód, odstraň funkci htmlspecialchars(). Nezapomeň ale na nutnost ručního escapování znaků, které nechceš, aby se jako HTML interpretovaly.)

Zkus si pomocí těchto příkladů a odkazů sestavit kompletní kód, pak se pustíme do vypisování seznamu novinek ;-).

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