Autor Zpráva
Pavel015
Profil
Dobrý den.
Googlil jsem, zkoušel jsem, ale furt nevím, tak prosím o radu.

Mám v DB uložené informace o článcích - id, název, url názvu, text, autor.

Článek lze zobrazit na adrese: www.adresa.cz/clanky.php?id=x (místo x je číslo).
Mým cílem je, aby pokud někdo navštíví adresu: www.adresa.cz/clanky/zajimavosti-ze-sveta, zobrazí se mu tento článek (NE PŘESMĚRUJE!) a také pokud někdo zadá www.adresa.cz/clanky.php?id=2, přesměruje ho to na www.adresa.cz/clanky/zajimavosti-ze-sveta.

Nevíte, prosím, jak na to? Někde tam asi bude select, kderý zjistí dotazující url a mrkne do DB, ale vůbec nevím. Co nastavit s .htaccess?

PHP SOUBOR: clanky.php
<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Články</title>
</head>
<body>
<?php
    $server="localhost";
    $user="root";
    $password="";
    $db="ukazka";
    $spojeni=mysqli_connect($server,$user,$password,$db);
    mysqli_query($spojeni,"set names utf8");

    $dotaz = "SELECT clanky.id, clanky.nazev, clanky.nazev_url, clanky.text, clanky.autor FROM clanky WHERE clanky.id={$_GET['id']}";
    $data = mysqli_query($spojeni,$dotaz) or die ("Bez záznamů.".mysql_error());
   
    while($zaznam=mysqli_fetch_array($data)){
        echo "<b>Nadpis: </b>{$zaznam['nazev']}<br>";
        echo "<b>URL: </b>{$zaznam['nazev_url']}<br>";
        echo "<b>Text: </b>{$zaznam['text']}<br>";
    }
?>
</body>
</html>

V DB mám:
-- phpMyAdmin SQL Dump
-- version 4.1.14
-- http://www.phpmyadmin.net
--
-- Počítač: 127.0.0.1
-- Vytvořeno: Čtv 28. dub 2016, 17:56
-- Verze serveru: 5.6.17
-- Verze PHP: 5.5.12

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Databáze: `ukazka`
--

-- --------------------------------------------------------

--
-- Struktura tabulky `clanky`
--

CREATE TABLE IF NOT EXISTS `clanky` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `nazev` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL,
  `nazev_url` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL,
  `text` text COLLATE utf8_czech_ci,
  `autor` int(10) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=3 ;

--
-- Vypisuji data pro tabulku `clanky`
--

INSERT INTO `clanky` (`id`, `nazev`, `nazev_url`, `text`, `autor`) VALUES
(1, 'První článek', 'prvni-clanek', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Phasellus faucibus molestie nisl. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Nulla accumsan, elit sit amet varius semper, nulla mauris mollis quam, tempor suscipit diam nulla vel leo. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Mauris tincidunt sem sed arcu. Maecenas ipsum velit, consectetuer eu lobortis ut, dictum at dui. Etiam posuere lacus quis dolor. Nulla pulvinar eleifend sem. Donec vitae arcu. Duis sapien nunc, commodo et, interdum suscipit, sollicitudin et, dolor. Aenean fermentum risus id tortor. Fusce nibh. Quisque porta. Proin pede metus, vulputate nec, fermentum fringilla, vehicula vitae, justo. Nunc tincidunt ante vitae massa. Integer in sapien. ', 5),
(2, 'Zajímavosti ze světa', 'zajimavosti-ze-sveta', 'Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Etiam quis quam. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Integer in sapien. Nulla pulvinar eleifend sem. Morbi leo mi, nonummy eget tristique non, rhoncus non leo. Integer pellentesque quam vel velit. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nunc tincidunt ante vitae massa. Maecenas ipsum velit, consectetuer eu lobortis ut, dictum at dui. Praesent vitae arcu tempor neque lacinia pretium. Praesent id justo in neque elementum ultrices. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.\n\nEtiam posuere lacus quis dolor. Aliquam erat volutpat. Proin pede metus, vulputate nec, fermentum fringilla, vehicula vitae, justo. Mauris tincidunt sem sed arcu. Fusce nibh. Praesent vitae arcu tempor neque lacinia pretium. In sem justo, commodo ut, suscipit at, pharetra vitae, orci. Duis bibendum, lectus ut viverra rhoncus, dolor nunc faucibus libero, eget facilisis enim ipsum id lacus. Mauris tincidunt sem sed arcu. Etiam neque. Sed ac dolor sit amet purus malesuada congue. Donec ipsum massa, ullamcorper in, auctor et, scelerisque sed, est. Fusce consectetuer risus a nunc. Nam quis nulla.\n', 2);

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Moc děkuji.
visionic
Profil *
Pavel015:
www.adresa.cz/clanky.php?id=2, přesměruje ho to
Nevím a nechápu proč by toto někdo zadával. Když už odkazuješ na pěkná url.

Nevíte, prosím, jak na to?
htaccess upravíš, a já to řeším takto. Přidáš si do db ještě jeden sloupec seo. V administraci když píšeš název článku tak ho do sea převedeš bez diakritiky a nahradíš velká písmena za malá a místo mezer dáš pomlčky. Můžeš googlit pod pojmem "nahradí znaky php". A při výpisu článků do odkazu dáš vypsat sloupec seo místo ID a v selectu to vyhledáš pomocí getu na to seo. Bez htaccess to bude vypadat takto (když nadpis bude 'Zajímavosti ze světa'):

www.adresa.cz/clanky.php?seo=zajimavosti-ze-sveta

Ted samotný .htaccess
# /prom1/prom2/prom3/prom4/prom5

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ ?prom1=$1

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)?/?$ ?prom1=$1&prom2=$2

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/([^/]+)?/?/?$ ?prom1=$1&prom2=$2&prom3=$3

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)?/?/?/?$ ?prom1=$1&prom2=$2&prom3=$3&prom4=$4

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)?/?/?/?/?$ ?prom1=$1&prom2=$2&prom3=$3&prom4=$4&prom5=$5

Do clanky.php dej toto:
$prom1 = $_GET['prom1'];
$prom2 = $_GET['prom2'];
$prom3 = $_GET['prom3'];
$prom4 = $_GET['prom4'];
$prom5 = $_GET['prom5'];

www.adresa.cz/clanky/zajimavosti-ze-sveta

dle adresy výše obsah tvých proměnných je takto:

echo $prom1; //vypíše clanky
echo $prom2; //zajimavosti-ze-sveta

$prom3-5 //prázdné


jeste bych to osetril, když se shoduje článek v názvu, tak ho to nepřidá a donutí tě změnit název.
Pavel015
Profil
visionic:
Nefunguje to...

PHP kód tedy vypadá takto:
<?php
    $server="localhost";
    $user="root";
    $password="";
    $db="ukazka";
    $spojeni=mysqli_connect($server,$user,$password,$db);
    mysqli_query($spojeni,"set names utf8");

    $prom1 = $_GET['prom1'];
    $prom2 = $_GET['prom2'];
    $prom3 = $_GET['prom3'];
    $prom4 = $_GET['prom4'];
    $prom5 = $_GET['prom5'];
    
    echo $prom1; //vypíše clanky
    echo $prom2; //zajimavosti-ze-sveta


    
    $dotaz = "SELECT clanky.id, clanky.seo, clanky.nazev, clanky.nazev_url, clanky.text, clanky.autor FROM clanky WHERE clanky.id={$_GET['seo']}";
    $data = mysqli_query($spojeni,$dotaz) or die ("Bez záznamů.".mysql_error());
   
    while($zaznam=mysqli_fetch_array($data)){
        echo "<b>Nadpis: </b>{$zaznam['nazev']}<br>";
        echo "<b>URL: </b>{$zaznam['nazev_url']}<br>";
        echo "<b>Text: </b>{$zaznam['text']}<br>";
    }
?>
</body>
</html>
a stejně nic...
úsměv
Profil
Zaleží na jaké adrese se ti zobrazuje to co chceš aby se ukazovalo všude. Přesměrovávat jde buď tak, že se změní adresa, nebo že se adresa nezmění (to pak ale musíš dát pozor na relativní odkazy), ale obsah ano (tak i tak). Když nastuduješ ty Yuhůůovy stránky (viz. odkaz), tak bys měl být schopný napsat .htaccess, které to obstarají. Yuhůů dělá i příklady, takže bych to třeba jenom okopíroval a změnil ty adresy.
PS: Má tvůj hosting podporu .htaccess?
PS: Visionicovo řešení nemám čas studovat, nechávám nezodpovězeno jestli mod_rewrite, nebo něco jiného co uvádí Yuhůů, nebo visionic
Pavel015
Profil
úsměv:
Tohle jsme právě u něj nenašel.... Ano, má podporu .htaccess


Pořád to nefunguje.
Nevíte, prosím, co s tím?

Současný .htaccess:
RewriteEngine on
# /prom1/prom2/prom3/prom4/prom5
 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ ?prom1=$1
 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)?/?$ ?prom1=$1&prom2=$2
 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/([^/]+)?/?/?$ ?prom1=$1&prom2=$2&prom3=$3
 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)?/?/?/?$ ?prom1=$1&prom2=$2&prom3=$3&prom4=$4
 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)?/?/?/?/?$ ?prom1=$1&prom2=$2&prom3=$3&prom4=$4&prom5=$5


Současný soubor clanky.php
<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Články</title>
</head>
<body>
<?php
    $server="localhost";
    $user="root";
    $password="";
    $db="ukazka";
    $spojeni=mysqli_connect($server,$user,$password,$db);
    mysqli_query($spojeni,"set names utf8");

    $prom1 = $_GET['prom1'];
    $prom2 = $_GET['prom2'];
    $prom3 = $_GET['prom3'];
    $prom4 = $_GET['prom4'];
    $prom5 = $_GET['prom5'];
    
    echo $prom1; //vypíše clanky
    echo $prom2; //zajimavosti-ze-sveta


    
    $dotaz = "SELECT clanky.id, clanky.seo, clanky.nazev, clanky.nazev_url, clanky.text, clanky.autor FROM clanky WHERE clanky.seo='{$_GET['seo']}'";
    echo $dotaz;
    $data = mysqli_query($spojeni,$dotaz) or die ("Bez záznamů.".mysql_error());
   
    while($zaznam=mysqli_fetch_array($data)){
        echo "<b>Nadpis: </b>{$zaznam['nazev']}<br>";
        echo "<b>URL: </b>{$zaznam['nazev_url']}<br>";
        echo "<b>Text: </b>{$zaznam['text']}<br>";
    }
?>
</body>
</html>
Dan Charousek
Profil
Pavel015

Cestou visionic [#2] bych se nevydával. Jedná se o né moc pěkné, špatně udržovatelné řešení.

Většinou stačí všechny requesty přesměrovávat na index.php, kde už na úrovni PHP vytvoříš aplikační logiku. Cílovou url adresu porovnáš s, tebou zadanými, maskami a pošleš to dál ke zpracování.

Jednoduchý nástřel:

.htaccess
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*) index.php?q=$1 [QSA,L]

index.php
if(!isset($_GET['q'])) {
    echo 'No request sent'; exit;
}

$arr = explode("/", $_GET['q']);

switch($arr[0]) {

    case 'about' :
        showAboutPage();
    break;
    
    case 'contacts' :
        showContactsPage();
    break;
    
    default:
        anotherPage($arr);
    break;

}

Je třeba zmínit, že se jedná opravdu o hodně hrubý nástřel. Většinou se o požadavek stará router, který podle zadaných masek rozhodne, jaká akce se vykoná. Podle akce se potom zavolá příslušná třída (v MVC Controller), který zpracuje daný požadavek.
Pavel015
Profil
Dan Charousek:
Klidně se vydám i horší cestou... Moc mi nejde o nástřel, spíš o řešení..
visionic
Profil *
Pavel015:


Toto je pouze příklad (takže ho dej pryč):
echo $prom1; //vypíše clanky
echo $prom2; //zajimavosti-ze-sveta

Dále zjisti jestli máš povolený .htaccess u hostingu.

Místo $_GET[seo] kvůli rewrite je nyní pouze $_GET[prom2], ktere jsem definoval $prom2 = $_GET['prom2'];

Pro pochopení jak rewrite funguje:
www.neco.cz/zde-je-prom1/zde-je-prom2/zde-je-prom3

takže když dám echo $prom3; tak mi to vypise: zde-je-prom3

Závěrem tedy je, že nemůžes měnit pořadí, každe lomítko se přesouvá na další get.


$dotaz = "SELECT * FROM clanky WHERE seo='".$prom2."' LIMIT 1";
Pavel015
Profil
visionic:
Fakt mi to nejde....

Založil jsem si rychle účet na Webzdarma a soubory nahrál...
Přihlašovací údaje: login: peknaurl.chytrak.cz, heslo: Qq123456
Nemohl by ses na to, moc prosím, podívat?

Sedím u toho celej den...
visionic
Profil *
Kdyby si se zamyslel jak to funguje, tak to mas davno hotove


peknaurl.chytrak.cz/zajimavosti-ze-sveta


Kdyz to nechas prazdne, tak ti to vypise vsechnny clanky


Ta chybova hlaska 'ze neni určen prom1' na webzdarma zakazes taky v tom htaccess. Ostatni servery placene, by to meli mit automaticky.
Pavel015
Profil
Sorry, ale ta adresa má být ve tvaru:
peknaurl.chytrak.czclanky/zajimavosti-ze-sveta
visionic
Profil *
dyt mas hotovej priklad, zbytek si udelej sam. Muzes byt rad, ze jsem se zadarmo na to mrknul a udelal takovyhle priklad.


Miluju nevdecny lidi, kterým pomůžete a pak Vám řeknou, že jste to udělali špatně.

Pavel015:
Mas to vse nastaveny

když chceš adresu peknaurl.chytrak.cz/clanky/zajimavosti-ze-sveta
tak si pridej pred stavajici odkazy "/clanky"

a v $dotaz zmen z $prom1 na $prom2 a pridej dalsi radek k "$prom1 = $_GET['prom1'];" tento "$prom2 = $_GET['prom2'];"

a mas co si chtel.
Pavel015
Profil
Opravdu v tom plavu a nevím, jak to udělat.

Vůbec jsem neříkal, že jste to udělal špatně, ale nebylo to přesně to, co jsem potřeboval.

Přemýšlel jsem a jediný, co mě napadlo je, že bych v databázi místo adresy prvni-clanek ukládal clanky/prvni-clanek, což asi není úplně nejlepší řešení...

Nemohl byste mi to, prosím, naprogramovat do finále? Fakt se snažím to nějak udělat, ale nejde mi to. Jsem ještě kluk, fakt to nezvládám..
visionic
Profil *
Dyt jsem ti napsal postup. Jestli zvladas 1-1, tak to zvladnes taky. Jinak se to nenaucis.
Pavel015
Profil
visionic:
Opravdu nevím... Nemohl byste mi to, prosím, dokončit. Už to skoro je...
visionic
Profil *
Jeste jednou:

vsude kde mas element <a href=""> das do vsech <a href="/clanky/$zaznam['nazev_url']"> nyni tam mas: <a href="/$zaznam['nazev_url']">

a na radku kde mas toto: $prom1 = $_GET['prom1']; Pridej toto: $prom2 = $_GET['prom2'];

vysledna verze:
$prom1 = $_GET['prom1'];
$prom2 = $_GET['prom2'];

a do radku $dotaz = "SELECT * tabulka ...... WHERE 'nazev_url'='".$prom1."'";
vysledek: $dotaz = "SELECT * tabulka ...... WHERE 'nazev_url'='".$prom2."'";

Tohle opravdu neni tezke. Sorry mam jinou praci, nez programovat praci linym lidem.
Pavel015
Profil
Ok

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: