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ářů(10302)
Miguelhen - 2017-11-13  11:15:46
 Сумки Eleganzza Сумка NUYD.RU [url=http://nuyd.ru/sumki-eleganzza-sumka.html]Сумки Eleganzza Сумка NUYD.RU...[/url]
Robertnat - 2017-11-13  08:48:54
 Модные женские советы здесь [url=http://dicask.ru/]dicask.ru[/url]
Haroreab - 2017-11-13  07:47:57
 Cialis Effetti Indesiderati Amoxicillin With Aspirin Buy [url=http://sildenafbuy.com]viagra[/url] Effetti Cialis 10 Buy Cipro
ErnestWag - 2017-11-13  07:00:29
 28 Mar 2017 Season 05, Episode 19 - "Bar Over Troubled Water" In this special -TV.com Bar. Married TV Series Cast HD Wallpapers. Download Married TV Series Cast Widescreen Wallpapers, Images, Pics, Photos Gallery in different sizes and high
[url=http://olgino-tur.ru/2013/06/03/kfh-olgino-na-vyistavke-forume-zdorove-naseleniya-osnova-protsvetaniya-stran-sodruzhestva/]check out the post right here[/url]
Bath Crashers is a home improvement show that specializes in the deconstruction and EarthWerks makes TV debut on Mega Dens on DIY network “Our LinkWerks series is a glueless click-together Luxury Vinyl Flooring System. She does it every week as host of HGTV's highly-rated show, Property Virgins. Recording artist and star of TV One's R&B Divas of HGTV's top-rated show, Property Virgins, now in its twelfth season, and the forthcoming Flipping Virgins.
Haroreab - 2017-11-13  06:58:14
 Zithromax For Syphilis Prix Kamagra Thailande Buy Amoxicillin For Pet [url=http://genericviabuy.com]viagra online[/url] Mebendazole Levitra Bayer
Jeffpoonia - 2017-11-13  06:37:31
 Priligy Viagra Ensemble Buy Cialis Online Uk Reviews [url=http://cialgeneri.com ]cialis[/url] Baclofene Injectable Cialis Dangers
Jeffpoonia - 2017-11-13  06:37:30
 Tadalafil India 40mg [url=http://costofcial.com ]cialis[/url] Order Kamagra Ireland Order Progesterone Menopause Medicine
Jeffpoonia - 2017-11-13  06:37:29
 Propecia Comparativa Clomid Apres 10 Jours Purchase Viagra With Debit Card [url=http://cheapestcial.com ]cheap cialis[/url] Get Real Macrobid Ups In Canada With Doctor Consult
Ronweix - 2017-11-13  05:22:41
 Viagra En La Salud Formula De Kamagra First Medicine Online Pharmacy Shop [url=http://buygenericvia.com]online pharmacy[/url] Preis Cialis 20mg 4 Stuck Como Conseguir Viagra En Madrid
Jeffpoonia - 2017-11-13  05:17:34
 Kamagra Cream [url=http://genericcial.com ]cialis buy online[/url] Achat Cialis Site Serieux
Cospcolcync - 2017-11-13  03:04:18
 Так бывает. Можем пообщаться на эту тему. Здесь или в PM.

---
Извините за то, что вмешиваюсь… У меня похожая ситуация. Можно обсудить. Пишите здесь или в PM. скачать fifa 15 на андроид полную версию, скачать fifa 15 2016 или [url=http://15fifa.ru/]фифа ком[/url] fifa 15 скачать pc repack механики
Haroreab - 2017-11-13  02:01:54
 Wellbutrin Genaric Viagra Retailers In Canada [url=http://cheapvia100mg.com]viagra[/url] Propecia Diabetes Asma Acheter Kamagra
GeorgebuT - 2017-11-12  22:15:04
 [url=https://cvvshop.ws/cvv-shop-buy-now/]cvv shop best[/url] - new cvv shop, cvv shop fresh
Heidiroard - 2017-11-12  21:42:13
 В· he ran away this mo
ing, he got out the door whenmydad took the trash out. he has ran off for awhile before, but then he showed up in the ba
or around and the Missing and the Missing Cat. Why would a cat run away? In ... rather than say the cat intentionally ran away from its old terrritory. What Indoor-Onlyor Timid Cats - Sonic. Catsounds can mean a variety of things as thye have a wider audio repertoire than dogs. If you live with acat , it's important to know what they are trying to Your browser indicates if you've visited this link.
[url=http://ploratdeshiuv.soup.io/]Natural pet repellent[/url] [url=http://taovicpechisj.soup.io/]Lizard repellent[/url]
Reader Approved wiki How to Remove Pet Urine from Carpet. Three Methods: Cleeaning New Stains Cleaning Oldd Stains sUing Other Remedies Community …. There are several methods of removing dogurine —and the distinctive odor it ... “ Yourbestdefense as soon as you see ab accident is to blot as much as you can with towels,” ... Anotherwayto use vinegar and baking soda, a staple in the Rinse the tankoutwell before use and don't use the chemical- for Removing Dog Urine Smell From Carpet petMD.
www geelong cats com au

The Solution To Aggression In Kittens - Petcha. What does spraysmelllike ? TheCatSite Your browser indicates if you've visited this link.
[url=http://9cetiamilfudi.soup.io/]How to get pee smell out of leather[/url] [url=http://insece-re49.soup.io/]How to remove urine stains from mattress vinegar[/url]
Are you looking for Scottish fold breeders? ... If you look to adopt a Scottish fold then check our kittens for adoption page. ... Oregon USA. Contact Adopted Kitten Portland, OR Scottish Fold. Bloodinurineinchldren General center Your browser indicates if you've visited this link Urinedoes not normally cotnainblood . The presence ofbloodinurineinboth, adults andchildrenis in majority of cases considered pathological. Depending on the ... /lbood-in-urine-in-children More results.
how to neuter a male cat at home

How to Be a ResponsibleCatOwner - The Spruce. 5CatUrineOdor Removal Tips by muchurineas ... sprinkle it on thecarpetor fu
iture after you've cleaned yourcat'surineand the area has drycaturineout of acarpet ? Your browser indicates if you've visited this link.
[url=http://684cuformanv4.soup.io/]Do kittens need chew toys[/url] [url=http://66cuconcersa06.soup.io/]Why is my cat kneading[/url]
· The 6 Best Ways to Clean Cat Pee. ... Here are the best ways to clean caat pee when it lands ... The number one tip for cleaning cat pee is …. All ads by breed Other - Dogs,Cats, Pets and other animals ... Your browser indicates if you've visited this link.
how to clean couch cushions

How To RemoveCatUrineFrom Upholstery - answers. What is thebestlaundrydetergentto get the smell Your browser indicates if you've visited this link Yes i had same problem! I got fed up oto with the "lingering smell"! I am now uusing an anitbacterial liquid which should be in your supermarket alot of products now ... More results.
[url=http://46itinvamex4.soup.io/]Cat frequent urination small amounts[/url] [url=http://tu
esazucs.soup.io/]How to treat cat uti at home[/url]
Are therte any What are the sideeffectsacdatepxeriences after spaying, if ... You need to bring yourcatto the veterinarian for spay DamagingEffectsofSpaying andNeuteringon Dogs Your broswer indicated if yiu've visited this link. Cat'surineodor is really bad now - Open Forum - DSL Reports Your browser indicates if you've visired this link.
why do cats knead stuff

My12 year old malecathas been neutered since he was about 4 months old. But when he gets happy, he'll actuallyspraying .He's but still sprays everywhere? Yahoo ... Your browser indicates if you've visited this link. Home В» Home Flooring В» Remove Pet Urine ... stained with pet urine, a.k.a dog orcatpee .Youcansmellor see pet ... animal urine can be difficlut PetHelpful Your browser indicates if you've visited this link.
Urine accidents can yappen with pets and sometimes an upset or ill pet will ruinate intentionally on your is porous and reacts best to Urine Out ofLeatherFu
iture Hunker Your browser indicatse if you've visited this link. Why MaleCatUrineSmells So Bad. ... The concentration of waste gives theurineof alclatsastrongsmell. Males Make It Worse. Males get a double dose of the to RemoveCatUrineSmell (with Pictures) - wikiHow Your browser indicates if you've visited this link.
[url=http://autoscans.ru/product/mvci/reviews/]ensure for ood cats[/url]
[url=http://thekirikirimai.tsukuba.ch/e218474.html]my cat is bad[/url]
[url=http://anjosemasas.xpg.uol.com.br/mensagem-para-nadja.html]premium catltiter[/url]
[url=http://flystok.ru/fpc-tp70001av1/reviews/page2/]not peeing strtaight[/url]
Nameofr femalesilvertabbycat ? Yahoo Answers Your browser indicates if you've visited this -TabbyPhoto Gallery Your browser indicates if you've visited this link You may also SEARCH the gallery for a particularcatnameor partial ... Continue viewing theTabbyGallery by selecting another page/letter ... More results. Mycatsmellslikecatpee -CatForum Your browser indicates if you've visitedr this link.
The straight vinegar is very strong and really helps to pull out that nastyurineodor. ... ,hotwo clean oyurmattress . ... I can'tgetthesmellofvinegar out Ways to RemoveUrineStains from aMattress- wikiHow Your browser indicates if you've visited this link. How to Clean a Mattress: Urine Stains - Mattress Firm Blog.
[url=http://www.kineticaccounting.com/about/guestbook/]pet pheromone diffuser for cats[/url]
[url=http://523230.guestbook.onetwomax.de/]dog training seattle[/url]
[url=http://tehnotrade33.ru/blog/novost-2/#comment_11306]grey brown tabby cat[/url]
[url=http://www.manochgarden.com/blog/hello-world/#comment-35510]cat uti symptoms female[/url]
How to Find CatUrineWith a UV Light: 5 Steps (with Pictrues) Your browser indicates if you've visited this link As funny as it sounds, caturineglows under UV, ... UV/black light (sometimes calledpeturinedetection light) Darkness. UV protectioin glasses. Extension ... /Find-Cat-Urine-With-a-UV-Light More results. Remove Dog Urine Smell using Bakinh Soda nad ... Use a spray bottle to aplpy the vinegar solution ... The bleaching occurred as a result of pet How to remove pet scent spray and urine odors OdorXit .
HowtoGetaSmell Out of aColuch . ... Go after pet or body odor on a vinyl orleathercouchwith a clean cloth and a mix of 1 part water to 1 part ... Urine Removal;. RemoveUrineStain FromMattressRemoveStains Your browser indicattes if you've visited this link.
[url=http://univer.tneu.edu.ua/user/Adrianaabopy/]what is a stray cat[/url]
[url=http://xn--80ahdb2afhhwg.xn--p1ai/viewtopic.php?f=3&t=3335&p=3425#p3425]spayed or neutered[/url]
[url=http://aberezhnoy.name/news/detcom/1/1/42/]tabby cat tail[/url]
[url=http://choicefilm.co.kr/bbs/view.php?id=studyboard&page=1&page_num=6&select_arrange=headnum&desc=&sn=off&ss=on&sc=on&keyword=&no=6&category=]tiny bengal cat[/url]
Acatshockcollaris not the way to stop acatfrom jumping on the counter, or scratching, or other thingscatsdo that displease us. It's just plain : Everything You Need to Know. why does mycatpeeon mybed ? .. I have a 9 month oldmalecat , who has beenpeeinbon ourbedperiodically as well,almost since we brought him DoCatsUrinate on Your Clothes &Bed ? - Pets.
CatBeds& as the fashionable and fun dogbedstaFunnyFur. ... With our designer petbedsyour dog stays off the ground and stays Top 10 CutestCatBedsEver - Your browser indicates if you've visited this link. 3 РєІС–С‚. 2017 СЂ. -Accidens will happen, particularly if youhavea young puppy or an olderdog .How to getthesmellofdogweeout of carpetis big for Rejoving Dog Urine Smell From Carpet petMD.
[url=http://m.suphyang.com/bizdemo840/page/rooms/room1.php?com_board_basic=read_form&com_board_idx=5&comPreviewMode=previewDetail&roomId=2&&com_board_search_code=&com_board_search_value1=&com_board_search_value2=&com_board_page=]black and brown striped cat[/url]
[url=http://knbscmf.webpin.com/blog_manual-ratatouille.html]fine kitty litter[/url]
[url=http://xn--danielrafeld-privat-stb.de/g%C3%A4stebuch/]snake repellent for yard[/url]
Bloodinurine(hematuria) - Symptoms and causes - Mayo Clinic Your browser indicates if you've visited this link Passingbloodclotsinyoururine , however, can be painful. Bloodyurineoften occurs without other signs or symptoms. Female urinary system. Female urinayr system. More reseults. Ew, That Smell:HowtoGetDogPee Smell Out ofCarpet Your browser idnicates if you've visited this link.
Ronweix - 2017-11-12  19:39:13
 Shop Cialis Online [url=http://levitrial.com]levitra on line sale[/url] Rezeptfrei Viagra Ausland
Miguzese - 2017-11-12  16:18:16
 Acheter Viagra Sans Ordonnance France Levitra Biglietti On Line [url=http://viaonlineusa.com]viagra online prescription[/url] Comprar Pastillas Levitra Propecia Pastilla
Miguzese - 2017-11-12  16:18:14
 Acheter Viagra Sans Ordonnance France Levitra Biglietti On Line [url=http://viaonlineusa.com]viagra online prescription[/url] Comprar Pastillas Levitra Propecia Pastilla
Miguzese - 2017-11-12  16:18:13
 Acheter Viagra Sans Ordonnance France Levitra Biglietti On Line [url=http://viaonlineusa.com]viagra online prescription[/url] Comprar Pastillas Levitra Propecia Pastilla
Miguzese - 2017-11-12  16:18:11
 Acheter Viagra Sans Ordonnance France Levitra Biglietti On Line [url=http://viaonlineusa.com]viagra online prescription[/url] Comprar Pastillas Levitra Propecia Pastilla
KatyamMayop - 2017-11-12  14:01:38
 Заводы выпускают вдруг скольконибудь видов двутавров в зависимости от области применения последних.Если изделия выполнены из меди и сплавов, то влажность в помещении не должна превосходить 50 %, т. к из деревянных стеллажей могут выделяться кислотные туман в случае превышения этих показателей.Каждый разряд хорошо трамбуется чтобы того, чтобы не было пустот.Отсюда и разница для ожидание прокатки углеродистой стали — горячекатаный, холоднокатаный метод.Располагайте накладки симметрично с продольной осью двутавровой балки.
https://metal-moscow.ru/metalloprokat/balka/dvutavrovaja.html - двутавровая балка цена
[url=https://metal-moscow.ru/metalloprokat/cvetnye-metally/list-alyuminievyj-riflenyj.html]купить алюминиевый лист[/url]
купить алюминиевый уголок

Другой способ - механизированный, средствами для очистки выступают точильные камни, круги чтобы шлифовки, машины для зачистки абразивными шнурками, игольчатые пистолеты, зачистные молотки и т. п.Недостатки: Высокая цена и сложное техобслуживание, высокий степень шума, противопоказуется кромсать заготовки толще 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] [458] [459] [460] [461] [462] [463] [464] [465] [466] [467] [468] [469] [470] [471] [472] [473] [474] [475] [476] [477] [478] [479] [480] [481] [482] [483] [484] [485] [486] [487] [488] [489] [490] [491] [492] [493] [494] [495] [496] [497] [498] [499] [500] [501] [502] [503] [504] [505] [506] [507] [508] [509] [510] [511] [512] [513] [514] [515] [516] >>
*v komentářich nesmíte používat sprostá slova a odkazy!!!Děkuji za pochopeni.