Je to div, ale z bezpečnostních důvodů je celkem komplikované vygenerovat formulář s náhodným záznamem z databáze. Resp. formulář vygenerujete, ale po odeslání se špatně vyhodnocuje. Důvodem je, že Nette sestavuje formulář dvakrát. Continue reading Nette a přidání náhodně generovaných záznamů z databáze do formuláře
Tag: triky
Automatické testování bezpečnosti vašeho WordPress webu
Občas se ve vodách www nalezne zajímavý a užitečný nástroj. Pro testování bezpečnosti Vaší WP stránky jsem nalezl nástroj, který vám pomůže najít bezpečnostní chyby vašich WordPress webů a navrhne vám i možnosti řešení. Aplikace je na stránkách WEBSECURIFY.
Problém fulltextovým vyhledáváním
Při pokusu implementovat fulltextové vyhledávání via MySQL InnoDB jsem narazil na problém. Vyhledávání se aplikovalo pouze na jeden sloupec databáze.
Má funkce v modelu, kterou jsem udělal podle návodu od Martina Zlámala vypadá takto:
public function search($search) { $where = ""; //$ft_min_word_len = mysql_result(mysql_query("SHOW VARIABLES LIKE 'ft_min_word_len'"), 0, 1); $ft_min_word_len = 4; preg_match_all("~[\\pL\\pN_]+('[\\pL\\pN_]+)*~u", stripslashes($search), $matches); foreach ($matches[0] as $part) { if (iconv_strlen($part, "utf-8") < $ft_min_word_len) { $regexp = "REGEXP '[[:<:]]" . addslashes(strtoupper($part)) . "[[:>:]]'"; $where .= " OR (title $regexp OR content $regexp)"; } } return $this->database->table('articles') ->where("MATCH(title, content) AGAINST (? IN BOOLEAN MODE)$where", $search) ->order("5 * MATCH(title) AGAINST (?) + MATCH(content) AGAINST (?) DESC", $search, $search) ->limit(50); } |
Řešení:
Problém byl ,že jsem měl nastavené pouze FULLTEXTOVÉ klíče “title” a “content”. Po přidání FULLTEXTOVÉHO klíče “title, content” byl problém vyřešen.
Podomácku vyrobený přehrávač vinylů
Přehrát vinyl lze jen za použití klasické jehly na šití a obyčejného papíru. Moc jsem tomu nedůvěřoval, ale opravdu to funguje. Toto je můj první nástřel vyrobený z krabice od bot. Časem to doladím a o případný pokrok se zde podělím.
Nette – přístup k databázi bez PDO
Určitě nebudu sám, koho štvou nejrůznější komplikace při přesunu projektu z localu na hosting.
Rád bych se zde podělil o jednu zkušenost, která snad někomu usnadní práci a případně někdo poradí, jak a co udělat lépe.
Tedy problém byl, že na hostingu nebyla knihovna php_pdo_mysql. Na locale ,kde tuto knihovnu mám, mi vše s NetteDatabase jelo v pohodě, ale na locale jsem se nemohl k DB připojit.
Něco jsem pročetl na fórech a zjistil jsem, že snad s dibi by neměl být problém.
Tedy jsem si config.neon a authenticator musel přepsat pro dibi. Zde jsou:
config.neon
common: php: date.timezone: Europe/Prague services: database: class: DibiConnection arguments: [ {driver: %database.driver%, charset: utf8, hostname: %database.host%, username: %database.user%, password: %database.password%, database: %database.dbname%, persistent: true, lazy: true} ] authorizator: class: AclProjSecurityAcl authenticator: class: AclProjSecurityAuthenticator arguments: [@database, %security.salt%] development < common: parameters: database: driver : mysql host : localhost dbname : ... user : ... password: ... security: salt: zb1g7IHt1I production < common: parameters: database: driver : mysql host : localhost dbname : ... user : ... password: ... security: salt: zb1g7IHt1I |
Authenticator.php
db = $dbConnection; $this->passwordSalt = $salt; } public function authenticate(array $credentials) { $email = $credentials[self::USERNAME]; $password = sha1($credentials[self::PASSWORD] . $this->passwordSalt); $user = $this->db ->select('*') ->from('user') ->where('email=%s', $email) ->fetch(); if (!$user) { throw new AuthenticationException("User with login email '$email' not found", self::IDENTITY_NOT_FOUND); } if ($user->password != $password) { throw new AuthenticationException('Wrong password', self::INVALID_CREDENTIAL); } $identity = new Identity($user->id, $user->role); $identity->name = $user->name; $identity->email = $user->email; return $identity; } } |
Snad to pomůže, nakopne, inspiruje a hlavně zkrátí někomu dalšímu ztracený čas. Musel jsem také upravovat všechny dotazy na DB v modelu pro dibi. Nonaštěstí jsem toho neměl moc.
Moc se v tomto neorientuji, tak budu rád za jakoukoliv dobrou radu do budoucna a případnou debatu na toto téma.
Užitečné tipy pro wordpress
Seznam užitečných tipů, které usnadní práci a vývoj v redakčním systému wordpress:
Shortcode
Lze využít pro uživatelské vkládání nejrůznějšího obsahu přímo do postu, stránek.
Nejdříve si v souboru function.php vytvoříme a zaregistrujeme libovolnou funkci, kterou chceme aplikovat a vložit do článku.
function hello() { return 'Hello, World!'; } add_shortcode('nase_fce', 'hello'); |
Následně můžeme naši fci volat při tvorbě příspěvku:
[nase_fce] |
Interakce s DB
Získání záznamů:
<!--?php $posts = $wpdb--->get_results("SELECT ID, post_title FROM wp_posts WHERE post_status = 'future' AND post_type='post' ORDER BY post_date ASC LIMIT 0,4") // Echo the title of the first scheduled post echo $posts[0]->post_title; ?> |
Získání řádku:
<!--?php $posts = $wpdb--->get_row("SELECT ID, post_title FROM wp_posts WHERE post_status = 'publish' AND post_type='post' ORDER BY comment_count DESC LIMIT 0,1") // Echo the title of the most commented post echo $posts->post_title; ?> |
Získání sloupce:
<!--?php $posts = $wpdb--->get_col("SELECT ID FROM wp_posts WHERE post_status = 'publish' AND post_type='post' ORDER BY comment_count DESC LIMIT 0,10") // Echo the ID of the 4th most commented post echo $posts[3]->ID; ?> |
Získání konkrétní hodnoty:
<!--?php $email = $wpdb--->get_var("SELECT user_email FROM wp_users WHERE user_login = 'danielpataki' ") // Echo the user's email address echo $email; ?> |
Vložení dat do DB:
$wpdb->insert( $table, $data, $format); |
Vložení dat do DB ukázka:
<!--?php $wpdb--->insert($wpdb->usermeta, array("user_id" => 1, "meta_key" => "awesome_factor", "meta_value" => 10), array("%d", %s", "%d")); // Equivalent to: // INSERT INTO wp_usermeta (user_id, meta_key, meta_value) VALUES (1, "awesome_factor", 10); ?> |
Update dat v DB
$wpdb->update( $table, $data, $where, $format = null, $where_format = null ); |
Update dat v DB ukázka:
$wpdb->update( $wpdb->posts, array("post_title" => "Modified Post Title"), array("ID" => 5), array("%s"), array("%d") ); |
Vložení vlastního loga na loginpage
add_action( 'login_head', 'ilc_custom_login'); function ilc_custom_login() { echo '<style type="text/css"> h1 a { background-image:url('. get_stylesheet_directory_uri() . '/images/login-logo.png' . ') !important; margin-bottom: 10px; } padding: 20px;} </style> <script type="text/javascript">window.onload = function(){document.getElementById("login").getElementsByTagName("a")[0].href = "'. home_url() . '";document.getElementById("login").getElementsByTagName("a")[0].title = "Go to site";}</script>'; } |
Změna počtu skov v excerpt funkci
add_filter('excerpt_length', 'ilc_excerpt_length'); function ilc_excerpt_length( $length ){ return 10; } |
WordPress – pár užitečných triků pro vykreslování smyček s posty
Posty publikované mezi daty
Chcete-li zobrazit posty vytvořené v určitém časové rozmezí, použijte následující smyčku:
<!--?php function filter_where($where = '') { $where .= " AND post_date -->= '2012-04-18' AND post_date <= '2012-05-01'"; return $where; } add_filter('posts_where', 'filter_where'); query_posts($query_string); while (have_posts()) : the_post(); the_content(); endwhile; ?> |
Posty s náhledem prvního obrázku v článku
Nejdříve si do souboru function.php vložíme funkci, která nám vrátí link na první obrázek v článku:
function catch_that_image() { global $post, $posts; $first_img = ''; ob_start(); ob_end_clean(); $output = preg_match_all('//i', $post->post_content, $matches); $first_img = $matches [1] [0]; if(empty($first_img)){ //Defines a default image $first_img = "/images/default.jpg"; } return $first_img; } |
Následně můžeme naší fci volat ve smyčce:
<!--?php if (have_posts()) : while (have_posts()) : the_post(); ?--> <a class="img-loop" title="<?php the_title(); ?>" href="<?php the_permalink();?>"> <img src="http://www.remake.cz/blog/wp-content/uploads/images/<?php echo catch_that_image() ?>" alt="<?php the_title(); ?>" /> </a> endwhile; endif; ?> |