Přesměrování všech odkazů na novou doménu – .htaccess

Pokud stěhujete své webové stránky na novou doménu, je nejlepší zachovat všechny odkazy, které na Váš web vedou tak, aby se i po přestěhování na jinou doménu zobrazil stejný obsah.

Samozřejmě u některých CMS to není snadné, ale jde to snad všude. A to i za cenu ručního přepisování. Cenu to nemá snad u stovek URL.

Vlastníte doménu mujweb.cz na kterém se nachází Vaše prezentace, rozhodli jste se ale, že celý web přestěhujete na novou doménu mujnovyweb.cz. Co s tím? Na mujweb.cz vede spousta zpětných odkazů a ty určitě nechcete jen tak zahodit…

Řešením je přesměrování v souboru .htaccess!

Ano, jen je potřeba mít pro starou doménu stále aktivní webhosting, ale to v dnešní době (2016) multihostingů a VPS již není problém. V rootu (kořenové složce) domény mujweb.cz vytvořte soubor .htaccess a vložte do něj

RewriteEngine On
RewriteRule ^(.*)$ http://mujnovyweb.cz/$1 [R=301,L]

A to je všechno!

Stačí jen změnit http://mujnovyweb.cz za novou URL vaší domény.

Nyní při zadání http://mujweb.cz to klienta automaticky přesměruje na http://mujnovyweb.cz. Dokonce i při zadání http://mujweb.cz/podstranka se to také přesměruje na http://mujnovyweb.cz/podstranka.

Let’s Encrypt certifikát na Windows Apache serveru

Pro SSL certifikát zdarma od Let’s Encrypt existuje oficiální nástroj pro jeho jednoduché vygenerování a nastavení. Ovšem pouze pro Linux.

Ti, co mají Windows si tedy musí poradit jinou cestou. A jelikož se nikomu nechce nastavovat složitě konfigurační soubory, posílat požadavky pro vygenerování certifikátu, stahování souborů certifikační autority a mnoho dalšího, je zde určitá cesta.

Z GitHubu si stáhněte nejnovější verzi konzolového prográmku lets-encrypt-win-simple v1.9.1 (záloha, pokud by link nefungoval zde). Soubor .zip rozbalte do nějakého umístění, kde máte zaručeno, že bude moci jakýkoliv uživatel zapisovat. Buďto tedy rozbalte soubor například do C:\letsencrypt-win-simple, nebo v dalším kroku spusťte aplikaci jako administrátor (správce).

Předpokládejme tedy, že všechny rozbalené soubory se nacházejí ve složce C:\letsencrypt-win-simple. Otevřete si cmd, doporučuji ho spustit jako správce (levý klik na cmd > Spustit jako správce). Můžete ho také vyvolat klávesovou zkratkou Win + R > cmd > zakliknout „Spustit jako správce“.

 

Zadejte příkaz:

cd C:\letsencrypt-win-simple

Tím se s celým CMD „přesunete“ do složky našeho rozbaleného prográmku. Nyní zadejte příkaz pro spuštění aplikace letsencrypt.exe. Zároveň jí pošleme pošleme pár parametrů:

letsencrypt.exe --manualhost <doména> --webroot <složka-s-daty-domény> --test
  1. letsencrypt.exe [tímto dáváme CMD příkaz, aby nadále pracoval s aplikací letsencrypt.exe]
  2. –manualhost [definujeme, že chceme zadávat příkazy manuálně]
  3. <doména> [zaměňte za opravdový název Vaší domény, pro kterou chcete vygenerovat certifikát]
  4. –webroot [definujeme, že další uváděný údaj bude cesta k rootu domény]
  5. <složka-s-daty-domény> [zaměňte za absolutní cestu (bez uvozovek) k root adresáři se soubory Vaší domény]
  6. –test [přidáváme identifikátor –test, pro případ, kdyby se něco nezdařilo, aby se něco nepokazilo na serveru]

 

Váš příkaz by měl vypadat nějak takto:

letsencrypt.exe --manualhost www.mujskript.cz --webroot "C:\xampp\htdocs\mujskript.cz" --test

Stiskněte Enter a odešlete. Mělo by se Vám otevřít nové okno CMD, které bude mít v záhlaví adresu umístění Vašeho letsencrypt.exe souboru. Program začne odesílat požadavky na server letsencrypt pro vygenerování certifikátu.

Pokud se začne vypisovat do konzole něco podobné tomuto:

Authorizing Identifier <doména> Using Challenge Type http-01
 Writing challenge answer to <složka-s-daty-domény>\.well-known/acme-challenge/<challenge-text>
 Answer should now be browsable at <document-root>/.well-known/acme-challenge/<challenge-text>
 Submitting answer
 Refreshing authorization
 Authorization Result: valid

Requesting Certificate
 Request Status: Created
 Saving Certificate to C:\Users\<uživatel>\AppData\Roaming\letsencrypt-win-simple\httpsacme-stage.api.letsencrypt.org\<doména>-crt.der
 Saving Issuer Certificate to C:\Users\<uživatel>\AppData\Roaming\letsencrypt-win-simple\httpsacme-stage.api.letsencrypt.org\ca-<unikátní-id>-crt.pem
 Saving Certificate to C:\Users\<uživatel>\AppData\Roaming\letsencrypt-win-simple\httpsacme-stage.api.letsencrypt.org\<doména>-all.pfx

(Do hranatých závorek jsem uvedl proměnné, které se budou lišit v závislosti na konfiguraci Vašeho serveru.)

Tak byste ve složce

C:\Users\<uživatel>\AppData\Roaming\letsencrypt-win-simple\httpsacme-stage.api.letsencrypt.org

měli najít nově vygenerované certifikáty, v jejichž názvu bude název domény pro kterou byly vystaveny. Pokud byste je tam nenašli, přidejte do Vaší httpd.conf konfigurace k Vašemu názvu u VirtualHost (viz. níže) domény alias pro přístup do složky, kde se ověřuje pravost domény:

Alias /.well-known <domain-root>/.well-known

Takže by to mělo vypadat nějak takto (cestu lze uvést i bez uvozovek, ale dejte pozor, aby cesta neobsahovala mezery)

Alias /.well-known "C:/xampp/htdocs/mujskript.cz/.well-known"

A znovu spusťte proces ověření přes CMD. Pokud se povede, spusťte jej ještě bez přídomku –test.

Program by se Vás dále měl zeptat na to, jestli chcete certifikáty obnovovat ručně, nebo automaticky. Odpovídáte ano/ne klávesami y/n. Nutno podotknout 2 věcí a to

  • pokud odpovíte ne, program se ukončí
  • pokud pošlete příliš požadavků pro jednu doménu na servery Let’s Encrypt, další generování se samo ukončí a již Vás dále nepustí.

 

Poté, co již ve Výše zmíněné složce naleznete vygenerované soubory, otevřete si soubor httpd-vhosts.conf (samozřejmě můžete i soubor httpd.conf) a měli byste v něm najít informaci o nezabezpečeném HTTP spojení:

<VirtualHost *:80>
 #Definujeme základní proměnné
 ServerAdmin email@administratora
 ServerName mujskript.cz
 ServerAlias www.mujskript.cz

 #Tady jste vložili alias, pokud Vám nefungovalo ověření
 Alias /.well-known "C:/xampp/htdocs/mujskript.cz/.well-known"

 RewriteEngine On
 #Nastavíme přesměrování z HTTP verze na HTTPS verzi
 RewriteCond %{HTTPS} off
 RewriteRule ^/?(.*)$ https://mujskript.cz/$1 [NE,L,R=301]
</VirtualHost>

(Pokud tam výše uvedený kus kódu nemáte, vložte jej kvůli přesměrování (může být i v jiných .conf souborech). Je to na Vás, ale vložení není povinné, protože následné přesměrování nemusíte řešit .conf souborem, ale .htaccess souborem v rootu domény.)

Následně přidejte ještě povinný kód pro SSL (HTTPS) komunikaci:

<VirtualHost *:443>
 #Definujeme základní proměnné
 ServerAdmin email@administratora
 ServerName mujskript.cz
 ServerAlias www.mujskript.cz
 RewriteEngine On 
 
 #Tady jste vložili alias, pokud Vám nefungovalo ověření
 Alias /.well-known "C:/xampp/htdocs/mujskript.cz/.well-known"

 #Nastavíme přesměrování z HTTP verze na HTTPS verzi
 RewriteCond %{HTTP_HOST} !^mujskript.cz$ [NC] 
 RewriteRule ^/?(.*)$ https://mujskript.cz/$1 [NE,L,R=301]
 

 SSLEngine on 
 SSLCertificateFile "C:/Users/<uživatel>/AppData/Roaming/letsencrypt-win-simple/httpsacme-v01.api.letsencrypt.org/<doména>-crt.pem" 
 SSLCertificateKeyFile "C:/Users/<uživatel>/AppData/Roaming/letsencrypt-win-simple/httpsacme-v01.api.letsencrypt.org/<doména>-key.pem" 
 SSLCertificateChainFile "C:/Users/<uživatel>/AppData/Roaming/letsencrypt-win-simple/httpsacme-v01.api.letsencrypt.org/ca-<unikátní-id>-crt.pem" 
</VirtualHost>

Zdě si všimněte, že již neuvádíme port 80 pro nezabezpečenou HTTP komunikaci, ale port 443 pro zabezpečenou HTTPS komunikaci.

Zbytek kódu jsme akorát opsali z předchozí 80 portové definice až na to, že jsme ještě přidali SSLEngine, jenž jsme zapnuli. A pod ním jsme nadefinovali jednotlivé cesty k jednotlivým certifikátům (absolutní cesty v uvozovkách).

Pokud Vám předtím nefungovalo automatické vygenerování certifikátů, opět i u portu 443 uveďte alias pro .well-know složku.

V příštím článku si ukážeme, jak nastavit soubor .htaccess pro automatické přesměrování na HTTPS variantu a naopak.

Nyní už stačí jen restartovat Apache a vše by mělo běžet. 🙂

Nastavení maximální doby běhu PHP skriptu – max_execution_time

Pakliže chcete omezit dobu běhu jednoho daného skriptu a nechcete nastavovat dobu běh všech skriptů na servru centrálně v konfiguračním souboru php.ini, můžete využít jednoduché řešení.

Pokud máte možnost na serveru upravovat PHP konfiguraci, jednoduše vložte do svého skriptu, kterému chcete omezit maximální dobu běhu následující řádek kódu – nejlépe na začátek souboru po <?php.

ini_set('max_execution_time', 30);

Tímto vlastně nemusíte zasahovat do souboru php.ini, ale lze jednoduše upravit max_execution_time přímo v daném souboru.

  • ini_set – udáváme informace, že chceme definovat nějaký „příkaz“ jakoby byl v souboru php.ini
  • max_execution_time – maximální doba běhu skriptu – definice doby v php.ini
  • 30 – doba po které se skript ukončí 

Můžete také využít jednodušší možnosti a to

set_time_limit(30);

A výsledek je zcela stejný. 🙂

 

Stackoverflow – How to define max execution time of one PHP script

Vložení konverzního kódu Skliku do posledního kroku košíku v Prestashopu 1.6

Dnes si ukážeme návod, jak vložit kód pro počítání konverze úspěšně provedených objednávek (přesněji těch, kteří se proklikli za poslední krok k potvrzení odeslání objednávky).

 

Od Skliku dostanete kód podobný tomuto:

<iframe width="119" height="22" frameborder="0" scrolling="no"  
src="//c.imedia.cz/checkConversion?c=IDuzivatele&color=ffffff&v="></iframe>

 

Na e-shopu, kde jsem tuto funkcionalitu implementoval byly dvě možnosti platby:

  • platba hotově
  • platba předem na účet

 

Bylo tedy nutné vložit konverzní kód do těchto dvou modulů v Prestashopu. Nejjednodušší cesta, jak zjistit ten správný soubor je proklikat se nákupním procesem, podívat se na URL a zjistit si cílový soubor a cestu adresáři k tomu souboru.

Pro příklad uvedu URL posledního kroku v košíku po výběru platby hotově, kde již je jen rekapitulace objednávky a tlačítko k úspěšnému odeslání objednávky:

http://www.urldomenyeshopu.cz/cs/module/cashonpickup/validation
(A pak jsem měl ještě URL pro platbu předem převodem na účet /module/bankwire/payment).

 

Z toho se dá odvodit, že soubor, který chceme upravit bude mít jméno validation.php (v Prestashopu to ale bude spíše validation.tpl – součást .PHP souboru). No a adresář bude /module/cashonpickup/.

Tento soubor si najdeme a hned na jeho začátek ještě před značku otevírající PHP kód <?php vložíme náš konverzní kód od Skliku.

<iframe width="119" height="22" frameborder="0" scrolling="no"  
src="//c.imedia.cz/checkConversion?c=IDuzivatele&color=ffffff&v="></iframe>

 

A je hotovo!

 

Takto vložte konverzní kód do všech souborů, které jsou součástí modulu pro platbu, kterou máte na e-shopu aktivní. Postup zjištění adresáře a souboru z URL je vždy stejný. Samozřejmě si do mnou uváděného kódu vložte Vaše reklamní ID.

Jednoduchý zkracovač URL adres

Ahoj!

Fakt dlouho jsem tady nic nenapsal a celkem je mi to líto. Poslední dobou na to nemám moc času – nejdříve byly písemky ve škole a teď jsou prázdniny. Navíc byly poslední dobou úmorná horka (kolem 40°C ve stínu) a řeknu Vám, že v tom je psaní nějakého článku opravdu velmi těžké. Ale je to tak. Jo, je to celkem dost hloupá výmluva…

Ale teď už jsem zpět a píšu pro Vás tenhle článek. Ještě předtím bych Vám chtěl oznámit, že pro Vás chystám jednu bezvadnou novinku, snad ji oceníte. Ale o tom až někdy později – předpokládám během září 2015.

Dlouho jsem přemýšlel, jaký článek pro Vás napsat a napadlo mě, že bychom si mohli vytvořit vlastní zkracovač URL adres. Bude to mít velmi primitivní funkčnost a použijeme přitom databázi MySQL. Pusťme se do toho!

Takže, nejdříve (ostatně, jak tomu bývá zvykem u všech mých článků) si shrneme, co vlastně chceme programovat, co k tomu použijeme a hlavně – jak to bude fungovat (DB = databáze):

  • Na hlavní stránce bude možnost vytvořit novou zkrácenou adresu a zároveň přejít na tu již existující
  • PŘIDÁNÍ
    • Na hlavní stránce bude formulář pro přidání URL
    • Budou tam dvě políčka – původní a nová zkrácená verze
      • Zkrácená URL se nebude sama generovat, ale uživatel si ji musí sám vymyslet
    • Po kliknutí na přidávací button se provede následující
  • ODESLÁNÍ DO DB
    • Z klientského formuláře se vezmou dvě data
      • původní adresa (cíl)
      • nová adresa (alias)
    • Obě data se uloží do DB do dvou sloupců
      • alias
      • cil
  • POTVRZENÍ PŘIDÁNÍ
    • Uživateli pouze potvrdíme, že alias i cíl byl úspěšně uložen do DB
    • A zobrazíme mu klikatelný odkaz aliasu (zkrácené adresy)
  • ŽÁDOST O ZOBRAZENÍ ADRESY
    • Uživatel zašle požadavek na server s aliasem
    • A žádá nás o přesměrování na správnou adresu
    • My se podíváme do DB
      • A zjistíme, jestli je v DB ve sloupci alias shoda s aliasem, který nám uživatel poslal
      • Pokud ano, zjistíme si i ve stejném řádku cíl tohoto aliasu
      • A na tuto adresu ho přesměrujeme
    • Pokud v DB shodu nenalezneme, zobrazíme chybovou hlášku

A jdeme programovat 🙂

Nejprve si vytvoříme potřebnou tabulku a sloupce v MySQL. Tabulku nazveme url a budeme mít dva sloupce – alias a cil – omezenou délku nechávám na Vás, ale nezapomínejte, že se jedná o URL adresy a někdy mohou být pekelně dlouhé.

Dalším krokem bude vytvořit si konfigurační soubor pomocí kterého budeme komunikovat s databází. Nazveme ho config.inc.php. Uložíme do ní název databázového serveru, uživatele, heslo a databázi. Potom ještě nastavím správné a jednotné kódování, pomocí kterého budeme s databází komunikovat – UTF-8. Toto kódování doporučuji používat ve všech našich skriptech.

<?php  
$server = 'dbserver.koncovka'; //server, na kterém je DB 
$uzivatel= 'uzivatel'; //jméno uživatele 
$heslo = 'heslo'; //heslo uživatele 
$db = 'databaze'; //název databáze  

//pokusíme se připojit 
$link = mysql_connect($server, $uzivatel, $heslo) or die("Could not connect: " . mysql_error()); 

//vybereme databázi 
mysql_select_db($db, $link) or die ('Nemohu se pripojit ' . mysql_error());  

//a nakonec nastavíme jednotné kódování UTF-8 
mysql_query("SET NAMES UTF8");  
?>

No a potom už můžeme začít postupně skládat soubor vlozit.php, který bude sloužit pro vkládání nových záznamů do DB. Ještě dodám, že použijeme antispamovou ochranu už z minulého článku. Nejdříve jednoduchý formulář (to, že používám teď <center> je jenom proto, aby to nějak vypadalo):

<center>
  <h2>Zkracovač URL adres</h2> 
  <form method="post" action="#"> 
    URL ke zkrácení: <input type="text" value="http://" name="cil"><br> 
    http://url.mujskript.cz/<input type="text" name="alias"><br> 
    <p id="spamprotirobotum">Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: <input type="text" name="robot" value="" id="protirobotum"></p> 

<button type="submit">Zkratit!</button> </form>
</center>

<script> /* tento skript vloží do příslušného políčka  */ 
document.getElementById("protirobotum").value = 13 * 19; 
document.getElementById("spamprotirobotum").style.display = "none"; 
</script>

Jak jste i mohli všimnout, formulář už obsahuje JS ochranu před spamem. Teď si v PHP definujeme proměnné a připojíme se k databázi:

<?php  
require_once ("config.inc.php");     
$alias = $_POST['alias']; 
$cil = $_POST['cil']; 
$robot = $_POST['robot'];

//A ochráníme se před útoky

$alias = htmlspecialchars($alias); 
$cil = htmlspecialchars($cil); 
$alias = mysql_real_escape_string($alias); 
$cil = mysql_real_escape_string($cil);

Následně si vytvoříme podmínku pro antispamovou ochranu a poté budeme pokračovat ve skriptu:

if($robot == 247){ 
  $query = "INSERT INTO `url`(`alias`,`cil`) VALUES 
    ('$alias','$cil')";  
  $result = mysql_query($query);  

  if(!$result){ 
    echo  mysql_error() . " - " . mysql_errno();  
  }else{
    echo 'Nyní už můžete ostatní odkázat na adresu'; 
    echo '<a href="http://url.mujskript.cz/?u='.$alias.'">http://url.mujskript.cz/?u='.$alias; 
  }
} 
?>

A teď si skript rozebereme. Přidali jsme podmínku, že pokud v $robot je 247, tak se pokračuje dále to přesně: Vytvoří se SQL dotaz s daty a pošle se do DB. V další podmínce se ověřuje, zda nedošlo k chybě, pokud ano, tak se vypíše. V opačném případě (pokud nedošlo k chybě) se zobrazí odkaz na zkrácenou URL.

TIP! Doporučuji všechny řetězce escapovat před útoky pomocí htmlspecialchars (více).

No a nyní si vytvoříme poslední soubor a to index.php, ve kterém se bude ověřovat správnost krátké URL a přesměruje se na ni a také se tam includne soubor pro vložení adresy (vlozit.php), Soubor index.php tedy bude vypadat:

<?php 
  require_once ("config.inc.php");  
  $zadost = $_GET['u']; 
  $zadost = htmlspecialchars($zadost);

Opět se připojíme k DB a definujeme si proměnné. Do proměnné $zadost se nám bude ukládat požadavek od uživatele (http://domena.cz/?u=neco) a to „neco“ je právě obsah proměnné $zadost. Následně tuto proměnnou ještě escapujeme.

A poté si už složíme dotaz, zda URL existuje (viz. začátek teorie nahoře). „Vyber z tabulky url všechny záznamy, kde se obsah sloupce alias rovná proměnné $zadost“. URL budeme předávat pomocí superglobální proměnné $GET (více). Dotaz pošleme do databáze a požádáme o výsledek:

$query_sel = "SELECT * FROM `url` WHERE `alias`='$zadost'";  
$result_sel = mysql_query($query_sel); 
$row = mysql_fetch_assoc($result_sel);

Nyní máme výsledek obsažený v proměnné $row[‚alias‘] (ta se nám vrátila z DB) a ještě ho porovnáme s proměnnou $zadost (tu jsme dostali od uživatele).

Takže vytvoříme podmínku, pokud se záznam našel a pokud ne:

if(isset($zadost)){
  if ($row['alias'] == $zadost){
    header("Location:".$row['cil']); 
  }else{
    echo "Tento záznam (".$zadost.") neexistuje!"; 
  }
}

Pokud se záznam v tabulce url našel, tak se rovnou přesměruje na cíl, pokud v záznam v tabulce neexistuje, upozorníme na to. Nakonec můžeme ještě includnou soubor pro vložení záznamu vlozit.php, ale nemusíme:

include "vlozit.php"; 
?>

V případě, že bychom si chtěli vypsat všechny záznamy z DB (tj. alias i cíl), můžeme:

<?php 
  require_once ("config.inc.php");   

//vybereme všechny záznamy z tabulky url a seřadíme je podle jejich id (1, 2, 3...) 
$query_sel = "SELECT * FROM `url` ORDER BY `id`";  

//řekneme, že toto je příkaz do DB 
$result_sel = mysql_query($query_sel);  

//pokud se příkaz z nějakého důvodu nevykonal 
if(!$result_sel){  

  //vypiš chybovou hlášku
  echo  mysql_error() . " - " . mysql_errno();      
  }  //pokud se žádná chyba nestala     
else{  
    //tak projdeme celou tabulku pomoci while a prok aždý záznam vytvoříme asociativní pole         
    while($row = mysql_fetch_assoc($result_sel)){  

      //a teď už jen vypíšeme každý řádek (generují se samy díky mysql_fetch_assoc)             
      echo "<p>";  //a v $row je vždy uložen obsah řádku konkrétního pole             
      echo "alias: " . $row['alias'] . "<br>";              
      echo "cil: " . $row['cil'];              
      echo "</p>";          
    }      
}  
?>

Shrnutí

Vytvořili jsme si opravdu jednoduchý zkracovač URL. Pokud si vše přenesete na Váš server, nebo vyzkoušíte živě tento zkracovač (odkaz níže), mohla by se Vám hodit nápověda:

Do prvního políčka se vkládá původní URL adresa – např. „http://seznam.cz“ a do druhého políčka se vkládá jen zkrácená adresa pro odkaz (szn). Po potvrzení se Vám vygeneruje link. Je delší, ale pomocí .htaccess si ten parametr $GET[‚u‘] můžete skrýt a rovnou i použít kratší a lepší doménu.

Nápady na vylepšení:

  • mohlo by to umět pomocí .htaccess odstranit ten $GET parametr
  • mohlo by to počítat počet kliků (třeba podle mého skriptu)
  • mělo by to mít ošetřené všechny vstupy pomocí htmlspecialchars – do DB, u už. části už je
  • mohlo by to umět samo generovat zkrácené url (aaa, aab, aac, aad… ….kbn, kbm)
  • mohlo by to zamezit vkládání stejných aliasů a vypsat třeba „Tento záznam už existuje!“

Pokud by Vás napadlo nějaké další vylepšení, klidně mi napište na mail, nebo do komentářů

To je vše. Snad jsem Vám pomohl. Celý skript je samozřejmě ke stažení a vyzkoušení zdarma:

Vyzkoušet živě zkracovač URL 

Stáhnout Zkracovač URL adres (.zip)

Chytrá a neotravná antispamová ochrana

Určitě Vás trápí ten otravný spam v diskusích, komentářích, při registraci, nebo při kontaktním formuláři na Vašem webu.

 

Existuje jednoduché a fikané řešení v JavaScriptu. Není moc, co o tom psát, ale ve zkratce popíšu funkčnost.

Na webu máte input, u kterého je napsáno, že máte napsat například číslo 1234 (nějak tajně, třeba tisíc-dvě stě -třicet čtyři). Jelikož by tento input ale návštěvníky otravoval, tak se do tohoto pole automaticky pomocí JavaScriptu vloží číslo 1234 a políčko se i s textem skryje (display: hidden).

 

V případě, že někdo má JavaScript vypnutý (do této skupinu patří roboti, třeba Google, jenž JavaScript neumí interpretovat), tak se mu zobrazí jak input, tak i text a musí toto políčko sám a ručně vyplnit. Jak účinné.

 

No a potom stačí jen v PHP vytvořit podmínku, že pokud v tom a tom inputu bylo yplněno správně číslo 1234, tak se bude dále ve skriptu pokračovat – odesláním dat do DB, nebo třeba e-mailu.

 

Abyste to ale neměli tak těžké, tak pro Vás níže přikládám plně funkční skript (s dovolením převzato z DJPW. Díky):

Do HTML formuláře stačí přiložit políčko

<p id="spamprotirobotum">
  Ochrana proti spamu. Napište prosím číslo tisíc-dvě stě-třicet čtyři: 
  <input type="text" name="robot" value="" id="protirobotum">
</p>

 

a kousek JavaScriptu, který doplní automaticky číslo a zneviditelní políčko (robotovi se JavaScriptová událost neprovede – neumí ho zpracovat). Ještě v JavaScriptu vkládané číslo trošku zošklivíme – musí se nejprve vynásobit (2×617, což je 1234) :

<script> 
  /* vložíme do políčka číslo */ 
  document.getElementById("protirobotum").value = 2 * 617;  

  /* a poté políčko zneviditelníme */ 
  document.getElementById("spamprotirobotum").style.display = "none"; 
</script>

 

A nakonec potom v PHP zjistíme, zda políčko obsahuje správné číslo (a do této podmínky dáme zbytek celého skriptu):

$robot = $_POST['robot']; //do proměnné uložíme obsah políčka  
if($robot == 1234){

  //sem vložíte celý Váš PHP skript a pokud podmínka nebude splněna, nic se neprovede.  

}

 

To je vše 🙂

 

Router v PHP (5.díl/2.série)

Před čtením tohoto návodu Vám doporučuji si přečíst i návody předchozí. Předpokládám totiž, že již máte potřebné znalosti, které jste se naučili již dříve.

Už chápeme logiku podmínek, známe i operátory. Dnes si vytvoříme náš vlastní routovací systém.

Routování slouží k rozdělení webových stránek a vytvoření URL adres za pomoci parametrů (které ale následně můžeme skrýt – například pomocí souboru .htaccess). Takže díky routování získáme například tuto url:

www.mujskript.cz/ahoj.php?parametr=obsah

 

Kapitoly:

  • Struktura adresáře
  • A jdeme na věc!
  • Co se stane když?
  • Podmínky a výpis textu
  • Podmínky a zobrazení souboru

 

Napišme si takový malý demonstrační scénář toho, jak to všechno bude vlastně probíhat. To je důležité, abychom vlastně věděli, co budeme psát a taky jak to budeme psát.

Backend (zadní strana skriptu – jak ji vidí programátor):

  • Napíšu nějaký routovací skript – například index.php
  • Do něj dám různé podmínky, pokud URL vypadá takhle, tak udělej tohle, jinak tamto
  • Celé to zautomatizuji
  • Uživatel dostane to, co chce

Frontend (přední strana – tak jak to vidí návštěvník)

  • Kliknu na nějaký odkaz 
  • Po kliknutí dostanu obsah, který jsem chtěl
  • Když stránka neexistuje dostanu Error

Jasně, ten uživatelský frontend jsem trochu přehnal, ale je to tak. Uživatel většinou adresy nezkoumá (pokud je to laik), ale programátorovi to třeba pomůže v orientaci.

 

Struktura adresáře

Doporučuji nazývat adresáře stejně, jako já. Vytvoříme si nějaký hlavní (root) adresář, ve kterém bude náš web s routovacím skriptem. Nazveme ho třeba web. Do něj vložíme jediný soubor a to index.php. Pak si vytvoříme ještě adresáře obsahcasti. Nepovinné adresáře pro obrázky, CSS styly a JavaScripty jsem vynechal. Struktura bude vypadat asi takto:

-- web   
-- index.php   
-- obsah   
-- casti

V adresáři obsah budou jednotlivé stránky (respektive podstránky) webu, jako jsou např. sluzby.php, reference.php, onas.php, kontakt.php. No a v adresáři casti budou pochopitelně různé části webu, které budou na všech stránkách stejné a bude jednodušší je častěji měnit – hlavicka.php, menu.php, sidebar.php a paticka.php. Záleží na Vás, jakou strukturu a pojmenování souborů si zvolíte Vy.

 

A jdeme na věc!

Teď se ale vrátíme zpátky k souboru index.php. V tomto souboru bude vlastně náš routovací (nikoliv routerovací od slova router) systém, který bude všechno řídit:

<html> 
  <head> 
    <meta charset="utf-8"> 
    <title>Název stránky (později se bude dynamicky měnit)</title> 
  </head> 
  <body> 
    <?php include "casti/hlavicka.php"; ?> 
    <?php include "casti/menu.php"; ?> 
    <?php 
      $stranka = $_GET['stranka']; 
      if($stranka== "sluzby"){echo "Jsi na stránce služeb.";}
      elseif($stranka == "cenik"){echo "Jsi na stránce, kde uvidíš ceník.";}
      else{echo "Vyber si nějakou stránku, aby se ti mohl zobrazit text: <a href='?stranka=sluzby'>Služby</a>, nebo <a href='?stranka=cenik'>Ceník</a>.";}   
   ?>

 

Začneme od 7. řádku. Zde includujeme (více o include: Include v PHP – 1.díl) dva soubory – hlavicka.php a menu.php. Oba dva jsou umístěny v adresáři casti. Na 10. řádku jen definujeme obsah proměnné $stranka a to je superglobální proměnná $_GET.

 

Co se stane když?

No a od 11. řádku začíná již samotné routování a vidíme zde první podmínky, podle kterých se bude obslužný skript řídit. Takže:

  • Pokud (if) je obsahem proměnné $stranka text sluzby, tak
    • vypiš uživateli na stránku větu Jsi na stránce služeb.
    • if($stranka== "sluzby"){echo "Jsi na stránce služeb.";}
  • Nebo pokud (elseif) je obsahem proměnné $stranka text cenik, tak
    • vypiš uživateli na stránku větu Jsi na stránce, kde uvidíš ceník.
    • elseif($stranka == "cenik"){echo "Jsi na stránce, kde uvidíš ceník.";}
  • Pokliže se nesplnila ani jedna předchozí podmínka (else), tak
    • vypiš uživateli na stránku větu Vyber si nějakou stránku, aby se ti mohl zobrazit text: Služby, nebo Ceník
    • else{
      echo "Vyber si nějakou stránku, aby se ti mohl zobrazit text:"; 
      echo "<a href='?stranka=sluzby'>Služby</a>, nebo <a href='?stranka=cenik'>Ceník</a>.";
      }

 

Podmínky a výpis textu

Samozřejmě, že by tento podmínkovací (routovací) skript šel zapsat i přehledněji, ale pokud budu mít pod sebou třeba padesát záznamů (padesát různých stránek, tak by to nemuselo být přehledné). Ale můžeme si to ukázat:

<html> 
  <head> 
    <meta charset="utf-8"> 
    <title>Název stránky (později se bude dynamicky měnit)</title> 
  </head> 
  <body> 
    <?php include "casti/hlavicka.php"; ?> 
    <?php include "casti/menu.php"; ?> 
    <?php 
      $stranka = $_GET['stranka']; 
      if($stranka== "sluzby"){
        echo "Jsi na stránce služeb.";
      }elseif($stranka == "cenik"){
        echo "Jsi na stránce, kde uvidíš ceník.";
      }else{
        echo "Vyber si nějakou stránku, aby se ti mohl zobrazit text:"; 
        echo "<a href='?stranka=sluzby'>Služby</a>, nebo <a href='?stranka=cenik'>Ceník</a>.";
      }   
   ?>

Je to prostě opticky delší kód.

Podmínky a zobrazení obsahu

Skript si nyní upravíme tak, aby zobrazoval rovnou při zadání správných parametrů určené stránky (includoval je). Stačí skript jen opravdu trošičku poupravit:

<html> 
  <head> 
    <meta charset="utf-8"> 
    <title>Název stránky (později se bude dynamicky měnit)</title> 
  </head> 
  <body> 
    <?php include "casti/hlavicka.php"; ?> 
    <?php include "casti/menu.php"; ?> 
    <?php 
      $stranka = $_GET['stranka']; 
      if($stranka== "sluzby"){
        include "casti/sluzby.php"; 
      }elseif($stranka == "cenik"){
        include "casti/cenik.php";
      }else{
        echo "Vyber si nějakou stránku, aby se ti mohl zobrazit text:"; 
        echo "<a href='?stranka=sluzby'>Služby</a>, nebo <a href='?stranka=cenik'>Ceník</a>.";
      }   
   ?>

Zarovnávat tento kód už nebudu. Jak zde vidíte, stačilo pouze trošku pozměnit události, co se mají stát při splnění podmínky – tedy místo vypsání nějakého textu (echo) zobrazit nějaký soubor (include).

 

To je pro dnešek vše. Snad se Vám návod na routování v PHP líbil.

Operátory v praxi v PHP (4.díl/2.série)

V a předminulém díle jsme se naučili, co to jsou operátory a k čemu je lze použít: Operátory v PHP (2.díl/2.série). Ukážeme se praktické ukázky, jak tyto operátory využít. Příště se dozvíme, jak operátory použít do podmínek…

Kapitoly:

 

Spojování řetězců

První a nejznámější operátor je . Žádnou vědu v tom nehledejte – je to prostě a jednoduše klasická tečka, jak ji znáte:

.

Nic víc, nic míň. Tahle tečka nám ale umožní spojit dvě (nebo tři, čtyři…) věci (řetězce) dohromady. Řekněme, že chceme spojit jedničku (1) a pětku (5), výsledkem spojení tedy bude číslo 15:

<?php     
  $obsah = "1"."5";     
  echo $obsah; 
?>

Pokud si tento kód spustíte, vyjde Vám číslo patnáct (15). Obsahem proměnné $obsah je prostě jednička a pětku za sebou, takže patnáctka. Předpokládám, že už to chápete, ale zkusíme si to ještě jednou:

<?php     
  $obsah = "25"."85"."8";     
  echo $obsah; 
?>

A teď jsme spojili čísla 25, 85 a 8. Lze vypozorovat, že lze spojovat i více čísel (řetězců) – klidně padesát. Pokud si tento kód spustíte, vypíše se Vám číslo 25858. Zkusíme si to ještě jednou a s trošku jiným obsahem:

<?php     
  $obsah = "ahoj"."+/="."48"."php";     
  echo $obsah; ?>

Po spuštění tohoto skriptu se nám vypíše ahoj+/=48php. Teď si ale určitě říkáte, jak využijete toto spojování řetězců, že? Je to jednoduché, pokud třeba od uživatele pomocí (třeba) superglobální proměnné $_POST získáváte nějaká data, je někdy potřeba tyto proměnné spojit (např. jméno a příjmení). Uděláme to takto:

<?php     
  $jmeno = "Honza";     
  $prijmeni = "Novák";     
  $celejmeno = $jmeno.$prijmeni;     
  echo $celejmeno; 
?>

Teď by se nám měl vypsat tento text: HonzaNovák. Co když ale chceme mít mezi křestním jménem (Honza) a příjmením (Novák) mezeru? Vyřešíme to velice jednoduše:

<?php     
  $jmeno = "Honza";     
  $prijmeni = "Novák";   
  $celejmeno = $jmeno." ".$prijmeni;   
  echo $celejmeno; 
?>

Upravili jsme třetí řádek. Jak to funguje? Máme proměnnou $jmeno (ta není v uvozovkách, protože je to proměnná a není to text). Následně přidáme tečku pro připojení něčeho dalšího – řetězce. Bude to mezera (tu ale musíme dá do uvozovek, protože je to text. Následně přidáme další tečku pro připojení dalšího řetězce. A to bude proměnná $prijmeni (zase není v uvozovkách).

PAMATUJ SI: Proměnné nezapisujeme do uvozovek! V uvozovkách je pouze text!

 

Sčítání a odčítání čísel

Teď už to bude jednoduché 🙂 (Téměř) všechny operátory fungují stejně.  Budeme používat klasický znak pro sčítání – plus:

+

Sečtení čísel provedeme takto:

<?php     
  $vysledek = 2+2;   
  echo $vysledek; 
?>

Tenhle kód je zcela easy. Výsledkem by mělo být číslo čtyři (4). Zkuste si skript spustit.

Odčítání funguje na stejném principu:

-

Použijeme jenom znak mínus (pomlčka):

<?php   
  $vysledek = 10-5;   
  echo $vysledek; 
?>

Pokud si tento skript spustíte, mělo by Vám vyjít číslo pět (5).

 

Násobení, dělení a zbytek

Princip je opět naprosto stejný, myslím, že ho tady už nemusím uvádět.

 

Přičtení jedničky a odečtení jedničky

Funguje na zajímavém principu. Pokud chceme k nějakému číslu (třeba k dvanáctce – 12) přičíst pouze jedničku (1) použijeme dvě pluska a to takhle:

<?php   
  $vysledek = "12";   
  $vysledek++;   
  echo $vysledek; ?>

Pokud si tento kód spustíte, mělo by se Vám vypsat číslo 13.

Odečtení funguje stejně, akorát přidáme dvě mínuska:

<?php   
  $vysledek = "12";   
  $vysledek--;   
  echo $vysledek; 
?>

Výsledkem by mělo být číslo jedenáct.

 

Další operátory, které využijeme až v podmínkách

Jejich přehled naleznete zde: Operátory v PHP (2.díl/2.série). Operátory, které využíváme v podmínkách fungují všechny na stejném principu. Takže pokud si napíšu podmínku, pokud:

  • je proměnná $prvni
  • stejná (to stejné značí dvě rovnítka ==)
  • jako proměnná $druha
  • tak udělej to první
  • jinak udělej to druhé
<?php   
  $prvni = "ahoj";   
  $druha = "nashledanou";   
  if($prvni == $druha){     
    //udělej to první     
  }else{      
    //udělej to druhé     
  } 
?>

To je opět hrubý náčrt podmínky. Už je totiž znáte z minula: Podmínky v PHP (3.díl/2.série) 🙂

Přenášení hodnot pomocí onclick v Javascriptu

Na diskusi Jak Psát Web (zkráceně DJPW) se uživatel Matess ptal, jak udělat to, že když klikne na odkaz, tak se mu přenese do inputu. Tady máte celé znění dotazu:

Zdravím, mám malou prosbu.
Potřeboval bych poradit jak udělat, že po kliknutí na číslo v tabulce, to číslo přenesu do inputu formuláře.

Něco jako je tady, ale aby se přeneslo jen jedno číslo (to na které kliknu naposledy).
Děkuji za vaše rady.

Já (Marschmallow) jsem mu odpověděl. Nyní Vám to řešení popíšu i zde 🙂

 

Nejprve si sepišme, čeho vlastně chceme docílit

  • v HTML budeme mít odkaz a prázdný input
  • po kliknutí na ten odkaz se nám obsah toho odkazu automaticky vloží do inputu

Co použijeme?

  • JavaScript a jeho prostředky:
  • onClick (něco se udělá po kliknutí)
  • vložení hodnoty value do inputu

Jdeme na to!

<form name="formular">     
  <input type="text" name="policko" value="">     
  <a href="#">ahoj</a> 
</form>

Máme tu jednoduchý formulář s názvem formular a v něm textový input s názevm policko, pak je tu ještě jednoduchý odkaz směřující na # s textem ahoj.

Teď ten kód (přesněji pouze ten odkaz) obohatíme o špetku JavaScriptu – o událost onClick.

<form name="formular">     
  <input type="text" name="policko" value="">   
  <a href="#" onclick="document.formular.policko.value = 'ahoj'">ahoj</a> 
</form>

Teď si ten kus JavaScriptu rozpitváme:

  • onclick – událost, která něco udělá při kliknutí
  • document.formular.policko – tím vybereme, s jakou částí kódu (elementem) chceme pracovat
  • .value – chceme do elementu vložit obsah (value)
  • ahoj – toto je text, který chceme do daného elementu (value) vložit

Nyní si zkuste kód spustit. Po kliknutí na odkaz „ahoj“ by se nám mělo do políčka (inputu) vložit slovo ahoj. Zkusme si kód lehce doplnit:

<form name="formular">
  <input type="text" name="policko" value=""> 
  <a href="#" onclick="document.formular.policko.value = '1'">1</a> 
  <a href="#" onclick="document.formular.policko.value = '2'">2</a> 
  <a href="#" onclick="document.formular.policko.value = '3'">3</a> 
  <a href="#" onclick="document.formular.policko.value = '4'">4</a> 
  <a href="#" onclick="document.formular.policko.value = '5'">5</a> 
</form>

Výše uvedený kód funguje úplně na stejném principu a úplně stejně ;). Akorát jsme přidali více odkazů. Vždy po kliknutí na jeden z odkazů se políčko vymaže a doplní tím novým odkazem – tzn., že když klikneme dvakrát na dvojku a pětkrát na jedničku, bude tam stále pouze to poslední číslo, na které jsme klikli.

Samozřejmě, že to nemusí být jenom číslice, ale i text, znaky, apod…

Vše si teď klidně vyzkoušejte – Živá ukázka.

Podmínky v PHP (3.díl/2.série)

Ahoj,

v minulém díle jsme si řekli něco o operátorech v PHP. V díle ještě před ním jsme se podívali na zub Superglobálním proměnným v PHP. Nyní si troufám říci, že jsme již plně „vyzbrojeni“ na pochopení podmínek v PHP.

Jelikož jsou podmínky velice rozsáhlé téma (toto je už 3. díl ze 2. série), budou následovat ještě alespoň dva další díly. V tomto díle Vás seznámím hlavně s nutnými základy podmínek a jejich fungováním. Abyste pochopili, jak se s nimi pracuje, na jakém principu fungují a hlavně – jak je můžete využít a k čemu jsou dobré v praxi.

Kapitoly:

 

Fungování podmínky (teorie)

Základním stavebním kamenem celé podmínky je nějaký již předem daný postup, jak ji poskládat. Každý postup se dá různě vylepšovat, nebo usnadnit. Je možné, že v praxi se setkáte s různými způsoby jak zapsat podmínku. Vždy ale různé zápisy se stejným cílem fungují stejně. Lze zapsat o pět znaků méně a bude to fungovat úplně stejně, jako kdybych jich napsal o pět více.

Nemůžu říct, které postupy jsou správné a které ne. Jak již jsem řekl, všechny fungují (pokud teda neobsahují chybu). Postup (a logika), kterým fungují podmínky je zhruba tento:

  1. Řeknu, že tohle je podmínka
  2. Následně si vyberu způsob, kterým chci vytvořit podmínku – vyberu si operátor
  3. Poté pomocí operátorů porovnám hodnoty
  4. Pokud souhlasí podle operátoru, tak
    1. Provedu jednu akci
    2. Jinak provedu tu druhou
  5. A podmínku nakonec ukončím

Toto byl opravdu velice letmý náčrt toho, jak podmínka může fungovat.

 

První ukázka jednoduché podmínky

Dejme tomu, že chceme sestavit tuto podmínku:

  • Pokud je obsah proměnné $prvni stejný jako obsah proměnné $druha
  • Tak vypiš text „Je to stejné“
  • Pokud není, tak vypiš text „Není to stejné“

A co budeme muset udělat?

  • Vytvořit proměnnou $prvni a definovat její obsah
  • Vytvořit proměnnou $druha a taktéž definovat její obsah
  • Vytvořit podmínku, že pokud jsou obě proměnné stejné tak (…), jinak (…)

Jdeme tedy na to! Založme si nejdříve nový PHP dokument nazvěme ho podminka1.php (název je na Vás). Na jeho začátku definujme dvě základní proměnné $prvni a $druha:

<?php  
  $prvni = "ahoj";  
  $druha = "ahoj";

Definovali jsme oběma proměnným stejný obsah – slovo ahoj. To znamená, že až budeme stavět podmínku, logicky se nám vypíše text „Je to stejné“.

Dále vytvořme začátek podmínky:

if($prvni == $druha)

Teď jsme vytvořili podmínku, ve které porovnáváme dvě proměnné, že

  • pokud je obsah $prvni
  • stejný (to stejný značí v podmínce dvě rovnítka – více v článku Operátory) jako
  • obsah $druha

Ale neznáme pokračování, co má PHP skript udělat, pokud obsah těchto proměnných bude stejný, nebo nebude? Co potom? Ještě upravím ten řádek se začátkem podmínky, pomocí složené závorky { otevřu podmínku:

if($prvni == $druha){

Nyní už se podíváme na to, co udělat v případě shody a co v případě neshody:

if($prvni == $druha){   
  echo "Je to stejné"; 
} else {  
   echo "Není to stejné"; }

Toto už je plně funkční podmínka. Hned na druhý řádek jsme vložili echo, to se nám vypíše v případě shody. Následně přidáme na konec středník a ještě složenou závorku (tentokrát na druhou stranu) }.

Potom napíšeme else, tohle slovíčko nám totiž v podmínce značí v češtině slovní spojení v opačném případě. A přidáme složenou závorku {. Takže v opačném případě (pokud se obsahy proměnných $prvni a $druha nerovnají – nejsou stejné) vypiš pomocí echo text „Není to stejné“. Poté zase ukončíme řádek středníkem a na nový řádek přidáme složenou závorku na druhou stranu }.

Celkový kód bude vypadat takto (vyzkoušejte si):

<?php   
  $prvni = "ahoj";  
  $druha = "ahoj";  
  if($prvni == $druha){ 
    echo "Je to stejné"; 
  } else {  
    echo "Není to stejné";
  }  
?>

Co když obsah není stejný?

Pakliže bychom změnili obsah jedné z proměnných (slovo ahoj), tak už se nám nemůže vypsat text, že je to stejné. Není to stejné. Jakmile je jedna z porovnávaných proměnných jiná, tak se vypíše tak část za else. Tedy text „Není to stejné“. Uvedu pro Vás příklad:

<?php   
  $prvni = "nashledanou";   
  $druha = "ahoj";
  if($prvni == $druha){  
    echo "Je to stejné"; 
  } else { 
    echo "Není to stejné";
  }  
?>

Nyní by se nám měl vypsat text „Není to stejné“.