Jump to content

Search the Community

Showing results for tags 'php'.

  • Search By Tags

    Oddělujte čárkami
  • Search By Author

Content Type


Fórum

  • Obecné
    • Všeobecné
    • Všechno možné
  • Programování
    • Poradna
    • Návody
    • Tvorba
    • Hledám programátora
  • Herní oblast
    • Poradna
    • Jak na to?
    • Herní kontext
    • Herní zážitky
    • Komunita
  • Grafika
    • Poradna
    • Návody
    • Tvorba
  • Ostatní
    • Hardware a software
    • Hledám/nabízím
    • Archiv
    • 3D Tisk

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Web


Facebook


Jabber


Skype


Steam


Twitter


Github


Pastebin

  1. Ahoj, pracuju zrovna na e-shopu (hodně předělaná stará Presta), který má občas velký traffic. Většinu této návštěvnosti tvoří připojení ní ze zahraničí (pravděpodobně boti), které nakonec stejně žádný nákup neuskuteční. Moje představa je taková, že když se klient pokusí navštívit stránky, zjistím, jaký je aktuální traffic. Pokud je traffic velký a klient se připojuje ze zahraničí, zobrazím statickou stránku s Captchou. Problém mám spíše s výběrem nejlepšího způsobu, jak zjistit aktuální návštěvnost. Nejsem si jistý, jestli posílání dotazu do databáze pro každé připojení je nejlepší způsob, když je provoz velký. Napadlo mě počítat provoz vytvořením WebSocket serveru, který by počítal pouze aktuální počet spojení. Jen nevím, jak by to zatížilo server a jestli to není horší řešení z hlediska výkonu. Poslední věc, která mě napadla, je počítání provozu za aktuální minutu tak, že bych hodnotu načetl pomocí apcu_fetch() (když klient pošle požadavek) a pomocí apcu_store() uložil +1. Skript na kontrolu provozu by se pak vždy díval na hodnotu uloženou předchozí minutu. Které řešení má nejmenší dopad na zatížení serveru a nenapadá vás ještě něco jiného co by jste mi doporučili?
  2. Ahojte, hľadám nejakého šikovného web developera, kľudne môžeš pracovať v tom čo tebe vyhovuje či už Nette alebo Symfony alebo Laravely. Ide o to aby to bolo dobré spravené (kvalitne), za rozumný čas a aj cenu (tu si dohodneme). Ak si šikovný nemalo by to byť pre teba nič zložité, takže ak by si mal záujem o prácičku-zákazku kľudne ma kontaktuj. Jednalo by sa o evidenciu skladových zásob a rezervačného systému zákazníkov a nejakého info k tomu. Viem, že existuje XY produktov hotových, ale chcel by som riešenie na mieru.
  3. Zdravím, dělám na interním systému (php, mysql) a přemýšlím jak navrhnout tabulky, aby systém byl udržitelný do budoucna a nebyl tak úplně overkill. Momentálně mám tabulky: pricelist - [id | company_id | discount] pricelist_has_item - [id | pricelist_id | item_id | price] Tak nějak bych chtěl rozvíjet historii ceníků - kdykoliv se položka v ceníku nebo ceník samotný změní tak změnu zapsat. Což by nebyl problém. Háček je v tom, že potřebuju, aby změna byla ale současně platná až následující den (abych ve stejný den neměl jednu zakázku takovou a druhou makovou). Změnu provedu dnes (12.11.2021) (sleva 0% -> 5%), ale těch 5% se bude počítat až od zítra Za měsíc se chci podívat, za jaký ceník měla bejt zakázka 8.11.2021 (měla by bejt sleva 0%) Prozatím mě napadlo to udělat jako snapshoty, co se bude vrstvit (jako malba na zdi). Což by pak změna v tabulkách vypadala tak: pricelist [id | company_id | 3% | valid_from 2021-11-13] (momentálně) pricelist_snapshot [id | pricelist_id | old_valid_from | 0% sleva] (snapshot před změnou) Ale přijde mi pak stupidní se pomocí query ptát - select pricelist -> aplikuj a prolni první snapshot pokud datum na který se ptám < 2021-11-13. A to jsem se ještě nedostal, k tomu, pokud by změna proběhla až v samotných položkách. Změním položku id 1 v ceníku (1 kč -> 5 kč) ale taky potřebuju aby to bylo až následující dny. To bych pak musel snapshotovat i položky. Nebo hledat položku, která platila pro daný snapshot celého ceníku. Kdybych místo snapshotu jenom předchozí zrušil a vytvořil nový pod novým primary key, tak by to mělo stejnej efekt a furt bych musel hledat ve vrstvách. Vítám jakékoliv nápady nebo doplňky
  4. Úvod Yii framework, je PHP framework a stejně jako mnoho dalších frameworku vám má především usnadnit práci a ušetřit čas psaním kódu. První vydání bylo v roce 2008. Nyní je Yii framework již ve verzi dvě. Klade důraz na znovu použitelnost a jednoduchost použití. Je striktně objektově orientovaný a každá komponenta frameworku je nezávislá, konfigurovatelná a rozšířitelná. Vlastnosti Rozdělení aplikační a prezentační logiky na základě MVC architektury. Přístup k databázi pomocí Database Access Objects (DAO) a Active Record Integruje jQuery knihovnu, pro validaci formulářů Jednoduché a bezpečné zpracování formulářů a validace dat Autentizace a autorizace – kontrola přístupu na základě hierarchických rolí Lokalizace (L10N) a internacionalizace (I18N) – překlad textů, formátování čísel a času Zpracování, archivování a filtrace chyb Zabezpečení a odolnost aplikace vůči různým druhům útoků Instalace Instalace vyžaduje, aby jste měli v počítači nebo na serveru nainstalovaný composer. A pak připravení aplikace vyžaduje PHP. A již předem vytvořenou databázi (prázdnou). Instalovat budeme advanced-template, jelikož basic-template nemá už v základu plno výhod a nechci vás o ně připravit. Otevřeme si příkazovou řádku a jdeme na to. Nejprve nainstalujeme plugin, který povoluje spravovat bower a npm závislosti skrze composer, a to příkazem: composer global require "fxp/composer-asset-plugin:~1.1.1" Poté si vytvoříme projekt samotný, příkazem: composer create-project --prefer-dist yiisoft/yii2-app-advanced yii-application Tento příkaz si rozebereme: composer – volání composeru create-project – dáváme vědět, že chceme vytvořit nový projekt --prefer-dist – znamená, že budeme upřesňovat, kde chceme nový projekt vytvořit yiisoft/yii2-app-advanced – název template advanced yii-application – název složky, která se vytvoří ve vašem počítači nebo na serveru s obsahem projektu (můžete libovolně upravit, dle svého) Finalizace Otevřeme si projekt v některém z editoru kódu, například VSC a otevřeme soubor: environments/dev/common/config/main-local.php – kde si nastavíme přístupy k databázi. Nyní musíme projekt z inicializovat, a to uděláme tak, že se v příkazovém řádku přesuneme do rootu nového projektu a pustíme příkaz: php init a zvolíme "Development". Poté pustíme migrace pomocí příkazu: ./yii migrate což nám automaticky vytvoří základní tabulky v databázi. A to je vše! Nyní máte web přístupný pod adresou http(s)://vas_web.cz/frontend/web/ a http(s)://vas_web.cz/backend/web/ – samozřejmě si můžete v Apache/Nginx nebo jen v .htaccess nastavit alias pro cestu, ale to už nechám na vás! Snad vás tento návod bavil tak, jako mě a zase někdy, AHOJ!
  5. Ahoj všem ♥ Mám dotaz co se úplně tak netýká kódu samotného, ale potřeboval bych vyřešit na webu paypal platby, to všechno je ok, problém nastává s IPN (jelikož potřebuji okamžitou odpověď o provedení platby) a IPN se mi buď šíleně zpozdí, nebo nedorazí vůbec, tudíž tohle řešení se mi vůbec nelíbí, je nějaká jiná možnost jak ověřovat platby přes paypal? Rád bych se vyhnul platebním branám atd. a využíval co nejvíce své řešení...
  6. Zdravím, chtěl bych se s vámi podělit o video, na které jsem dnes narazil. Zaujalo mě svým pojetím a informační hodnotou. Autorem není nikdo jiný, než autor velice úspěšné kickstarterové kampaně, mnoho nedokončených herních módů, bývalý moderátor pawno.cz, nadějný grafik (v tomto odvětví o něm ještě mnoho uslyšíme) a znalec jazyku C+. Není jím nikdo jiný, než Polis Polismanovitss. Nyní si pro nás připravil návod na základy HTML5, CSS a jeho vlastního dialektu angličtiny. Rozhodně doporučuji zhlédnout až do úplného konce, mě osobně tento formát videa velice potěšil. Velmi oceňuji časté čekání na upload souboru na jeho server, díky této pauze jsem mohl všechny informace řádně zpracovat. Kdyby ukázal html soubor na localu, asi bych se ztrácel. Autora si samozřejmě můžete (za nemalý peníz) najmout na určité služby na jeho webých sránkách, kde nechybí ani donate button. - Polis
  7. Zdravím. Mám v PC webovou stránku. Která má ukládání přes MySQl, jenže v kódu mám věci co podporují jen ve verzi PHP 7. A to připojení MySQL naopak na verzi 7 nefunguje jelikož syntaxe jsou na verzi 5.6?. Dokázal by mi někdo pomocí to předělat na ty nové? Zkoušel jsem to a přestalo mi to fungovat, takže dělám stále někde chybu. Děkuji za pomoc. <?php /* DATABASE CONFIGURATION */ define('DB_SERVER', 'hosting'); define('DB_USERNAME', 'uzivatel'); define('DB_PASSWORD', 'heslo'); define('DB_DATABASE', 'nazev'); function getDB() { $dbHost = DB_SERVER; $dbUser = DB_USERNAME; $dbPass = DB_PASSWORD; $dbName = DB_DATABASE; try { $dbConnection = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPass); $dbConnection->exec("set names utf8"); $dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); return $dbConnection; } catch (PDOException $e) { echo 'pripojeni k databazi bylo neuspesne: ' . $e->getMessage(); } } ?> dbconfig.php
  8. </> IndexART je späť ... </> Po dlhej dobe sme späť kedže sme štúdio pauzli kvôli neaktivite od teraz bude IndexART navždy spustený. Máš, herný portál alebo webstránku s ktorou potrebuješ pomoc s niečim alebo máš nejaký problem so webstránkou alebo si chcete prečítať članky, návody ... IndexART Sme komunita ľudí ktorá pomáha s grafikou a kódmi začiatočníkom. Sme tu od 2014 a v roku 2018 sme späť ... WEBSITE: http://indexart.sk/ FB PAGE: https://www.facebook.com/indexart.sk
  9. Zdravím! Hledám někoho kdo by udělal web pro GTA SA MP server. Web by měl být pro herní server RPG stylu. Dále bych chtěl na webu UCP, ale jelikož využívám file save nevím zda je to možné udělat (ukládání do scriptfiles). MySQL mi moc nevyhovuje a neumím s ní! Nabídka je samozřejmě finančně ohodnocená! Částka by byla dle domluvy. Samozřejmě také dle propracovaností a dalších kritériích! Vše může být smluvně podloženo. Když to vezmu cca částka by byla nějakých 250KČ/h
  10. Zdravím, hľadám php-čkara, kt. by mi pomohol s menšími úpravami v jednom scripte. Práca cca na 30 minút. Odmena je samozrejmosťou (finančná) podľa dohody. V prípade, že máte záujem, píšte mi súkromnú správu. Ďakujem.
  11. Riko

    pomoc MySQL - kódování

    Zdravím. Mám takový větší problém. Nevím, co bych měl vše napsat, tak napíšu tohle a vy se prosím ptejte na to, co bych měl dopsat. Server na SA:MP je dělaný přes databázi a bo mi odešel HDD do křemíkového nebe, nemám svou zálohu a musel mi ji poskytnout společník, ale v záloze si myslím to nebude. Myslím si, že je to v nekompatibilitě tabulek s daným PHP/MySQL server, proto se budu ptát zde. Popis problému: V PHPMyAdmin se data v tabulkách zobrazují normálně, ovšem na webu už ne. Nepíše to háčky, místo nich se zobrazují znaky. Ve fóru jsou pouze názvy témat, ale když na ně kliknu, obsah chybí a jdou vidět jen prázdné posty s avatary a nicky. Charset, chcete-li porovnávání, je nastaveno na utf-8_unicode_ci (zkoušel jsem i utf-8mb4, ale bez výsledku). Web mi po přidání níže uvedeného kódu do nastavení připojení databáze píše, že je nastaven charset na UTF-8. Web, kódy (styly, nabídka, navigace atp), které se netahají z databáze, se zobrazují v pořádku. if (!$db_spojeni->set_charset("utf8")) { printf("Error loading character set utf8: %s\n", $db_spojeni->error); } else { printf("Current character set: %s\n", $db_spojeni->character_set_name()); } Díky za každou radu, RiKo
  12. Čau kluci, mám takový pro náš nový internetový obchod děláme nový systém ale potřeboval bych pomoci s úpravou cronu pro nový systém... dle struktury... product Pro produkty vytvoříme tabulku product. Bude obsahovat následující sloupce: product_id (int) - Id produktu, primární klíč, autoincrement code (varchar 255) - Kód produktu pro obchodníka (např. EAN nebo cokoli jiného) url (varchar 255) - URL adresa produktu (např. zeleny-kvetinac-ella) pro lepší SEO optimalizaci title (varchar 255) - Titulek produktu short_description (varchar 255) - Krátký popisek do HTML meta tagu description (text) - Delší popisek pro detail produktu, může obsahovat HTML formátování price (decimal(10,1)) - Cena produktu old_price (decimal(10,1)) - Stará cena produktu (pokud je zlevněný) rating_sum (int) - Součet hodnocení produktu (celkový počet udělených hvězdiček uživateli) ratings (int) - Počet hodnocení produktu stock (int) - Počet kusů produktu na skladu images_count (int) - Počet obrázků u produktu hidden (tinyint) - Označuje zda je produkt skrytý (1/0), viz dále. Přidejme tabulku category s následujícími sloupci: category_id (int) - Id kategorie, primární klíč, autoincrement url (varchar 255) - URL adresa odkazu title (varchar 255) - Titulek order_no (int) - Určuje pořadí položek hidden (tinyint) - Určuje, zda je položka skrytá (můžeme tak skrýt nějaké systémové kategorie, viz dále) parent_catego­ry_id (int, nullový) - Id rodičovské položky (pod kterou má být položka zařazena) nebo NULL, cizí klíč řidáme tabulku product_category s následujícími sloupci: product_catego­ry_id (int) - Id vazebního řádku, primární klíč, autoincrement product_id (int) - Id produktu, cizí klíč category_id (int) - Id kategorie, do které produkt patří, cizí klíč Zde mám již upravený cron ve kterém mi dělají problémy obrázky. <?php /** * Description of Import * * @author David Skála <[email protected]> */ class Import { CONST URL = 'http://navratws:[email protected]/i6ws/Default.asmx/GetResult?resultType=X-StoItemBaseComplEl'; private $slozka; private $slozkaDb; /** @var DibiConnection */ private $dibi; public function __construct($dibi) { $this->log('init'); $this->dibi = $dibi; $this->slozka = __DIR__ . '/../images/products/'; $this->slozkaDb = 'images/products/'; /* $cdir = scandir($this->slozka); foreach ($cdir as $value) { if (intval($value) > 112) $this->rrmdir($this->slozka . $value); } exit; */ } private function rrmdir($dir) { if (is_dir($dir)) { $objects = scandir($dir); foreach ($objects as $object) { if ($object != "." && $object != "..") { if (is_dir($dir . "/" . $object)) $this->rrmdir($dir . "/" . $object); else unlink($dir . "/" . $object); } } rmdir($dir); } } /** * * @param string $message */ private function log($message) { echo sprintf('<span style="color: #CCC;">bellugio:</span> %s<br>', $message); } /** * * @return type */ public function getXml() { $this->log('getXml: ' . self::URL); return file_get_contents(self::URL); } public function zpracujXmlKategorie($xml) { $poleLevel1 = [ 'Míčové a společenské sporty' => 2, 'Fitness a posilovna' => 2, 'Vodní sporty' => 2, 'Skating' => 2, 'Bojové sporty' => 2, 'Tenis a badminton' => 2, 'Outdoor' => 3, 'Sport. obuv a nazouváky' => 4, 'Termoprádlo' => 4, 'Funkční oblečení' => 4 ]; foreach ($xml->StoItem as $item) { $tmp1 = explode(' ', $item->SPresentTree->Level1); unset($tmp1[0]); $level1 = trim(implode(' ', $tmp1)); $idLevel0 = isset($poleLevel1[$level1]) ? $poleLevel1[$level1] : 'false'; /* level 1 */ if ($idLevel0) { $data = $this->vratDataProKategorii($idLevel0, $level1); $kategorieId_1 = $this->dibi->query(sprintf('SELECT category_id FROM [category] WHERE [url] = "%s" LIMIT 1', $data['url']))->fetchSingle(); if (!$kategorieId_1) { $this->dibi->query('INSERT INTO [category]', $data); $this->log(sprintf('Vytvořena kategorie úrovně %d s názvem %s', 1, $level1)); $kategorieId_1 = $this->dibi->getInsertId(); } /* level 2 */ $tmp2 = explode(' ', $item->SPresentTree->Level2); unset($tmp2[0]); $level2 = trim(implode(' ', $tmp2)); if ($level2) { $data = $this->vratDataProKategorii($kategorieId_1, $level2); $kategorieId_2 = $this->dibi->query(sprintf('SELECT category_id FROM [category] WHERE [url] = "%s" LIMIT 1', $data['url']))->fetchSingle(); if (!$kategorieId_2) { $this->dibi->query('INSERT INTO [category]', $data); $this->log(sprintf('Vytvořena kategorie úrovně %d s názvem %s', 2, $level2)); $kategorieId_2 = $this->dibi->getInsertId(); } /* level 3 */ $tmp3 = explode(' ', $item->SPresentTree->Level3); unset($tmp3[0]); $level3 = trim(implode(' ', $tmp3)); if ($level3) { $data = $this->vratDataProKategorii($kategorieId_2, $level3); $kategorieId_3 = $this->dibi->query(sprintf('SELECT category_id FROM [category] WHERE [url] = "%s" LIMIT 1', $data['url']))->fetchSingle(); if (!$kategorieId_3) { $this->dibi->query('INSERT INTO [category]', $data); $this->log(sprintf('Vytvořena kategorie úrovně %d s názvem %s', 3, $level3)); } } } } } } private function vratDataProKategorii($parentId, $jmeno) { $orderid = $this->dibi->query("SELECT max(category.order_no) AS order_nos FROM [category]")->fetchSingle() + 1; return [ 'url' => $this->webalize($jmeno), 'title' => $jmeno, 'order_no' => $orderid++, 'hidden' => 0, 'parent_category_id' => $parentId ]; } /** * * @param type $xml */ public function zpracujXmlZbozi($xml) { foreach ($xml->StoItem as $item) { $idKat = $this->dibi->query(sprintf("SELECT product_id FROM [product] WHERE [code] = '%s' LIMIT 1", $item->Code))->fetchSingle(); $nazev = $idKat ? $this->dibi->query(sprintf("SELECT title FROM [product] WHERE [product_id] = %s LIMIT 1", $idKat))->fetchSingle() : false; if (!$nazev) { $this->log($item->Id . ': ' . $item->Name); if ($item->SisName == 'Výprodej') $action = 1; if ($item->SisName == 'Novinka') $news = 1; $dataCatalog = [ 'product_id' => intval($item->Id), 'code' => (string) ($item->Code), 'url' => $this->webalize($item->Name), 'title' => (string) $item->Name, 'shortname' => (string) $item->Name, 'short_description' => (string) $item->Note, 'description' => (string) $item->Note, 'price' => intval($item->PriceEU), 'old_price' => intval($item->PriceDea), 'rating_sum' => 0, 'ratings' => 0, 'stock' => 1, 'images_count' => 0, 'hidden' => 0 ]; $this->dibi->query('INSERT INTO [product]', $dataCatalog); $lastId = $this->dibi->getInsertId(); /* katerogie */ foreach (['Level1', 'Level2', 'Level3'] AS $_level) { $tmp = explode(' ', $item->SPresentTree->{$_level}); unset($tmp[0]); $level = implode(' ', $tmp); $kategorieId = $this->dibi->query(sprintf('SELECT category_id FROM [category] WHERE [title] = "%s" LIMIT 1', $level))->fetchSingle(); if ($kategorieId) { $dataKat = [ 'product_id' => $lastId, 'category_id' => $kategorieId ]; $this->dibi->query('INSERT INTO [product_category]', $dataKat); } } $idFotky = $this->dibi->getInsertId(); /* obrazky */ if (!file_exists($this->slozka)) mkdir($this->slozka, 0777, true); copy($item->ImgUrl, $this->slozka . $this->intval($item->Id) . '.jpg'); $this->dibi->query('UPDATE [product] SET images_count= ' . $idFotky . ' WHERE product_id = ' . $lastId); } else { $lastId = $this->dibi->query(sprintf("SELECT product_id FROM [product] WHERE [product_id] = %s LIMIT 1", $idKat))->fetchSingle(); foreach (['Level1', 'Level2', 'Level3'] AS $_level) { $tmp = explode(' ', $item->SPresentTree->{$_level}); unset($tmp[0]); $level = implode(' ', $tmp); if ($level) { $kategorieId = $this->dibi->query(sprintf('SELECT category_id FROM [category] WHERE [title] = "%s" LIMIT 1', $level))->fetchSingle(); if ($kategorieId) { $bindCat = $this->dibi->query(sprintf("SELECT product_id FROM [product_category] WHERE [product_id] = %s AND [category_id] = %s LIMIT 1", $lastId, $kategorieId))->fetchSingle(); if (!$bindCat) { $dataKat = [ 'product_id ' => $lastId, 'category_id' => $kategorieId ]; $this->dibi->query('INSERT INTO [product_category]', $dataKat); } } } } } } } private function webalize($string) { $url = preg_replace('~[^\\pL0-9_]+~u', '-', $url); $url = trim($url, "-"); $url = iconv("utf-8", "us-ascii//TRANSLIT", $url); $url = strtolower($url); $url = preg_replace('~[^-a-z0-9_]+~', '', $url); return $url; } } Ale mám problém s ukládáním obrázku... Mám složku images/product ve které se obrázky ukládají tak ze IdProduktu_kolikatyObrazekToJe.jpg To znamená mám obrázek s ID 1 a u nej mám 3 obrázky a ve složce mám 1_0.jpg,1_1.jpg,1_2.jpg a v Db product ve sloupci images_count se mi vytvoří argument kolik těch obrázku to dané ID ma v tomto případě 3 a pokud nějaký smažu odstraní se ze složky a v Db se aktualizuje na počet 2 Mohl by mi někdo poradit nebo pomoci abych dospěl k funkčnosti cronu? Díky všem
  13. Hledáme šikovného programátora či dívčinu programátorku :-), který umí vytvořit skutečně profi a bezpečné webové stránky. Grafika je příjemným plusem, ale není nutno, zvlášť znáš-li někoho, kdo ti s grafikou pomůže. Neumím posoudit, zda je to plusem či mínusem, avšak podmínkou je, že chceme zaměstnance. Ne člověka, který mi vytvoří web a pak zase odfrčí tvořit jiné weby. Protože vývoj webových stránek je to, co nás nyní nejvíce pálí, je možné si po vytvoření webu vybrat, co tě v IT oblasti baví. Spokojen bys u nás jistě byl. Můžeš se věnovat vývoji, programování, kyber bezpečností atd. atd., prostě vším, co tě v IT napadne :-). Nejsme firma, nejsme e-shop. Nic nekupujeme ani neprodáváme. Pracujeme s informacemi. Náš web navštěvují tisíce a tisíce lidí s různým cílem. A proto chci někoho, kdo už umí, zná. Ne, kdo se tvořit web teprve učí. To si nemůžeme dovolit. Bezpečnost je pro nás na prvním místě. Pracoviště v Praze. Peníze od 45000 do 60000 Kč. Pokud tě nabídka zaujala, dej o sobě vědět na mail [email protected].
  14. Riko

    pomoc PHP Mail Send

    Zdravím komunitu Pawna.cz. Měl bych dotaz protože si fakt nevím rady, jak na to. Na OS Linux s postfixem potřebuji odesílat maily. To funguje. Problém je ale někde jinde. Potřebuji vědět, proč mi tento kód neodesílá mail ve formátu HTML ale odesílá ho jako prostý text function sendmail($to,$subject,$message,$from = "[email protected]"){ $predmet = mime_header_encode($subject); $autor = mime_header_encode("SA-MP Reálný Život"); $headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= "Content-Type: text/html; charset=UTF-8\r\n"; $headers .= 'Content-Transfer-Encoding: 8bit'. "\r\n"; $headers .= 'From: '.$autor.' <'.$from.'>' . "\r\n"; mail($to,$predmet,$message,$headers); } Zde je chybějící $message, která se nachází v jiném souboru: $content .= "<html> <body> <h2>Registrace</h2> Děkujeme za vaší registraci.<br /> Pro potvrzení a aktivaci vašeho účtu klikněte na následující odkaz:<br /><br /> <a href='".DEF_WEBURL."account_verify/$random_key' target='_blank'>".DEF_WEBURL."account_verify/$random_key</a><br /><br /> <h3>".DEF_SITENAME."</h3> <h4>".DEF_WEB."</h4> </body> </html>"; mail($_POST['v1'],"Registrace Reálný Život",$content,"From: [email protected]"); Tento email odesílá ve formátu HTML, proč tomu tak je? Díky. <?php $to = '[email protected]'; $subject = 'Website Change Reqest'; $headers = "From: Reálný Život <[email protected]>\r\n"; $headers .= "Reply-To: ". strip_tags($_POST['req-email']) . "\r\n"; $headers .= "CC: [email protected]\r\n"; $headers .= "MIME-Version: 1.0\r\n"; $headers .= "Content-Type: text/html; charset=UTF-8\r\n"; $message = '<p><strong>This is strong text</strong> while this is not.</p>'; mail($to, $subject, $message, $headers); php?> Již funguje zapsáním kódu $content .= "<html> <body> <h2>Registrace</h2> Děkujeme za vaší registraci.<br /> Pro potvrzení a aktivaci vašeho účtu klikněte na následující odkaz:<br /><br /> <a href='".DEF_WEBURL."account_verify/$random_key' target='_blank'>".DEF_WEBURL."account_verify/$random_key</a><br /><br /> <h3>".DEF_SITENAME."</h3> <h4>".DEF_WEB."</h4> </body> </html>"; $headers = "From: Reálný Život <[email protected]>\r\n"; $headers .= "MIME-Version: 1.0\r\n"; $headers .= "Content-Type: text/html; charset=UTF-8\r\n"; mail($_POST['v1'],"Registrace Reálný Život",$content,$headers); redirect("?registered"); Sice nechápu, proč to dříve fungovalo a teď to nefunguje, ale budiž. Díky.
  15. Zdravím, Potrebujem z určitého súboru vybrať len určity riadok časť riadku, konkrétne z modu potrebujem vybrať parameter ktorý sa nachádza v zložke hráča napr "peniaze = X" tak to X by som potreboval vybrať. Našiel som nato funkciu explode no to mi nejako stale vracia 0. Samozrejme som na daný server pripojení cez FTP účet normalne to funguje overil som si to. Ďakujem za každú pomoc.
  16. Zdravím, rád bych vám dnes ukázal jak si jednoduše vytvořit vlastní panel do Tracy. Ti z Vás kdož používají Nette se s Tracy znáte, pro vás ostatní je to skvělá utilita o které si popovídáme jindy Základem je mít nainstalovanou Tracy , pokud pracujete v Nette tak tracy máte nainstalovanou automaticky. Já osobně své vlastní panely mám uchované přímo vedle Tracy tzn , že ve složce knihovny jsem si vytvořil složku tracy_modules do které dávám jednotlivé soubory k jednotlivým panelů. Začneme tím , že si tedy vytvoříme soubor pro náš panel s nádledujícím obsahem <?php use Tracy\IBarPanel; class <jmeno_naseho_panelu> implements IBarPanel { function getTab() { } function getPanel() { } } Nyní si rozebereme ty dvě funkce.. Funkce getTab vrací vlastně obsah který se bude zobrazovat na Tracy. A funkce getPanel vrací obsah pro popup který se otevře při najetí na getTab. Pro účely tutoriálu náš panel bude mít ikonku php a v popupu bude titulek PHP a pod ním vypsána verze PHP. Najdeme si ikonku nejlépe 24x24 pixelů a vytvoříme si tedy tab function getTab() { return "<span title='<tooltip_titulek>'><img src='<url_ikonky>'><volitelny_titulek_vedle_ikonky></span>"; } Případně nemusíme používat ikonku tudíž vynecháme celý tag . No a nyní tedy chceme na hover vidět verzi php kterou disponujeme function getPanel() { $title = "<h1>PHP</h1>"; $header = "<div class='tracy-inner'><table><tbody>"; $content = "<tr><td>Verze PHP</td><td>".phpversion()."</td></tr>"; $footer = "</tbody></table>"; return $title.$header.$content.$footer; } Requirneme soubor s naším panelem. A panel přidáme do tracy v mém případě se panel jmenuje PHPPanel Tracy\Debugger::getBar()->addPanel( new PHPPanel() ); A můj panel nyní vypadá takto A to je vše. Nyní je kompletně na Vás co bude Váš panel umět a co bude zobrazovat
  17. Předem bych rád upozornil, že v repo může být i napřed před návody. Už jen z toho důvodu , že si hodlám kód připravovat a nepsat ho přímo při návodu. Pojďme si založit nový mód. Ve složce php si vytvoříme složku s libovolným názvem. V mém případě se složka jmenuje samp-php-gamemode. Do ní vytvoříme soubor gamemode.php Do souboru gamemode.php si připravíme dva eventy prvním bude nastartování módu a druhým připojení hráče. <?php include "core/bootstrap.php"; Event::on('GameModeInit', function() { }); Event::on('PlayerConnect', function($player){ }); A začneme tím , že přivítáme hráče na našem serveru... Použijeme k tomu známou funkci SendClientMessage byť krapet pozměněnou po stránce argumentů. SendClientMessage( 0xFF00FF00 , "Hráč ".$player->getName()." se připojil na náš PHP server :)"); Asi se možná ptáte ale kde je id kterému se má message poslat ? Event si ho sám určí Respektive si ho najde z instance $player. Dále si můžeme nastavit nějaké ty informace o serveru.. Například GameModeText a PED animace Event::on('GameModeInit', function() { Server::setGameModeText( "Ewolutions PHP Gamemode" ); Server::usePlayerPedAnims(); }); Jména funkcí jsou nebo mohou být krapet odlišná. Ale veškeré funkce najdete ve složce php/core. Tímto dílem bych ve Vás chtěl probudit trošku zvědavosti a navnadit Vás co všechno by mohlo být možné V příštím už se vrhneme na něco komplexnějšího... Třeba registraci
  18. Zdravím, Chtěl bych rozjet takový menší seriálek o tom jak vytvářet scripty, a módy do SA-MP v PHP. Proč ? Je to jednoduché. Díky PHP si do sampu přineseme možnost OOP. Ale k tomu se dostaneme v průběhu. Celý projekt bude dostupný na Githubu. V tomto prvním díle Vám ukážu jak to cele sprovoznit. A od dalšího dílu už začneme programovat Stáhneme: SA-MP Server => zde PHP Plugin => zde Tutoriálové repo => zde Rozbalíme server a sloučíme ho s obsahem archivu s pluginem. Složka serveru by měla vypadat tedy zhruba takto: Vytvoříme si ve složce gamemodes libovolný pwn soubor. Já jsem použil gamemod bare ve kterém jsem obsah nahradil za #include <a_samp> main(){} Zkompilujeme a tím jsme hotoví s jazykem pawn Server.cfg by měl vypadat přibližně následovně. echo Executing Server Config... lanmode 0 rcon_password changedfdfme maxplayers 50 port 7777 hostname SA-MP 0.3 Server gamemode0 bare filterscripts plugins samphp announce 0 chatlogging 0 weburl www.sa-mp.com onfoot_rate 40 incar_rate 40 weapon_rate 40 stream_distance 300.0 stream_rate 1000 maxnpc 0 logtimeformat [%H:%M:%S] language English Po nastartování serveru by jste měli v konzoli vidět pár printů ohledně toho jak programovat.
  19. Ewwe

    návod PHP II. Cykly

    Obsah: Cykly v rychlosti for foreach while 1. Cykly v rychlosti Já se budu zabývat jen třemi cykly které jsou zmíněny v obsahu. Podle mě je zbytečné zabývat se ostatními protože více-méně vycházejí z těchto základních ( především tedy z while ) 2. Cyklus for Cyklus for se hodí k procházení dat a opakování určité činnosti. Syntaxe cyklu je for( [index] ; [podmínka] ; [akce] ) V zásadě jsou dva druhy cyklu for a to inkrementační a dekrementační. Samozřejmě lze použít i násobení, dělení či jinou matematickou činnost $array = [ array(1,"Pes"),array(2,"Kočka"),array(3,"Křeček") ]; echo "<select>"; for( $i = 0; $i < sizeof( $array );$i++ ) { echo "<option value='".$array[$i][0]."'>".$array[$i][1]."</option>"; } echo "</select>"; Důležité je vědět , že for mění hodnotu indexu až jako poslední úkon. Tzn. $array = [ array(1,"Pes"),array(2,"Kočka"),array(3,"Křeček") ]; echo "<select>"; for( $i = 0; $i < sizeof( $array );$i++ ) { //0 echo "<option value='".$array[$i][0]."'>".$array[$i][1]."</option>"; // až tady se provede inkrementace } echo "</select>"; Osobně for používám málokdy. Většinou máte výstupy uložené asociačně a pro ty se hodí třeba právě foreach 3. Cyklus Foreach Foreach je zajímavější protože sním můžete krásně procházet associované pole Základní syntaxe foreach( naplnene_pole as polozka ) //nebo foreach( naplnene_pole as klic => polozka ) Rozdíl mezi těmito dvěma způsoby zápisu je jen v tom , že do promene klic se uloží asociace na indexu. Menší příklad $array = [ "Pes"=>1,"Kocka"=>2,"Krecek"=>3 ]; foreach( $array as $zvire ) { echo $zvire.","; } // Výstupem bude : 1,2,3 foreach( $array as $zvire => $hodnota ) { echo $zvire." ma hodnotu ".$hodnota.","; } // Výstupem bude : Pes ma hodnotu 1,Kocka ma hodnotu 2,Krecek ma hodnotu 3, 4. Cyklus while Cyklus while já osobně moc nepoužívám v podstatě jen k načtení výsledu z mysqli query ( dozvíme se příště ) Syntaxe cyklu while( podminka ) Doslovně syntaxe znamená "dokud platí podmínka" Příklad použití /* Predpokladejme ze máme připojenou databázi s tabulkou users a sloupcem username který obsahuje jméno uzivatele */ $result = $mysqli->query("SELECT * FROM users"); while( $row = $result->fetch_assoc() ) { echo $row["username"]; } Hodnota promenne $row je true pokud je do ni ulozeno pole s výstupem databáze. Tzn dokud je co číst tak cyklus vypisuje. Jakmile už není co číst tak není ani co psát Cyklus while má "derivát" do-while. Klasický while provede akci uzavřenou v bloku pokud podmínka platí. Tzn , že podmínka se kontroluje první a až poté je případně vykonána akce. U cyklu do-while se akce vykoná a až poté je kontrolována podmínka. Jen v rychlosti syntaxe do-while vypadá následovně $i = 0; do { $i++; echo $i; } while( $i<=25); // nejvyžší vypsaná hodnota bude 26 Osobně s do-while nemám moc zkušeností a ani si nepamatuji jestli jsem ho někdy použil.. Pokud nezapomenu tak bude následovat další díl. Pro tento je to momentálně všechno.
  20. Ewwe

    návod PHP III. Databáze

    Obsah: MariaDB MySQLi PDO Dibi 1. MariaDB MariaDB je fork klasického MySQL s vylepšeními ohledně výkonu. Pokud si můžete vybrat MariaDB by měla být jasná volba. Nejedno vývojové prostředí ( XAMMP nebo WAMP ) Vám dovolí si jednoduše vybrat mezi MySQL a MariaDB. 2. MySQLi MySQLi je náhrada za mysql co se týče PHP. Jelikož od verze 5.5 jsou funkce s prefixem mysql_ označené jako depreceated a od verze 7.0 jsou dokonce ostraněné. S MySQLi se dá pracovat buď procedurálně nebo objektovně. Připojení k DB ( procedurální ): $connection = mysqli_connect( "127.0.0.1","root","pwd", "konkretni_db" ); Připojení k DB ( objektové ): $mysqli = new mysqli( "127.0.0.1","root","pwd","konkretni-db"); Určitě si myslíte , že v tom momentálně není moc rozdíl. To přijde. V procedurálních funkcí je nutné doplňovat proměnnou $connection například $result = mysqli_query( $connection , "SELECT * FROM users" ); naproti tomu u objektového přístupu $result = $mysqli->query("SELECT * FROM users"); Prakticky to znamená , že do $mysqli je uložený objekt mysqli který obsahuje všechny potřebné informace vč. instance připojení Načítání výsledků z db je v obou případěch relativně stejné // procedurální while( $row = mysqli_fetch_assoc( $result ) ) { echo $row["user_name"]; } // objektové while( $row = $result->fetch_assoc() ) { echo $row["user_name"]; } Mě osobně přijde objektové využívání přehlednější než to procedurální. Ale v případě že budete při připojení používat mysqli tak je to jen na Vás. 3. PDO Já osobně PDO moc nefandím. Tak nějak mi nevyhovuje způsob zápisu a celý koncept. Ano chápu , že PDO je nové možná rychlejší , bezpečnější a propracovanější a nabízí několik nových možností jako například před-připravování queryn atd. Připojení k db pomocí PDO $pdo new PDO("mysql:host=127.0.0.1;dbname=konkretni_db;","root","pwd"); Vytvoření dotazu pomocí prepare: $statement = $pdo->prepare("SELECT * users WHERE user_name = ?"); $statement->execute(["Ewwe"]); $result = $statement->fetchAll(); Osobně se moc nechci pouštět do PDO jelikož mu tolik nerozumím. Raději nechám PDO na někoho povolanějšího. 4. Dibi Kde jsem ale naprosto jako doma je Dibi. Je to databázový layer vytvořený panem Davidem Grudlem , který stojí za jedním z nejpopulárnějších frameworků ( Nette ). Dibi bylo psáno za účelem ušetřit a ulehčit práci programátorům. Dibi přináší několik "featur" , které jsou podle mého názoru užasné a dnes bych si nedokázal představit pracovat s db bez Dibi. Dibi chci věnovat samostatný díl ( dnes , zítra ) protože ja tak natolik obsáhlé , že by se těžko slučovalo stímto návodem. To by bylo pro tento návod vše a v dalším se budu věnovat tady právě Dibi a Tracy
  21. Dneska jsem se dočetl o novém operátoru , který nejspíše přidají v PHP 7.2 nebo v PHP 8. Je to operátor hvězdička hlavní využití podle vývojářů je to , že umožní aby časté operace pro escapování byli jednodužší. Syntaxe nového operátoru <?* $str ?> <?* $str, 'html' ?> <?* $str, $context ?> A jedná se o zkrácení následujícího kódu $thing['name'] = "dsfwčgevěv"; // Aktuálně <?= htmlspecialchars(urlencode($thing['name'])) ?> // Nový operátor <?* $thing['name']?> Není uplně potvrzené , že opravdu tento operátor přidají ale momentálně to tak vypadá. Uvidíme co bude dál
  22. Obsah: continue break 1. Continue Continue je "funkce" pro přeskočení aktuálního indexu respektive pro přeskočení celého cyklu pro aktualní "průchod" cyklem. $var = [ "Pes" => 1, "Kocka" => 2, "Krecek" =>3 ]; foreach( $var as $zvire => $hodnota ) { if( $zvire == "Kocka" ) continue; echo $zvire." ma hodnotu ".$hodnota.","; } // Výstup bude : Pes ma hodnotu 1,Krecek ma hodnotu 3, Hodí se to pro vyloučení hodnot a pro urychlení průchodu cyklem. Protože když máme nějaký složitý cyklus ( hodne podmínek které by se museli kontrolovat atd ) ,který obsahuje třeba 500 indexů které chceme a 500 které nechceme tak si uděláme hned na začátku podmínku na nějaký společný znak a hodíme ho do continue tudíž se tyto indexy rovnou přeskočí a nemusíme je zbytečně testovat. 2. break Oproti tomu break celý cyklus zastaví. $var = [ "Pes" => 1, "Kocka" => 2, "Krecek" =>3 ]; foreach( $var as $zvire => $hodnota ) { if( $zvire == "Kocka" ) break; echo $zvire." ma hodnotu ".$hodnota.","; } // Výstup bude pouze : Pes ma hodnotu 1 Opět můžeme vymýšlet různé scénáře kdy je to potřeba. Tohle by bylo na téma cyklů zhruba tak vše.
  23. Ewwe

    návod PHP I. Základ

    Obsah : Open tagy Proměnné Operátory Open tagy : V zásadě používáme dva typy tagů prvním je klasický <?php ?> a <?= ?> Jaký je mezi nimi rozdíl ? První typ ja základní a používá se pro veškeré php programování. Ten druhý je takový tweak pokud například chcete do html vypsat obsah proměnné či funkce. //"plné tagy" <?php echo $_SERVER["REMOTE_ADDR"];?> //"tweak" tagy <?=$_SERVER["REMOTE_ADDR"]?> Existuje ještě tzv. krátke open tagy ( short open tags ) které musí být povolené webovým serverem. <? echo $_SERVER["REMOTE_ADDR"];?> Proměnné : PHP umí pracovat se skoro všemi standardními datovými type ale není přísně typový jako třeba C#. To znamená že do jedné proměnné lze uložit jakýkoliv datový typ. $var = 1337; $var = 13.37; $var = "1337"; $var = true; Nějaké základní typy jsou : integer,string,float,bool,array,object,null a resource Operátory : přidělovací porovnávací operátor kontroly chyb aritmetické tečkový operátor spaceship Přidělovací: Přidělovací operátor = ( rovnítko ). Přidělování hodnot proměným. $var = 1337; Porovnávací: Máme jich hned několik první skupině budeme říkat datové , druhé hodnotové a třetí šipkové. Nejsou to žádná oficiální pojmenování. Datové: Dvojité rovnítko ( == ). Porovná zda li jsou hodnoty na obou stranách podobné. 1 == 1 //true 1 == "1" //true 1 == true //true Hodnotové: Trojité rovnítko (===). Porovnává zda jsou hodnoty stejné 1 === 1 //true 1 === "1" //false 1 === true //false Šipkové: Klasické operátory > a = a Operátor kontroly chyb: Operátor kontroly chyb (@) slouží k potlačení chybové hlášky. $var = $array[$index]; // dostaneme hlášku , že $index neexistuje $var = @$array[$index];// ticho Aritmetické operátory: Klasické operátory které znáte z matematiky ( * , - , * , / , ++ , -- , += , -= , *= , /= ). První čtyři znáte a nebudu je rozebírat. Operátory inkrementace (++) a dekrementace (--) které hodnotě přidají nebo uberou jedničku. $var = 0; //0 $var ++; //1 $var --; //0 Poslední čtyři operátory slouží k přidání hodnoty. Tzn operátor += přidá k proměnné na levé straně hodnotu z pravé $var += 25; Ekvivalentem je delší zápis $var = $var + 25; Tečkový operátor: Slouží pro spojování řetězců. $number = 1337; $var = "Dnešní číslo je ".$number; $output = "| ".$var." |"; Operátor spaceship: Tento operátor byl přidán ve verzi PHP 7. Upřímně netuším jestli má obdobu v jiném jazyce. Hodí se například v sortění polí. Základní funkcí je , že při stejných hodnotách na obou stranách vrací nulu při levé nižší než pravé -1 a při pravé nižší 1 var_dump(1 <=> 1); // 0 var_dump(1 <=> 2); // -1 var_dump(2 <=> 1); // 1 var_dump(('a' <=> 'a')); // 0 var_dump(('a' <=> 'b')); // -1 var_dump(('b' <=> 'a')); // 1 Ohledně sortění pole pomocí funkce .. Před php7 jste museli zhruba takto $data = array( array('id' => 1, 'price' => 50), array('id' => 7, 'price' => 40), array('id' => 5, 'price' => 130), ); uasort($data, function ($a, $ { return ($a['key'] < $b['key']) ? -1 : (($a['key'] > $b['key']) ? 1 : 0); }); S příchodem php7 lze tento kód zkrátit následovně uasort($data, function ($a, $ { return $a['key'] <=> $b['key']; }); Pokud nezapomenu tak bude následovat další díl. Pro tento je to momentálně všechno.
  24. Zdravím Hledám někoho kdo by byl ochotnej mi nainstalovat PHP fusion + udělat první kunfiguraci. Nastavení mysql atp.. Odměna: Na odměně by jsme se domluvily, může být i finanční Prosím, aby se ozívali jen zájemci. Předem děkuji
  25. Ewwe

    php WorldofTrucks

    Zdravím, již před nějakou dobou jsem psal tuto třídu protože jsem chtěl dále pracovat se statistikami z webu https://worldoftrucks.com Včera jsem dopsal další verzi a troufám si říci, že je na mnohem lepší úrovni než ta předchozí Třída má dvojí použití 1. Fetch statistik pro konkrétního hráče. $wot = new WorldOfTrucks(96022); $wot->fetchData(); $stat = $wot->getData("GLOBAL"); //or $stat = $wot->getData("ATS"); //or $stat = $wot->getData("ETS"); kde proměnná $stat obsahuje pole array (size=5) 'TOTAL_JOBS' => int 98 'TOTAL_MASS' => string '1393 t' (length=6) 'TOTAL_DISTANCE' => string '62038 t' (length=7) 'AVERAGE_DISTANCE' => string '633 km' (length=6) 'TOTAL_TIME' => string '46 h 42 min' (length=11) dále je možné zavolat $wot->userName ve kterém je uložené jméno hráče 2. Porovnávání n hráčů $data = WorldOfTrucks::compare(96022,7825,386356,"GLOBAL"); //or $data = WorldOfTrucks::compare(96022,7825,386356,"ATS"); //or $data = WorldOfTrucks::compare(96022,7825,386356,"ETS"); kde n argumentů jsou uid hráčů/uživatelů na webu a posledním argumentem musí být z jaké hry se mají data porovnávat a proměnná $data obsahuje array (size=6) 0 => array (size=4) 0 => string 'Staty' (length=5) 1 => string 'Ewwe' (length=4) 2 => string 'SilverMind' (length=10) 3 => string 'Baumfalke73' (length=11) 1 => array (size=4) 0 => string 'TOTAL_JOBS' (length=10) 1 => int 98 2 => int 27 3 => int 57 2 => array (size=4) 0 => string 'TOTAL_MASS' (length=10) 1 => string '1393 t' (length=6) 2 => string '359 t' (length=5) 3 => string '800 t' (length=5) 3 => array (size=4) 0 => string 'TOTAL_DISTANCE' (length=14) 1 => string '62038 t' (length=7) 2 => string '14256 t' (length=7) 3 => string '26640 t' (length=7) 4 => array (size=4) 0 => string 'AVERAGE_DISTANCE' (length=16) 1 => string '633 km' (length=6) 2 => string '528 km' (length=6) 3 => string '467 km' (length=6) 5 => array (size=4) 0 => string 'TOTAL_TIME' (length=10) 1 => string '46 h 42 min' (length=11) 2 => string '14 h 35 min' (length=11) 3 => string '22 h 7 min' (length=10) CODE : https://github.com/Ewwe/WorldOfTrucks
×
×
  • Create New...