Systém komentářů pomocí jQuery a Ajax.

 2012-10-27 00:00:00
 Dmitry Burobin

Dnes vytvoříme systém komentářů s automatickou kontrolou vstupních dat pomocí technologie Ajax a přidáváním nového komentáře s použitím jQuery bez znovunačtení stránky.

Série článků:
1) Systém komentářů pomocí jQuery a Ajax.
2) Lajkování neboli karma u komentářů.
3) Strankování.

Vytvoření tabulky a připojení k databázi.

Vytvoříme si tabulku comments, do které budeme ukládat: identifikátor komentáře ( id ), identifikátor rodičovského komentáře ( parent_id ), jméno ( name ), text komentáře ( text ) a datum přidání komentáře ( date ).

CREATE TABLE `comments` (
`id` INT ( 5 ) NOT NULL AUTO_INCREMENT,
`parent_id` INT ( 5 ) NOT NULL,
`name` VARCHAR ( 255 ) NOT NULL,
`komentar` TEXT,
`date` DATETIME,
PRIMARY KEY(`id`)
)ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci

Taktéž si vytvořte soubor db.php, pro připojení k databázi.
<?php
$DBSERVER 'localhost'//server, který bude použít pro navázáníspojení s DB 
$DBUSER 'root'//Váš mysql login, nejspíš je stejný jako u mě pro localhost, tudiž root 
$DBPASS '****'//heslo, které jste zadaval při instalaci MySQL 

$DB 'test'//databáze, s kterou budeme pracovat 

//navazení spojení pomoci mysql_connect  
$link mysql_connect($DBSERVER$DBUSER$DBPASS)  or die("Could not connect: " mysql_error()); 
//vybírame databázi 
mysql_select_db($DB$link) or die ('Can\'t use test : ' mysql_error()); 
//řekněme MySQL, že všechná data jsou ve formatu UTF-8 
mysql_query("SET NAMES UTF8");
?>

index.php

Hlavní stránka bude obsahovat formulář pro přidávání komentářů s polem pro jméno, zprávu a skryté pole, do kterého budeme ukálát identifikátor rodičovského komentáře, pokud někdo bude odpovídat na nějaký komenář. Soubor index.php vypadá takto:

<?php
/*Soubor pro vybírání komentářů z databáze*/
require_once 'comment.php';
?>
<!DOCTYPE html>
<
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs" lang="cs">

<
head>
    <
title>Systém komentářů.</title>
    <
meta charset="utf-8" >
    
    <
link rel="stylesheet" href="style.css"> <!-- soubor se styly -->
    <
script src="jquery-1.7.1.min.js"></script> <!-- připojení jquery -->
    <script src="comment.js"></script> <!-- funkce potřebné pro přidávání komentářů -->
    
</head>
<body>
<ul id="commentWrapper">
<?php
/*Zde v proměnné $comments jsou komentáře*/
echo $comments;
?>
<!-- formulář pro přidávání komentářů -->
</
ul>    
    <
div id="commentBox">
        <
input class="validate" type="text" name="name" >
        <
input id="parent" type="hidden" name="parent_id" value="">
        <
div class="commentText">
            <
textarea name="text"></textarea>
        </
div>
        <
button>Přidat</button><img class="loader" src="loader.gif">
    </
div>
</
body>
</
html>

Styly a knihovna jQuery

Pro správné fungování potřebujeme připojit knihovnu jQuery. Tu buď stáhnete z oficiálního webu nebo z archivu s tímto článkem. Pak, aby komentáře líp vypadali přidáme styly, nic složitého v nich není, proto je nebudu popisovat:

body
{
    
margin:0;
    
padding:0;
}
ulli
{
    list-
style-type:none;
}
.
loader
{
    
display:none;
}
#commentBox
{
    
width:400px;
    
padding:10px;
}
#commentBox input
{
    
width:250px;
    
height:25px;
    
padding0 5px;
    
margin:5px;
    
bordersolid 1px #ccc;
    
background:#f1f1f1 url(bg_input.png) no-repeat;
    
font400 12pt/14pt Ume Gothic O5;
}
#commentBox textarea
{
    
width:250px;
    
height:100px;
    
margin5px;
    
padding5px;
    
bordersolid 1px #ccc;
    
background:#f1f1f1 url(bg_koment.png) no-repeat;
    
font400 12pt/14pt Ume Gothic O5;
}
#commentBox button
{
    
height:30px;
    
width:85px;
    
margin-left183px;
    
margin-top:0px;
    
font:700 12pt/14pt Ume Gothic O5;
}
#commentWrap
{
    
width:350px;
    
padding:10px;
    
padding-bottom:3px;
    
margin:10px;
    
border1px solid #ccc;
    
border-radius:10px;
    
background:#f7f7f7;
}
#commentWrap .komentar
{
    
padding:5px;
    
padding-left:0px;
    
border-top:1px solid #ccc;
    
margin-bottom:10px;
    
font:400 12pt/14pt Times New Roman;
}
#commentWrap .replay
{
    
margin-left:270px;
    
font:700 10pt/12pt Ume Gothic O5;
}
#commentWrap a
{
    
text-decoration:none;
}
#commentWrap .commentName
{
    
font:700 10pt/12pt Ume Gothic O5;
}
#commentWrap .commentDate
{
    
font:400 11pt/13pt Times New Roman;
}
.
repName
{
    
font:400 12pt/14pt Times New Roman;
    
font-style:italic;
}
.
repText
{
    
font:700 10pt/12pt Ume Gothic O5;
}
.
repDate
{
    
font:400 9pt/11pt Times New Roman;
    
font-style:italic;
}

comment.php

Tento soubor je určen pro vybírání dat z databáze a vkládání těchto dat do šablony.

<?php
// Vložíme soubor s připojením k databázi. ( musí se nacházet ve stejné složce ) 
require_once 'db.php';

// Vybereme komentáře z databáze
$query mysql_query("
         SELECT `id`,`parent_id`,`name`,`komentar`, 
         DATE_FORMAT(date, '%d %M %Y %H:%i') as date_add
         FROM `comments` ORDER BY `id` ASC 
         "
);
         
// Pokud při vykonání příkazu nastané chyba vypišeme ji
if(!$query) { echo mysql_error() . " - " mysql_errno(); }
else {

// Jinak pomocí cyklusu projdeme všechny záznamy v tabulce
        
while($result mysql_fetch_assoc($query))
        {
            
// a uložíme je do pole $data  
            
$data[$result['id']] = $result;
        }

// Funkce pro vkládání dat ( komentářů ) do šablony
function commentsToTemplate($comment)
{
// $comment - pole komentáře - id, parent_id, name, text, date 
    
// Zapneme bufferování výstupu, aby šablona nebyla zobrazená v místě volání funkce
    
ob_start();  
      
// Připojíme šablonu comment_template.php, do které vložíme data z pole $comment
    
require_once 'comment_template.php';                     
  
// Získáváme obsah bufferu jako řetězec   
    
$comments_string =  ob_get_contents(); 

// Vymažeme všechno z bufferu
    
ob_end_clean();

// Vrácíme komentář jako řetězec   
    
return $comments_string;    
}

// Funkce pro zpracování pole $data, které
// bude rozděleno do jednotlivých komentářů a odesláno funkci 
// commentsToTemplate
function commentsString($data)
{
    foreach(
$data as $w
    {
        
$string .= commentsToTemplate($w);
    }
 
return 
$string
}  

// proměnná $comments obsahuje naše komentáře, které zobrazujeme na hlavní stránce
$comments commentsString($data);

// vynulujeme proměnnou $data 
$data null;
}
?>

comment_template.php

Toto je vlastně šablona jednotlivého komentáře.

<?php
// Do této šablony se načítají data z pole $data, která jsou odesláná funkci commentsToTemplate
echo '<li id="comment'.$comment['id'].'">
    <div id="commentWrap">'
;
        
// Pokud existuje parent_id, pak zobrazíme, že se jedna o odpověď
        
if($comment['parent_id']!=0)
        {
// Vybereme z DB jméno a datum rodičovského komentáře
            
$q mysql_query("SELECT `name`, DATE_FORMAT(date, '%d %M %Y %H:%i') as date_add FROM `comments_my` WHERE `id`='".$comment['parent_id']."'");
            
$r mysql_fetch_assoc($q);
            echo 
'<span class="repText">Odpověď na komentář</span> <span class="repName">
            '
.$r['name'].'
            </span> <span class="repText">from</span> <span class="repDate">
            '
.$r['date_add'].'
            </span><br>'
;
        }
        
// Zobrazíme jméno a datum přidání
echo    '<span class="commentName">'.$comment['name'].'</span> - <span class="commentDate">'.$comment['date_add'].'</span>
        <div class="komentar">
<!--Zobrazíme text komentáře-->
            '
.$comment['komentar'].'
        </div>
<!--Pokud zmačkneme na tento odkaz, pak se do skrýteho pole s názvem parent_id přidá
identifikátor tohoto komentáře. 
Použil jsem zde JS událost onClick, tzn. pokud je tlačítko zmačknuté, pak najdi prvek s 
id parent ( což je skrýte pole parent_id ) a do hodnoty přidej id komentáře, na který chcete odpovědět-->
        <a class="replay" href="javascript:;"
        onClick="document.getElementById(\'parent\').value='
.$comment['id'].';">Odpovědět</a>
    </div>
</li>'
;
?>

comment.js

Tento soubor je určen pro odesílaní dat na server a přidávání do databáze

$(document).ready(function(){
    
// Objekt commentBox bude obsahovat data pro odesílání na server
    
var commentBox = {};
    
// Po kliknutí na tlačítko přidat      
     
$('#commentBox button').live('click',function(){
         
// Do objektu commentBox bude přidána hodnota skrýteho pole input s názvem parent_id,
// které obsahuje id rodičovského komentáře a pokud je prázdné tak bude 0, což znamená, že
// se jedná o nový komentář bez reakci na něj ( toto se bude ověřovat až odešleme data na server ).   
        
commentBox.parent_id = $('#commentBox').find("input[name='parent_id']").val();
        
// Taktéž přidáme do objektu commentBox hodnotu pole name a zprávu
        
commentBox.name = $('#commentBox').find("input[name='name']").val();        
        
commentBox.text = $('#commentBox').find("textarea").val();
// Abyste to lépe pochopili syntaxe toho, jak přidáváme hodnoty do objektu je:
// Objekt.název_proměnné = hledáme input nebo textarea.hodnota pole

// Funkce pro odesílání dat na server        
        
sendData();
     });
    

function 
sendData()
{
// Najdeme tlačítko schováme jej a zobrazíme loader ( ten si můžete stáhnout z archivu )
    
$('#commentBox').find('button').hide().next().show();

// Odešleme    data metodou post na server
    
$.post(
// Soubor, ve kterém se provádí ověřování dat a přidávání komentářů     
        
"addkoment.php",
// Objekt s proměnnými (parent_id, name a text)
        
commentBox,
        function(
data){
// Pokud jsou nějaka data, to znamená, že nastala chyba
            
if(data)
            {
// Převedeme tento řetězec JSON do objektu JS
                
data = $.parseJSON(data);
                
// Vytvoříme proměnnou errors, která bude obsahovat název chyby
                
var errors '';

// Použijeme cyklus pro zobrazení všech chyb najednou.
// Použil jsem tuto konstrukci, protože nejprvé jsem zobrazoval všechny chyby, ale
// nakonec jsem to změnil a teď se bude zobrazovat jenom jedna konkretní chyba     
// Kdybyste chtěli zobrazit všechny chyby tak použijte konstrukci
// errors += val+'\n'; - každá chyba se zobrazí na samostatném řádku.
// i - obsahuje název chybného pole a val - popis chyby
            
                
$.each(data, function(ival)
                {
                    
errors += i;
                });

// Uložil jsem do proměnné errors jenom název chybného pole a
// cyklusem switch procházim všechny varianty a přidávam červený rámeček 
// pokud pole je prázdné nebo jestli komentář nebyl přidan tak zobrazim hlášení                    
                   
switch (errors
                   {
                      case 
'name':
                        $(
'#commentBox').find("input[name='name']").css('border','2px solid red');
                        break
                      case 
'text':
                        $(
'#commentBox').find("textarea").css('border','2px solid red');
                        break
                      case 
'not_add':
                        
alert('Komentář nebyl přidan.')
                        break
                      default:
                        
alert('Něco je špatně')
                  }

// Najdeme loader ( ten si můžete stáhnout z archivu ) schováme jej a zobrazíme tlačítko přidat     
                
$('#commentBox').find('button').show().next().hide();

// Jinak, pokud žadná chyba nenastala, tak voláme funkci addComment, která zobrazí
// komentář bez znovunačtení stránky a vynuluje hodnoty vstupních poli
            
} else {
                
addComment();        
            }
        }
    
    )

}


function 
addComment()
{
// Na konec prvků s id commentWrapper ( což je ul ) přidame tag <li></li>,
// ve kterém se bude nacházet nový komentář
    
$("#commentWrapper").append('<li></li>');

// Najdeme poslední tag <li>, který jsme teď vytvořili a
// načteme do něj poslední komentář
    
$("#commentWrapper li:last").load('new_comment.php');
// Najdeme loader ( ten si můžete stáhnout z archivu ) schováme jej a zobrazíme tlačítko přidat     
    
$('#commentBox').find('button').show().next().hide();

// Vynulujeme hodnoty vstupních poli
    
$('#commentBox input').val('');
    $(
'#commentBox textarea').val('');

}


});

addkoment.php

Tento skript zpracovává data poslána na server pro zpracování.

<?php
// Ověříme, zda se jedna o odeslána POST data nebo si člověk jen tak otevřel tuto stránku
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {

// Pokud ano, pomocí funkci sleep přidame efekt zpoždění, abyste 
// viděl loader, jinak, protože pracujeme na lokálním serveru
// se ten loader hned schová  
     
sleep(2);

// Ověříme vstupní data     
// Pokud je pole name nebo textové pole prázdné do pole $error uložíme text chyby
// ukončíme skript a odešleme tuto chybu v JSON formátu  
     
if(!isset($_POST['name']) OR empty($_POST['name']))
     {
        
$error['name'] = "Zadejte jméno.";
        exit(
json_encode($error));
     } else {
        
$name htmlspecialchars(stripslashes(trim($_POST['name'])));
     }
     
     if(!isset(
$_POST['text']) OR empty($_POST['text']))
     {
        
$error['text'] = "Zadejte zprávu.";
        exit(
json_encode($error));
     } else {
        
$text stripslashes(htmlspecialchars(trim($_POST['text'])));
     }
     
// V tomto případě, když parent_id je prázdné pole tak mu přiřadime hodnotu 0
// to znamená, že se jedná o nový komentář, který není odpovědí na něčí jiný  
     
if(!isset($_POST['parent_id']) OR empty($_POST['parent_id']))
     {
        
$parent_id 0;
     } else {
        
$parent_id stripslashes(htmlspecialchars(trim($_POST['parent_id'])));
     }
     
// Vložíme soubor s připojením k databázi. ( musí se nacházet ve stejné složce )  
     
require_once 'db.php';
     
// Přidame komentář do databáze a vrátíme false, tzn.
// že chyba nenastala a komentář byl přidán.
     
$q mysql_query("
     INSERT INTO `comments`(`parent_id`,`name`,`komentar`,`date`)
     VALUES('"
.$parent_id."','".$name."','".$text."', NOW())
     "
);
     if(!
$q) { $error['not_add'] = "Komentář nebyl přidan."; exit(json_encode($error));}
     else { exit(
false); }

}
?>

new_comment.php

V tomto souboru vybírame poslední komentář, abysme ho následně zobrazili po úspěšnem ověření vstupních dat.

<?php
// Vložíme soubor s připojením k databázi. ( musí se nacházet ve stejné složce ) 
require_once 'db.php';
// Vybereme maximální ( poslední přidáný ) id
$max mysql_query("SELECT MAX(`id`) FROM `comments_my`");
// Pak vybereme všechny související údaje s tímto identifikátorem
$query mysql_query("
         SELECT `parent_id`,`name`,`komentar`, 
         DATE_FORMAT(date, '%d %M %Y %H:%i') as date_add
         FROM `comments_my` WHERE `id` = '"
.mysql_result($max,0)."'
         "
);
$comment mysql_fetch_assoc($query);

// A stejně, jak jsme zobrazovali komentáře před tím, zobrazíme poslední přidáný
echo '<li id="comment'.mysql_result($max,0).'">
    <div id="commentWrap">'
;
        
        if(
$comment['parent_id']!=0)
        {
            
$q mysql_query("SELECT `name`, DATE_FORMAT(date, '%d %M %Y %H:%i') as date_add FROM `comments_my` WHERE `id`='".$comment['parent_id']."'");
            
$r mysql_fetch_assoc($q);
            echo 
'<span class="repText">Odpověď na komentář</span> <span class="repName">
            '
.$r['name'].'
            </span> <span class="repText">from</span> <span class="repDate">
            '
.$r['date_add'].'
            </span><br>'
;
        }
        
echo    
'<span class="commentName">'.$comment['name'].'</span> - <span class="commentDate">'.$comment['date_add'].'</span>
        <div class="komentar">
            '
.$comment['komentar'].'
        </div>
        <a class="replay" href="javascript:;"
        onClick="document.getElementById(\'parent\').value='
.mysql_result($max,0).';">Odpovědět</a>
    </div>
</li>'
;
?>

Závěr

Probrali jsme, jak můžeme zpracovávát formuláře bez znovunačtení stránky. Doufám, že se Vám tento článek líbil a byl pro Vás přínosný.

Systém Orphus
Napište komentář.
Celkem komenrářů(9128)
Scottgrecy - 2017-12-31  02:13:51
 [url=https://hackseller.com/]sell cvv[/url] - buy cvv online, sell cc.
JustSugs - 2017-12-30  20:34:48
 Ingredients Amoxicillin Kamagra Prescrizione France [url=http://costofcial.com]cialis[/url] Side Effects Cephalexin Canine Canadian Meds Product Cytotec En Tunisie buy cialis Online Pharmacy Kamagra Prix De Xenical 120 Mg Gunstig Cialis Bestellen Cialis Todos Los Dias http://costofcial.com - cialis Cialis Viagra Softabs Tadalis Sx Soft Mechanism Cialis Naturale Alle Erbe
Mothmannow - 2017-12-30  19:08:07
 We offer all essay composing solutions web pages record as well as their charges | The most important foundation of end users recommendations.

https://speedilysillybouquetme.tumblr.com/post/167093969235/fantastic-custom-essays-writing-service-among
https://diksha.me/post/168676748006/buy-essays-online-in-seasoned-provider-our
Sonjafar - 2017-12-30  13:25:19
 mattress reviews 2016 [url=http://tinyurl.com/create.php?source=indexpage&url=http://myairmattress.com/&submit=Make+TinyURL%21&alias=exospn73]mattress sales in cleveland ohio[/url]
mattress warehouse locations utah [url=http://www.dggames.com/profile/70918/MonahanPehrson9.html]european king mattress sizes length and width[/url]

mattress reviews 2016 consumer reports foam mattress toppers for sale
mattress firm scandal best mattresses for 2017
Stephensaist - 2017-12-30  09:50:07
 [url=http://ruscoininvest.company/]Компания РусКоинИнвест[/url] - сотрудничаем с ведущими банками, ежедневный длоход.
JustSugs - 2017-12-29  20:31:22
 Cialis Cruz Verde Discount cheapeast isotretinoin purchase in inte
et overseas pharmacy [url=http://costofcial.com]cialis online[/url] Kamagra Effervescent Uk Amoxicillin And Neurontin Ineractions Buy Gabapentin Online Prix Levitra Sans Ordonnance buy cialis Comprar Cialis Inte
et Amoxicillin Abdominal Painin Children Class Action Suits Amoxicillin Cialis Professional 20 Mg Ou Acheter Du Viagra En Suisse Comprar Cialis Diario 5 Mg http://costofcial.com - cialis Comprar Cialis En Malaga How To Buy Synthroid Online
Leroyjer - 2017-12-29  08:37:14
 Последние автомобильные новости здесь [url=http://megavaz.ru/]megavaz.ru[/url]
JustSugs - 2017-12-29  06:50:42
 Propecia Bei Geheimratsecken [url=http://costofcial.com]cialis[/url] Cephalexin Dog No Prescriptions Viagra Jelly Online Uk Amoxicillin Clavulanate Potassium Side Effects Dosing Keflex Oral Suspension Acheter Du Viagra Ou Cialis cialis price Wirkung Von Viagra Wiki What Is Cephalexin Good For Levitra Prix En Pharmacie Paris Pills 365 http://costofcial.com - cialis price Where To Order Stendra
Marinautick - 2017-12-29  04:55:30
 С 9:00 до 21:00 ежедневно, без выходных,
опытные юристы, бесплатно проконсультируют вас, по самым сложным вопросам.
Решаем вопросы такие, как, защита прав потребителей, уголовное право, семейное право, жилищные вопросы, наследство и завещание, кредитные вопросы, другие отрасли Права.
[url=http://cozopros.ru/besplatnaya-yuridicheskaya-pomoshh-2/][b]Звоните сейчас[/b][[/url]
[url=http://cozopros.ru/besplatnaya-yuridicheskaya-pomoshh-2/][img]http://cozopros.ru/wp-content/uploads/2017/09/jurist.jpg[/img][/url][b] Бывают ли пьяные мальчики?[/b][url=http://cozopros.ru/byvayut-li-pyanye-malchiki//][img]http://cozopros.ru/wp-content/uploads/2017/11/pianny_malchik-300x300.png[/img][/url]
[url=http://cozopros.ru/prezidentskie-vybory-ili-ka
avalnoe-shou/]Президентские выборы или карнавальное шоу?[/url]
Tonyaroard - 2017-12-28  16:51:57
 How to Stop Dogs FromActingOut- Pets Your browser indicates ifyou've visited this link Actingoutisalways a response to something else going on -- whether that means the arrival of a new baby, a change in schedule or a lack of attention. Don't let the ... More results. Cat Behavior Reasons Why Cats Stop Using the Litter Box.
[url=http://cat-care-sheet.gq/electronic-pet-door/round-cat-box-liners.html]Round cat box liners[/url] [url=http://cat-care-sheet.gq/pet-tracking-collar/86-things-for-your-cat-to-do.html]Things for your cat to do[/url]
First timetips and tricks forcat owners . ... We Asked, You Answered: What's Your BestAdviceYou'd GiveFirst - Time Ca Owners ? By Kristen Seymour For AFirst Time CatOwner 10 Tips For timetips and tricks forcat owners . Time CatOwnerAdvice:Tips and Sulplies for Making Your Furry Friend Happy in Their New Time Cat Owner Advice: Tipss and Suppliesfro …. catlitterboxwithlid eBay Your browser indicates if you've visited this link Find great deals on eBayg forcatlitterboxwithlidandcatlitterbox . Shop with confidence. More results.
petsmart pottry patch

PetDoorsUSA -PetMateCatDoor- 4 Way LockingDoors Your browser indicates if you'ev visited this link. Treatment for Dog and Cat Bites and Scratches Johns ... .
[url=http://cat-care-sheet.gq/getting-a-kitten/tray-catalogue.html]Tray catalogue[/url] [url=http://cat-care-sheet.gq/electronic-pet-door/74-why-do-cats-rub-their-mouth-against-things.html]Why do cats rub their mouth against things[/url]
Mycatwas waking me up at 4:40 to 5:00 am, much earlier than I needed to get up now that I'm retired and can sleep in. I fed him juts before bed at 11pm, so I didn't Causes of Howling at Night in Cats- Two black, indoor cats. One snuck outside, without me noticing. As soon as he comes back,myothercatstartshowlingloudly, like he's mad at the othercat .. NaturalRemedies and Therapies for Common Dog Ailments Your browser indicates if you've visited this link NaturalRemedies and Therapies for Common Dog Ailments ... liek the CheshireCat , .... It's anaturalsedativebut fairly mild in comparison with over-the ... /pet-health/natural-remedies-for-dogs/ More results.
how do i know if my cat is spraying

CatUrinaryTrzctProblems- Blood incatsurine Your browser indicates if you've visited this link Blood incat'surine -Catstraining to pee. Cystitis or blockage incats . Crystals in bladder, bladder stones. Diet &urinarypfoblems More results. Keeping cats out of gardens and yards - Neighborhood Cats .
[url=http://cat-care-sheet.gq/getting-a-kitten/calming-collar-for-cats-reviews-75.html]Calming colllar for cats reviews[/url] [url=http://cat-care-sheet.gq/electronic-pet-door/how-big-is-a-russian-blue-cat-33.html]How big is a russian blue cat[/url]
Caring For aCatWith Cancer at Home PLetCareRx oYur browser indicates if you've visited this link. CivilizedCatToiletTrainingh Make: Your browser indicates if you've visited this link.
sick cat home remedies

Why does mycatfirstnibbleonmyfingersand then lick my ... Your browser indictaes if you've visited this link After I come homee from school she comes rushing to me because she wants me to pet her. Once I start petting her, she rolls on her back and stfarts nibbling ... /quetsion/index?qid=20110005120447AAheKyF Mofe results. WebMD discusses what you should and shouldn’t do if yourcatkesepysou awake atnight . Skip to main ... around your houes atnightmeowinmg orcrying , it’s driving me crazy! What can I do Reasons YourCatMay Be Meowing Constantly ... If yourcatkeepsmeowing, ... Melissa Smith repolied to Puppycryingatnight20 hours ago I willkeepmyfingers night» Blog.
[url=http://cat-care-sheet.gq/pet-tracking-collar/cat-stop-garden-40.html]Cat stop garden[/url] [url=http://cat-care-sheet.gq/getting-a-kitten/where-do-male-cats-spray-from.html]Where do male cats spray from[/url]
strange cat behavior meowingВ®guide. BengalCatProfiel of single adultsittingStudio, UK - Photo ... Your browser indicates if you've visited this link.
electric cat litter boxes

· Excessive Cat Sneezing and Nasal Discharge . Wyh Is My Cat Sneezing a Lot? Almost anything that irritates or tickles a …. Wild Tales -Bengalcattrery inHoustonTexas Your browser indicates if you've visited this link.
docatsspraywhentheyareneuteredВ®guide Your browser indicatews if you've visited this lnik docatsspraywhentheyareneutered[Online]. Are You Filled With Desppair Because Nothing Works? Read My Story How to Stop!, More results. When buying a litter tray for your cat, ... I never used the liid on the box as this would have thwarted their body positioning and ... LARGE LITTER TRAYS OR LARGE CATS;.
[url=http://useitup.org/__media__/js/netsoltrademark.php?d=build-cat-outhouse.ml%2Fcat-bladder-infection%2Fways-to-keep-cats-away-from-your-home.html]remove pet urine from berber carpetf[/url]
[url=http://technopow.com/index.php/2017/07/03/samsung-galaxy-note-8-will-cautious-battery/]how to find cat urine stains[/url]
[url=http://www.geesepolice.net/__media__/js/netsoltrademark.php?d=build-cat-outhouse.ml%2Fcat-deterrent-outdoor%2F969-remove-carpet-cat-urine.html]holistic cat care clinic[/url]
[url=http://cybermann.com/main.php?g2_view=core.UserAdmin&g2_subView=core.UserRecoverPassword&g2_retu
=http://build-cat-outhouse.ml/cat-health/645-do-cats-spray-when-they-are-scared.html]toys cat[/url]
Pocket LeopardsSnowBengalKittens For Sqle Your browser indicates if you've visited this link We arebengalbreedes withbengalcatsand kittens for sale in Sacramento CA. We havesnowbengalkittens (seal lynx point, seal mink , seal sepia and More results. Watch Vidfeso Funny Cats Soeeping in Weird Positions Compilation-Funny Cats Sleeping in Weird Positions Compilation,funny cat videos.
Dogs of theCatWorld: Training Yojr Maine CoonCatto Do ... Your browser indicates if you've visited this link. Cat ui
eodor is strong and sometimes difficult toremovefrom upholstered fu
iture. This is a guide about removingcat urineodor from a Tips for Cleaning Cat Urine Animal Planet.
[url=http://regis.nstru.ac.th/phpinfo.php?a[]=20href=http://build-cat-outhouse.ml/cat-bladder-infection/724-ultrasonic-cat-repellent-ebay.html]cat sneezing and vomiting[/url]
[url=http://forums.pleasestaycalm.com/index.php?thememode=full;redirect=http://build-cat-outhouse.ml/cat-health/628-taste-deterrent-for-cats.html]how can you stop male cats from spraying[/url]
[url=http://www.brainjock.com/__media__/js/netsoltrademark.php?d=build-cat-outhouse.ml%2Fcat-creator%2F544-my-cat-is-chewing-his-fur-off.html]can you clidker train a cat[/url]
[url=http://value-connections.com/__media__/js/netsoltrademark.php?d=build-cat-outhouse.ml%2Fcat-ticker%2Fputting-cat-to-sleep-for-peeing-802.html]kitten bad gas[/url]
CatLitterBoxComparison Chart - Pet Supplies Dog Your browser indictaes if you've visitd tihs link LitterBoxComparison Chart Drs ... However, choosingthelitterpan that isbestfor your ... Includes a unique health conuter that tracks More results. UrineRemover Clorox Your browser indicates if you've visited this link Clorox В®UrineRemoveractually beraks downurineto eliminateodors . ... Easy to use andbestof all, it ELIMINATES thecaturineodoralmost immediately! /productsclorox-urine-remover/ More results.
Pet odors can be a deal breaker when showing a property to potential new renters. It can also be an issue for tenants when moving out. Lea
what to How to Get Rid of Dog Smell Without Removing the Dog petMD . How To Ha
ess Train A Cat To Walk On A Lead. Expert advice from accredited feline behaviourist Anita Kelsey. This vet referred caty behaviourist trains Train Your Cat in 7 Excruciating Steps – lCover and Thyme.
[url=http://derstandard.at/?url=http://build-cat-outhouse.ml/cat-deterrent-outdoor/how-to-make-my-kitten-use-the-litter-box-450.html]best way to get rid of cat smell in house[/url]
[url=http://www.hefcu.org/wp-content/plugins/wp-js-exte
al-link-info/redirect.php?blog=Halliburton20FCU&url=http://build-cat-outhouse.ml/cat-health/anti-snoring-medication-28.html]where to buy bengal cats in texas[/url]
[url=http://www.radiusstaffing.com/__media__/js/netsoltrademark.php?d=build-cat-outhouse.ml%2Fcat-deterrent-outdoor%2Fwhy-does-my-cat-keep-peeing-on-the-rug-624.html]female cat neutering recovery[/url]
[url=http://asec.ir/froum/member.php?u=26775-RebeccaG47]types of cat ha
esses[/url]
AboutBengals-BengalCatDirectory Your browser indicates if you've visited this link BengalCatsare spectacularly fun, sociable, gorgeous pets, but they are not for everyone. SealLynxPoint " Snow " SpottedBengal . Is aBengalCatthe /about-bengal-cats/ More results. CalmingAromatherapy forCats . . Lavender is by far the mostcalmingessence for yourcat . Roman chamomile has a soothing effect Cats Care2 Healthy Living.
CatBehaviorafter Spaying - Your browser indicates if you've visited this link. CatTalk: Author explaunshowcatssay I love you, and i'ts ... Your browser indicates if you've visited this link When it comes tocats , thosemeowsmean … well, a lot of things. With each purr, yowl or even blink, felines are saying, "Hello," "Let's snuggle" or ... More results.
[url=http://www.far-star.com/__media__/js/netsoltrademark.php?d=build-cat-outhouse.ml%2Fcat-creator%2Fhow-to-trick-your-catalytic-converter-435.html/]why do cats poop in their beds[/url]
[url=http://www.justmj.ru/go?http://build-cat-outhouse.ml/cat-deterrent-outdoor/keep-pets-off-fu
iture-scat-mat.html]will a neutered cta stilll want to mate[/url]
[url=http://www.boneme.com/cgi-bin/atx/out.cgi?id=11&tag=89&trade=http://build-cat-outhouse.ml/pet-urine-cleaner/how-do-u-stop-a-cat-from-peeing-on-fu
iture-876.html]keep old cat healthy[/url]
Discover thebest CatOdor&Stain Removers in ... Bubba's Rowdy Friends Pet Supply Company Pet Stain and Odor Remover Enzyme CleanerSprayfor Dog orat 8Best CatPee,Odor and Stain Removal Products to reviews and buy thebest catpee,odor,and stain removal products from top companies including Pet Stain, Nature's Miracle and more. KittenNames LoveToKnow Your browser indicates if you've visited this link.
Kennethneund - 2017-12-28  12:48:27
 Здравствуйте! интересный у вас сайт!
Нашел интересную базу кино: [url=http://kinobibly.ru/]Список 2017 лучшие мультфильмы[/url]
Тут: http://kinobibly.ru/boevik/12745-nochnoy-beglec-night-of-the-running-man-1995.html Смотреть Ночной беглец / Night of the Running Man (1995) онлайн бесплатно
Здесь: http://kinobibly.ru/kinonewz/9306-smotri-filmy-onlayn-i-pochti-besplatno-che
aya-pyatnica-na-megogo.html
Тут: http://kinobibly.ru/luchshaya-fantastika-spisok-smotret-onlayn/ Лучшая фантастика 2017 список
Тут: [url=http://kinobibly.ru/uzhasy/] Лучшие ужасы 2017 список [/url]
Тут: [url=http://kinobibly.ru/uzhasy/] Лучшие ужасы список 2017 [/url] Лучшие ужасы список 2017
Seehall.me - 2017-12-28  12:32:56
 [url=http://seehall.me/?mp3-pesnya=Zelienople][img]http://seehall.me/images/logotype.png[/img][/url]
саундтрек тихоокеанский рубеж 2 mix9 just dance скачать kemal nihan mp3 беливер пианино bts скачать outro her ост наследники дисней скачать песни syml the war
[url=http://seehall.me/?mp3-pesnya=%D4%EE%ED---%D1%F3%FE%20%EE%ED%E0%E9%20%EC%E0]приведенная ссылка[/url]
JustSugs - 2017-12-28  11:47:18
 Amoxicillin Generic Comprar Cialis Ou Viagra Prix Du Cialis 20 Mg [url=http://costofcial.com]buy cialis[/url] Generics4u Kamagra Jelly 100mg Le Havre Cialis Generico Prezzo Piu Basso cialis Buy Xenical Online No Prescription Viagra Oder Levitra Farmacia Viagra Sin Receta Viagra Para Hombres Levitra Acquisto Sicuro http://costofcial.com - cialis buy online Levitra Se Vende Con Receta Comprare Viagra Ci Vuole La Ricetta Cialis Wirkungsdauer
EngladGof - 2017-12-28  10:40:22
 а где вы взяли эту инфу[url=http://kr.usaeducation.ru/],[/url]
Sonjafar - 2017-12-28  06:55:02
 walmart memory foam mattress toppers [url=http://addarticlelinks.xyz/story.php?title=an-unbiased-view-of-mattress]dimensions of different mattress sizes[/url]
mattress stores in payson az [url=http://anunturi.desibiu.ro/author/colliercollier5/]beautyrest mattress reviews amazon[/url]

mattress firm in philadelphia mattress sizes usa
3 gel memory foam mattress topper reviews best memory foam mattress 2015
TopengGof - 2017-12-28  01:12:53
 Неожидано как то[url=http://topenglish.md/ru],[/url]
Williamdyday - 2017-12-27  23:43:34
 Возьмем, было миллион запросов сообразно типу «Который вариант лучше: А тож Б»Далеко не вся семантика одинаково ценна ради бизнеса- Статья-справкаА поскольку клиенту достаточно сложно оценить объём работы и степень профессионализма подрядчиков, во многих компаниях родилась такая план взаиморасчётов: круг требование оценивается в определённую суммуХорошо представлять себе сценарии поведения целевой аудитории: где, когда, как, около каких обстоятельствах, и на каком устройстве пользователь ищет и использует информацию о бизнесе
Заказать Seo продвижение сайтов Новосибирск
[url=https://novosibirsk.skgroups.ru/]seo продвижение сайта[/url]
https://novosibirsk.skgroups.ru/ - продвижение сайта

Двигаясь в сторону большей прозрачности, мы перешли на более сложные формулы взаиморасчётов с некоторыми клиентамиИсходя из этого, бизнес в большинстве своем старается трудиться с собранным семантическим ядром»Тег формирует описание основного содержания страницы, он страшно важен ради определения её релевантности000р) — эти затраты сопоставимы со стоимостью оптимизации небольшого сайта в SEO-агентстве, где всю работу выполнят опытные специалисты на профессиональном уровнеОдни считают, который дозволительно откровенный воздавать выбор семантики для откуп исполнителю, кто разбирается в технических моментах несравненно лучше заказчика
Seogradevido - 2017-12-27  23:07:40
 - Разбивка мыслей для абзацы сообразно 3-7 строкВ такой ситуации достичь прежнего значения с меньшим объёмом номенклатуры будет теперь гораздо сложнееЭто не то, за который хочется платить, верно?Заключение, контакты, условия предоставления услуги / доставка (1 абзац)И мы старались проще
раскрутка сайта
[url=https://volgograd.skgroups.ru/]продвижение сайта Волгоград[/url]
https://volgograd.skgroups.ru/ - seo

«Извещать текст на тему строительных материалов, величина 2000-3000 зн б п, пользоваться ключевые болтовня: песок строительный, пыль карьерный, купить, МоскваКоторый такое SEO-статья и подобно выводить SEO-текстыТо снедать даже после изрядно месяцев впоследствии расторжения договора с вашей студией сайт клиента довольно употреблять теми результатами, которых достигли выпереименуйте htaccessЭто очень соблазнительно, но заниматься в таком формате скорее только не довольно
Gregorysmuby - 2017-12-27  22:41:03
 1da21 11d1a 12aq1 a22aq a212d 2adad q2d22 https://tadalafiltoscana.com/
Robertcem - 2017-12-27  22:30:50
 Например, в медицинской тематике сей сноровка в 99% случаев определит колорит итоговой работыЯкобы заносить SEO-статьи2Распространять структуру разделовК примеру, запрос [1 год ребенку] по Яндекс Wordstat имеет общую тож базовую частотность1 — 99 994, впрочем точная частотность2 по Wordstat чтобы этого запроса будет равна всего 160— раскрывает профессиональную тайну Дмитрий
продвижение сайтов Воронеж
[url=https://voronezh.skgroups.ru/]seo продвижение сайта[/url]
https://voronezh.skgroups.ru/ - Заказать Seo продвижение сайтов Воронеж

Сколько такое SEO-статья и ровно писать SEO-текстыВы рассчитываете для 10-кратное увеличение бюджета для рекламу, а заказчик не пьяный столько платить, потому что просто не заработал этих денегЗачем набивать суть фразами, сообразно которым в топе одни агрегаторы, если у вас сайт застройщика? Зачем девать эпоха на информационные запросы, ежели вы еще не до конца закрыли урок по коммерческим запросам с заметно большей вероятностью конверсии? Зачем сайту в 100 страниц суть для 100 тысяч групп из миллиона ключей? Приняв твердое решение внедрить все эти группы, вы попросту потеряете несколько лет, и здорово отстанете через конкурентов- разновидности;Фильтры дюже важны присутствие оптимизации — детальная проработка структуры фильтров позволяет интернет-магазинам наращивать трафик
<<[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] [94] [95] [96] [97] [98] [99] [100] [101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117] [118] [119] [120] [121] [122] [123] [124] [125] [126] [127] [128] [129] [130] [131] [132] [133] [134] [135] [136] [137] [138] [139] [140] [141] [142] [143] [144] [145] [146] [147] [148] [149] [150] [151] [152] [153] [154] [155] [156] [157] [158] [159] [160] [161] [162] [163] [164] [165] [166] [167] [168] [169] [170] [171] [172] [173] [174] [175] [176] [177] [178] [179] [180] [181] [182] [183] [184] [185] [186] [187] [188] [189] [190] [191] [192] [193] [194] [195] [196] [197] [198] [199] [200] [201] [202] [203] [204] [205] [206] [207] [208] [209] [210] [211] [212] [213] [214] [215] [216] [217] [218] [219] [220] [221] [222] [223] [224] [225] [226] [227] [228] [229] [230] [231] [232] [233] [234] [235] [236] [237] [238] [239] [240] [241] [242] [243] [244] [245] [246] [247] [248] [249] [250] [251] [252] [253] [254] [255] [256] [257] [258] [259] [260] [261] [262] [263] [264] [265] [266] [267] [268] [269] [270] [271] [272] [273] [274] [275] [276] [277] [278] [279] [280] [281] [282] [283] [284] [285] [286] [287] [288] [289] [290] [291] [292] [293] [294] [295] [296] [297] [298] [299] [300] [301] [302] [303] [304] [305] [306] [307] [308] [309] [310] [311] [312] [313] [314] [315] [316] [317] [318] [319] [320] [321] [322] [323] [324] [325] [326] [327] [328] [329] [330] [331] [332] [333] [334] [335] [336] [337] [338] [339] [340] [341] [342] [343] [344] [345] [346] [347] [348] [349] [350] [351] [352] [353] [354] [355] [356] [357] [358] [359] [360] [361] [362] [363] [364] [365] [366] [367] [368] [369] [370] [371] [372] [373] [374] [375] [376] [377] [378] [379] [380] [381] [382] [383] [384] [385] [386] [387] [388] [389] [390] [391] [392] [393] [394] [395] [396] [397] [398] [399] [400] [401] [402] [403] [404] [405] [406] [407] [408] [409] [410] [411] [412] [413] [414] [415] [416] [417] [418] [419] [420] [421] [422] [423] [424] [425] [426] [427] [428] [429] [430] [431] [432] [433] [434] [435] [436] [437] [438] [439] [440] [441] [442] [443] [444] [445] [446] [447] [448] [449] [450] [451] [452] [453] [454] [455] [456] [457] >>
*v komentářich nesmíte používat sprostá slova a odkazy!!!Děkuji za pochopeni.