编程小贴士

给你的编程提供小点子


PHP编程中10个最常见的错误

PHP是一种非常流行的开源服务器端脚本语言,你在万维网看到的大多数网站都是使用php开发的。本篇将为大家介绍PHP开发中10个最常见的问题,希望能够对朋友有所帮助。
错误1:foreach循环后留下悬挂指针

在foreach循环中,如果我们需要更改迭代的元素或是为了提高效率,运用引用是一个好办法:

$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)

这里有个问题很多人会迷糊。循环结束后,value并未销毁,value其实是数组中最后一个元素的引用,这样在后续对$value的使用中,如果不知道这一点,会引发一些莫名奇妙的错误:)看看下面这段代码:

$array = [1, 2, 3];
echo implode(‘,’, $array), “\n”;

foreach ($array as &$value) {}    // by reference
echo implode(‘,’, $array), “\n”;

foreach ($array as $value) {}     // by value (i.e., copy)
echo implode(‘,’, $array), “\n”;

上面代码的运行结果如下:

1,2,3
1,2,3
1,2,2

你猜对了吗?为什么是这个结果呢?

我们来分析下。第一个循环过后,$value是数组中最后一个元素的引用。第二个循环开始:

第一步:复制arr[0]到value(注意此时value是arr[2]的引用),这时数组变成[1,2,1]
第二步:复制arr[1]到value,这时数组变成[1,2,2]
第三步:复制arr[2]到value,这时数组变成[1,2,2]

综上,最终结果就是1,2,2

避免这种错误最好的办法就是在循环后立即用unset函数销毁变量:

$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
unset($value);   // $value no longer references $arr[3]
错误2:对isset()函数行为的错误理解

对于isset()函数,变量不存在时会返回false,变量值为null时也会返回false。这种行为很容易把人弄迷糊。。。看下面的代码:

$data = fetchRecordFromStorage($storage, $identifier);
if (!isset($data[‘keyShouldBeSet’]) {
// do something here if ‘keyShouldBeSet’ is not set
}

写这段代码的人本意可能是如果data[′keyShouldBeSet′]未设置,则执行对应逻辑。但问题在于即使data[‘keyShouldBeSet’]已设置,但设置的值为null,还是会执行对应的逻辑,这就不符合代码的本意了。

下面是另外一个例子:

if ($_POST[‘active’]) {
$postData = extractSomething($_POST);
}

// …

if (!isset($postData)) {
echo ‘post not active';
}

上面的代码假设POST[′active′]为真,那么postData应该被设置,因此isset(postData)会返回true。反之,上面代码假设isset(postData)返回false的唯一途径就是$_POST[‘active’]也返回false。

真是这样吗?当然不是!

即使POST[′active′]返回true,postData也有可能被设置为null,这时isset($postData)就会返回false。这就不符合代码的本意了。

如果上面代码的本意仅是检测$_POST[‘active’]是否为真,下面这样实现会更好:

if ($_POST[‘active’]) {
$postData = extractSomething($_POST);
}

// …

if ($_POST[‘active’]) {
echo ‘post not active';
}

判断一个变量是否真正被设置(区分未设置和设置值为null),array_key_exists()函数或许更好。重构上面的第一个例子,如下:

$data = fetchRecordFromStorage($storage, $identifier);
if (! array_key_exists(‘keyShouldBeSet’, $data)) {
// do this if ‘keyShouldBeSet’ isn’t set
}

另外,结合get_defined_vars()函数,我们可以更加可靠的检测变量在当前作用域内是否被设置:

if (array_key_exists(‘varShouldBeSet’, get_defined_vars())) {
// variable $varShouldBeSet exists in current scope
}
错误3:混淆返回值和返回引用

考虑下面的代码:

class Config
{
private $values = [];

public function getValues() {
return $this->values;
}
}

$config = new Config();

$config->getValues()[‘test’] = ‘test';
echo $config->getValues()[‘test’];

运行上面的代码,将会输出下面的内容:

PHP Notice:  Undefined index: test in /path/to/my/script.php on line 21

问题出在哪呢?问题就在于上面的代码混淆了返回值和返回引用。在PHP中,除非你显示的指定返回引用,否则对于数组PHP是值返回,也就是数组的拷贝。因此上面代码对返回数组赋值,实际是对拷贝数组进行赋值,非原数组赋值。
// getValues() returns a COPY of the $values array, so this adds a ‘test’ element
// to a COPY of the $values array, but not to the $values array itself.
$config->getValues()[‘test’] = ‘test';

// getValues() again returns ANOTHER COPY of the $values array, and THIS copy doesn’t
// contain a ‘test’ element (which is why we get the “undefined index” message).
echo $config->getValues()[‘test’];

下面是一种可能的解决办法,输出拷贝的数组,而不是原数组:

$vals = $config->getValues();
$vals[‘test’] = ‘test';
echo $vals[‘test’];

如果你就是想要改变原数组,也就是要反回数组引用,那应该如何处理呢?办法就是显示指定返回引用即可:

class Config
{
private $values = [];

// return a REFERENCE to the actual $values array
public function &getValues() {
return $this->values;
}
}

$config = new Config();

$config->getValues()[‘test’] = ‘test';
echo $config->getValues()[‘test’];

经过改造后,上面代码将会像你期望那样会输出test。

我们再来看一个例子会让你更迷糊的例子:

class Config
{
private $values;

// using ArrayObject rather than array
public function __construct() {
$this->values = new ArrayObject();
}

public function getValues() {
return $this->values;
}
}

$config = new Config();

$config->getValues()[‘test’] = ‘test';
echo $config->getValues()[‘test’];

如果你想的是会和上面一样输出“ Undefined index”错误,那你就错了。代码会正常输出“test”。原因在于PHP对于对象默认就是按引用返回的,而不是按值返回。

综上所述,我们在使用函数返回值时,要弄清楚是值返回还是引用返回。PHP中对于对象,默认是引用返回,数组和内置基本类型默认均按值返回。这个要与其它语言区别开来(很多语言对于数组是引用传递)。

像其它语言,比如java或C#,利用getter或setter来访问或设置类属性是一种更好的方案,当然PHP默认不支持,需要自己实现:

class Config
{
private $values = [];

public function setValue($key, $value) {
$this->values[$key] = $value;
}

public function getValue($key) {
return $this->values[$key];
}
}

$config = new Config();

$config->setValue(‘testKey’, ‘testValue’);
echo $config->getValue(‘testKey’);    // echos ‘testValue’

上面的代码给调用者可以访问或设置数组中的任意值而不用给与数组public访问权限。感觉怎么样:)
错误4:在循环中执行sql查询

在PHP编程中发现类似下面的代码并不少见:

$models = [];

foreach ($inputValues as $inputValue) {
$models[] = $valueRepository->findByValue($inputValue);
}

当然上面的代码是没有什么错误的。问题在于我们在迭代过程中$valueRepository->findByValue()可能每次都执行了sql查询:

$result = $connection->query(“SELECT `x`,`y` FROM `values` WHERE `value`=” . $inputValue);

如果迭代了10000次,那么你就分别执行了10000次sql查询。如果这样的脚本在多线程程序中被调用,那很可能你的系统就挂了。。。

在编写代码过程中,你应该要清楚什么时候应该执行sql查询,尽可能一次sql查询取出所有数据。

有一种业务场景,你很可能会犯上述错误。假设一个表单提交了一系列值(假设为IDs),然后为了取出所有ID对应的数据,代码将遍历IDs,分别对每个ID执行sql查询,代码如下所示:

$data = [];
foreach ($ids as $id) {
$result = $connection->query(“SELECT `x`, `y` FROM `values` WHERE `id` = ” . $id);
$data[] = $result->fetch_row();
}

但同样的目的可以在一个sql中更加高效的完成,代码如下:

$data = [];
if (count($ids)) {
$result = $connection->query(“SELECT `x`, `y` FROM `values` WHERE `id` IN (” . implode(‘,’, $ids));
while ($row = $result->fetch_row()) {
$data[] = $row;
}
}
错误5:内存使用低效和错觉

一次sql查询获取多条记录比每次查询获取一条记录效率肯定要高,但如果你使用的是php中的mysql扩展,那么一次获取多条记录就很可能会导致内存溢出。

我们可以写代码来实验下(测试环境: 512MB RAM、MySQL、php-cli):

// connect to mysql
$connection = new mysqli(‘localhost’, ‘username’, ‘password’, ‘database’);

// create table of 400 columns
$query = ‘CREATE TABLE `test`(`id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT';
for ($col = 0; $col < 400; $col++) {
$query .= “, `col$col` CHAR(10) NOT NULL”;
}
$query .= ‘);';
$connection->query($query);

// write 2 million rows
for ($row = 0; $row < 2000000; $row++) {
$query = “INSERT INTO `test` VALUES ($row”;
for ($col = 0; $col < 400; $col++) {
$query .= ‘, ‘ . mt_rand(1000000000, 9999999999);
}
$query .= ‘)';
$connection->query($query);
}

现在来看看资源消耗:

// connect to mysql
$connection = new mysqli(‘localhost’, ‘username’, ‘password’, ‘database’);
echo “Before: ” . memory_get_peak_usage() . “\n”;

$res = $connection->query(‘SELECT `x`,`y` FROM `test` LIMIT 1′);
echo “Limit 1: ” . memory_get_peak_usage() . “\n”;

$res = $connection->query(‘SELECT `x`,`y` FROM `test` LIMIT 10000′);
echo “Limit 10000: ” . memory_get_peak_usage() . “\n”;

输出结果如下:

Before: 224704
Limit 1: 224704
Limit 10000: 224704

根据内存使用量来看,貌似一切正常。为了更加确定,试着一次获取100000条记录,结果程序得到如下输出:

PHP Warning:  mysqli::query(): (HY000/2013):
Lost connection to MySQL server during query in /root/test.php on line 11

这是怎么回事呢?

问题出在php的mysql模块的工作方式,mysql模块实际上就是libmysqlclient的一个代理。在查询获取多条记录的同时,这 些记录会直接 保存在内存中。由于这块内存不属于php的内存模块所管理,所以我们调用memory_get_peak_usage()函数所获得的值并非真实使用内存 值,于是便出现了上面的问题。

我们可以使用mysqlnd来代替mysql,mysqlnd编译为php自身扩展,其内存使用由php内存管理模块所控制。如果我们用mysqlnd来实现上面的代码,则会更加真实的反应内存使用情况:

Before: 232048
Limit 1: 324952
Limit 10000: 32572912

更加糟糕的是,根据php的官方文档,mysql扩展存储查询数据使用的内存是mysqlnd的两倍,因此原来的代码使用的内存是上面显示的两倍左右。

为了避免此类问题,可以考虑分几次完成查询,减小单次查询数据量:

$totalNumberToFetch = 10000;
$portionSize = 100;

for ($i = 0; $i <= ceil($totalNumberToFetch / $portionSize); $i++) {
$limitFrom = $portionSize * $i;
$res = $connection->query(
“SELECT `x`,`y` FROM `test` LIMIT $limitFrom, $portionSize”);
}

联系上面提到的错误4可以看出,在实际的编码过程中,要做到一种平衡,才能既满足功能要求,又能保证性能。
错误6:忽略Unicode/UTF-8问题

php编程中,在处理非ascii字符时,会遇到一些问题,要很小心的去对待,要不然就会错误遍地。举个简单的例子,strlen(name),如果name包含非ascii字符,那结果就有些出乎意料。在此给出一些建议,尽量避免此类问题:

如果你对unicode和utf-8不是很了解,那么你至少应该了解一些基础。推荐阅读这篇文章。
最好使用mb_*函数来处理字符串,避免使用老的字符串处理函数。这里要确保PHP的“multibyte”扩展已开启。
数据库和表最好使用unicode编码。
知道jason_code()函数会转换非ascii字符,但serialize()函数不会。
php代码源文件最好使用不含bom的utf-8格式。

在此推荐一篇文章,更详细的介绍了此类问题: UTF-8 Primer for PHP and MySQL
错误7:假定$_POST总是包含POST数据

PHP中的$_POST并非总是包含表单POST提交过来的数据。假设我们通过 jQuery.ajax() 方法向服务器发送了POST请求:
// js
$.ajax({
url: ‘http://my.site/some/path’,
method: ‘post’,
data: JSON.stringify({a: ‘a’, b: ‘b’}),
contentType: ‘application/json’
});

注意代码中的 contentType: ‘application/json’ ,我们是以json数据格式来发送的数据。在服务端,我们仅输出$_POST数组:

// php
var_dump($_POST);

你会很惊奇的发现,结果是下面所示:

array(0) { }

为什么是这样的结果呢?我们的json数据 {a: ‘a’, b: ‘b’} 哪去了呢?

答案就是PHP仅仅解析Content-Type为 application/x-www-form-urlencoded 或 multipart/form-data的Http请求。之所以这样是因为历史原因,PHP最初实现$_POST时,最流行的就是上面两种类型。因此虽说 现在有些类型(比如application/json)很流行,但PHP中还是没有去实现自动处理。

因为POST是全局变量,所以更改_POST会全局有效。因此对于Content-Type为 application/json 的请求,我们需要手工去解析json数据,然后修改$_POST变量。
// php
$_POST = json_decode(file_get_contents(‘php://input’), true);

此时,我们再去输出$_POST变量,则会得到我们期望的输出:
1

array(2) { [“a”]=> string(1) “a” [“b”]=> string(1) “b” }
错误8:认为PHP支持字符数据类型

看看下面的代码,猜测下会输出什么:

for ($c = ‘a'; $c <= ‘z'; $c++) {
echo $c . “\n”;
}

如果你的回答是输出’a’到’z’,那么你会惊奇的发现你的回答是错误的。

不错,上面的代码的确会输出’a’到’z’,但除此之外,还会输出’aa’到’yz’。我们来分析下为什么会是这样的结果。

在PHP中不存在char数据类型,只有string类型。明白这点,那么对’z’进行递增操作,结果则为’aa’。对于字符串比较大小,学过C的应该都知道,’aa’是小于’z’的。这也就解释了为何会有上面的输出结果。

如果我们想输出’a’到’z’,下面的实现是一种不错的办法:

for ($i = ord(‘a’); $i <= ord(‘z’); $i++) {
echo chr($i) . “\n”;
}

或者这样也是OK的:

$letters = range(‘a’, ‘z’);

for ($i = 0; $i < count($letters); $i++) {
echo $letters[$i] . “\n”;
}
错误9:忽略编码标准

虽说忽略编码标准不会导致错误或是bug,但遵循一定的编码标准还是很重要的。

没有统一的编码标准会使你的项目出现很多问题。最明显的就是你的项目代码不具有一致性。更坏的地方在于,你的代码将更加难以调试、扩展和维护。这也就意味着你的团队效率会降低,包括做一些很多无意义的劳动。

对于PHP开发者来说,是比较幸运的。因为有PHP编码标准推荐(PSR),由下面5个部分组成:

PSR-0:自动加载标准
PSR-1:基本编码标准
PSR-2:编码风格指南
PSR-3:日志接口标准
PSR-4:自动加载

PSR最初由PHP社区的几个大的团体所创建并遵循。Zend, Drupal, Symfony, Joomla及其它的平台都为此标准做过贡献并遵循这个标准。即使是PEAR,早些年也想让自己成为一个标准,但现在也加入了PSR阵营。

在某些情况下,使用什么编码标准是无关紧要的,只要你使用一种编码风格并一直坚持使用即可。但是遵循PSR标准不失为一个好办法,除非你有什么 特殊的原因要 自己弄一套。现在越来越多的项目都开始使用PSR,大部分的PHP开发者也在使用PSR,因此使用PSR会让新加入你团队的成员更快的熟悉项目,写代码时 也会更加舒适。
错误10:错误使用empty()函数

一些PHP开发人员喜欢用empty()函数去对变量或表达式做布尔判断,但在某些情况下会让人很困惑。

首先我们来看看PHP中的数组Array和数组对象ArrayObject。看上去好像没什么区别,都是一样的。真的这样吗?

// PHP 5.0 or later:
$array = [];
var_dump(empty($array));        // outputs bool(true)
$array = new ArrayObject();
var_dump(empty($array));        // outputs bool(false)
// why don’t these both produce the same output?

让事情变得更复杂些,看看下面的代码:

// Prior to PHP 5.0:
$array = [];
var_dump(empty($array));        // outputs bool(false)
$array = new ArrayObject();
var_dump(empty($array));        // outputs bool(false)

很不幸的是,上面这种方法很受欢迎。例如,在Zend Framework 2中,Zend\Db\TableGateway 在 TableGateway::select() 结果集上调用 current() 方法返回数据集时就是这么干的。开发人员很容易就会踩到这个坑。

为了避免这些问题,检查一个数组是否为空最后的办法是用 count() 函数:

// Note that this work in ALL versions of PHP (both pre and post 5.0):
$array = [];
var_dump(count($array));        // outputs int(0)
$array = new ArrayObject();
var_dump(count($array));        // outputs int(0)

在这顺便提一下,因为PHP中会将数值0认为是布尔值false,因此 count() 函数可以直接用在 if 条件语句的条件判断中来判断数组是否为空。另外,count() 函数对于数组来说复杂度为O(1),因此用 count() 函数是一个明智的选择。

再来看一个用 empty() 函数很危险的例子。当在魔术方法 __get() 中结合使用 empty() 函数时,也是很危险的。我们来定义两个类,每个类都有一个 test 属性。

首先我们定义 Regular 类,有一个 test 属性:

class Regular
{
public $test = ‘value';
}

然后我们定义 Magic 类,并用 __get() 魔术方法来访问它的 test 属性:

class Magic
{
private $values = [‘test’ => ‘value’];

public function __get($key)
{
if (isset($this->values[$key])) {
return $this->values[$key];
}
}
}

好了。我们现在来看看访问各个类的 test 属性会发生什么:

$regular = new Regular();
var_dump($regular->test);    // outputs string(4) “value”
$magic = new Magic();
var_dump($magic->test);      // outputs string(4) “value”

到目前为止,都还是正常的,没有让我们感到迷糊。

但在 test 属性上使用 empty() 函数会怎么样呢?

var_dump(empty($regular->test));    // outputs bool(false)
var_dump(empty($magic->test));      // outputs bool(true)

结果是不是很意外?

很不幸的是,如果一个类使用魔法 __get() 函数来访问类属性的值,没有简单的方法来检查属性值是否为空或是不存在。在类作用域外,你只能检查是否返回 null 值,但这并不一定意味着没有设置相应的键,因为键值可以被设置为 null 。

相比之下,如果我们访问 Regular 类的一个不存在的属性,则会得到一个类似下面的Notice消息:

Notice: Undefined property: Regular::$nonExistantTest in /path/to/test.php on line 10

Call Stack:
0.0012     234704   1. {main}() /path/to/test.php:0

因此,对于 empty() 函数,我们要小心的使用,要不然的话就会结果出乎意料,甚至潜在的误导你。

266 Responses to “ PHP编程中10个最常见的错误 ”

  1. i love pron说道:

    8bI49d You have mentioned very interesting details ! ps nice site. аЂа‹аЂ O human race born to fly upward, wherefore at a little wind dost thou fall.аЂ аЂа› by Dante Alighieri.

  2. Mantra Yoga说道:

    I relish, result in I found exactly what I used to be having a look for. You have ended my four day lengthy hunt! God Bless you man. Have a nice day. Bye

  3. Mantra Yoga说道:

    I think this is a real great blog.Thanks Again. Great.

  4. noi nau tra sua说道:

    I’m book-marking and will be tweeting this to my followers!

  5. drawing说道:

    I really liked your blog article.Really looking forward to read more. Keep writing.

  6. Wow! This can be one particular of the most helpful blogs We ave ever arrive across on this subject. Actually Excellent. I am also a specialist in this topic so I can understand your hard work.

  7. Major thankies for the blog article. Awesome.

  8. pretty practical material, overall I think this is worthy of a bookmark, thanks

  9. My Face Gifts说道:

    wow, awesome post.Much thanks again. Really Great.

  10. salaams peoplehope allah swt answers ALL YOUR RIGHTOUS duas and may all your wishes, dreams come trueameen.

  11. Click to read说道:

    Im obliged for the post.Thanks Again. Want more.

  12. to learn more说道:

    person supply on your guests? Is going to

  13. I simply could not leave your site before suggesting that I really loved the usual information an individual supply for your guests? Is gonna be back steadily in order to inspect new posts

  14. Looking forward to reading more. Great post. Awesome.

  15. navigate here说道:

    You might have an incredibly great layout for the blog i want it to use on my web site too

  16. visit说道:

    Very nice info and right to the point. I am not sure if this is really the best place to ask but do you folks have any ideea where to get some professional writers? Thanks

  17. w88world说道:

    This is very interesting, You are a very skilled blogger. I have joined your rss feed and look forward to seeking more of your great post. Also, I have shared your site in my social networks!

  18. Thanks for the blog.Really looking forward to read more. Keep writing.

  19. one of our visitors not long ago encouraged the following website

  20. What as up, just wanted to tell you, I loved this blog post. It was helpful. Keep on posting!

  21. pre booked说道:

    This blog is without a doubt interesting and informative. I have picked up many handy things out of this blog. I ad love to go back again soon. Thanks a lot!

  22. Wow, awesome weblog structure! How lengthy have you been running a blog for? you make running a blog look easy. The total glance of your website is magnificent, let alone the content!

  23. Wow, great blog article.Really thank you! Really Cool.

  24. microblog说道:

    Muchos Gracias for your post.Thanks Again. Cool.

  25. Very informative article.Really looking forward to read more. Really Cool.

  26. This particular blog is definitely awesome and also diverting. I have chosen a lot of handy tips out of this blog. I ad love to return again soon. Thanks a bunch!

  27. The Lost Ways说道:

    Wow, great blog post.Much thanks again. Want more.

  28. H1B说道:

    I think this is a real great blog post.Really looking forward to read more. Will read on…

  29. lanyard custom说道:

    Wow, amazing blog layout! How long have you been blogging for? you make blogging look easy. The overall look of your site is magnificent, as well as the content!

  30. And说道:

    you ave gotten a great weblog right here! would you like to make some invite posts on my blog?

  31. Go Here说道:

    It’а†s actually a nice and useful piece of info. I’а†m happy that you simply shared this helpful info with us. Please keep us up to date like this. Thanks for sharing.

  32. Nwokolo说道:

    you ave got an incredible blog here! would you like to make some invite posts on my blog?

  33. wow, awesome blog.Really looking forward to read more. Keep writing.

  34. I think this is a real great blog article.Thanks Again. Really Cool.

  35. pretty helpful material, overall I feel this is worth a bookmark, thanks

  36. south korea jersey ??????30????????????????5??????????????? | ????????

  37. Looking forward to reading more. Great blog.Really thank you! Really Cool.

  38. year and am anxious about switching to another platform. I have

  39. There is apparently a bunch to identify about this. I believe you made various good points in features also.

  40. recycling说道:

    Sweet blog! I found it while searching on Yahoo News. Do you have any suggestions on how to get listed in Yahoo News? I ave been trying for a while but I never seem to get there! Appreciate it

  41. mp3 sounds说道:

    What Follows Is A Approach That as Also Enabling bag-gurus To Expand

  42. Im obliged for the post.Really thank you! Awesome.

  43. Very informative blog article.Really looking forward to read more. Awesome.

  44. viral marketing说道:

    News info I was reading the news and I saw this really cool information

  45. tellpopeyes说道:

    Informative and precise Its difficult to find informative and accurate information but here I noted

  46. Major thankies for the blog article.Really looking forward to read more. Will read on

  47. Very neat blog.Thanks Again. Really Cool. here

  48. this website说道:

    Thank you for your blog.Really looking forward to read more.

  49. Thanks for sharing, this is a fantastic blog article.Really thank you! Want more. this link

  50. this is very interesting. thanks for that. we need more sites like this. i commend you on your great content and excellent topic choices.

  51. sidekick说道:

    When you can grab my attention in the first few words of an article it as an accomplishment. You ave ignited my interest on this subject and I thank you for this.

  52. Supermodel Elena说道:

    Really enjoyed this blog article.Really looking forward to read more. Fantastic.

  53. Blogging说道:

    Well I sincerely enjoyed reading it. This tip procured by you is very helpful for accurate planning.

  54. fashion说道:

    This is a very good tip particularly to those new to the blogosphere. Short but very accurate information Many thanks for sharing this one. A must read article!

  55. Rental Dress说道:

    What as Happening i am new to this, I stumbled upon this I have found It absolutely helpful and it has aided me out loads. I hope to contribute & assist other users like its helped me. Good job.

  56. Looking forward to reading more. Great article.Really looking forward to read more. Keep writing.

  57. I really liked your blog article.Thanks Again. Keep writing.

  58. It as appropriate time to make some plans for the future and

  59. indeed, investigation is having to pay off. So happy to possess found this article.. of course, analysis is having to pay off. Wonderful thoughts you possess here..

  60. Blusa Tejidas说道:

    placing the other person as website link on your page at appropriate place and other person will also do similar in support of you.

  61. Very good article. I will be going through some of these issues as well..

  62. my page说道:

    Wow, superb blog layout! How long have you been blogging for? you made blogging look easy. The overall look of your site is fantastic, as well as the content!

  63. blue nike说道:

    You should not clone the girl as start looking specifically. You should contain the girl as design, yet with your own individual distinct distort.

  64. worth说道:

    Major thanks for the post.Really thank you!

  65. This very blog is no doubt awesome additionally informative. I have found many handy things out of this source. I ad love to return every once in a while. Thanks a bunch!

  66. Thanks so much for the blog article.Thanks Again. Really Cool.

  67. hampton bay说道:

    with something like this. Please let me know if you run into anything.

  68. School admission说道:

    Really appreciate you sharing this article post.Thanks Again. Will read on

  69. Exams说道:

    I truly appreciate this post. I ave been looking everywhere for this! Thank goodness I found it on Google. You have made my day! Thank you again

  70. Just a smiling visitant here to share the love (:, btw great style and design.

  71. This is a very good tip particularly to those fresh to the blogosphere. Simple but very precise info Many thanks for sharing this one. A must read article!

  72. I think other web-site proprietors should take this web site as an model, very clean and excellent user friendly style and design, let alone the content. You are an expert in this topic!

  73. Major thanks for the blog.Thanks Again. Cool.

  74. There is visibly a bunch to realize about this. I feel you made various nice points in features also.

  75. I simply could not depart your website prior to suggesting that I extremely enjoyed the standard info an individual supply on your guests? Is gonna be back frequently in order to inspect new posts

  76. You have made some really good points there. I looked on the web for additional information about the issue and found most individuals will go along with your views on this web site.

  77. reduslim说道:

    Really appreciate you sharing this blog post.Much thanks again. Keep writing.

  78. There is noticeably a bundle to realize about this. I consider you made various good points in features also.

  79. Looking forward to reading more. Great post.Thanks Again. Fantastic.

  80. This is one awesome blog post. Fantastic.

  81. You can definitely see your skills within the work you write. The sector hopes for more passionate writers such as you who are not afraid to say how they believe. Always go after your heart.

  82. simple tweeks would really make my blog stand out. Please let me know

  83. Quite Right I definitely liked the article which I ran into.

  84. Very neat blog post.Thanks Again. Much obliged.

  85. This Is The Technique That as Actually Enabling bag-professionals To Advance

  86. Victor说道:

    Major thankies for the blog post.Really looking forward to read more.

  87. These challenges can be uncomplicated to choose treatment of if you see your dentist swift.

  88. Open Heavens说道:

    Some genuinely superb content on this website , thankyou for contribution.

  89. Major thanks for the article post.Thanks Again. Want more.

  90. Very nice blog post. I definitely appreciate this site. Thanks!

  91. factory说道:

    you download it from somewhere? A theme like yours with a few simple adjustements would really make my

  92. Say, you got a nice blog article. Fantastic.

  93. You made some respectable points there. I seemed on the web for the difficulty and located most people will go together with together with your website.

  94. for more info说道:

    Its hard to find good help I am constantnly proclaiming that its hard to find good help, but here is

  95. Major thankies for the blog article. Fantastic.

  96. When I originally commented I appear to have clicked the

  97. Im no expert, but I imagine you just made a very good point point. You certainly understand what youre talking about, and I can actually get behind that. Thanks for being so upfront and so genuine.

  98. graham dailies说道:

    I was suggested this blog by my cousin. I am not sure whether this post is written by him as nobody else know such detailed about my problem. You are amazing! Thanks!

  99. go there说道:

    Really informative article post.Much thanks again.

  100. see the website说道:

    Wow! Thank you! I always wanted to write on my website something like that. Can I include a portion of your post to my site?

  101. Yay google is my world beater assisted me to find this great site!.

  102. Muchos Gracias for your post.Really thank you! Really Cool.

  103. Very nice post and right to the point. I don at know if this is really the best place to ask but do you people have any thoughts on where to hire some professional writers? Thank you

  104. like this说道:

    Pretty! This was an incredibly wonderful article. Thanks for supplying this info.|

  105. you can check说道:

    Very good blog.Really looking forward to read more. Really Cool.

  106. your website a little bit more interesting.

  107. that may be the finish of this write-up. Here you

  108. post说道:

    Right away I am going to do my breakfast, after having my breakfast coming yet again to read more news.

  109. twitter说道:

    This in fact answered my problem, thank you!

  110. click here说道:

    You have remarked very interesting points ! ps nice web site. Justice is the truth in action. by Jeseph Joubert.

  111. Timon had the gifts of God, which is known for, plus an atmosphere pouch at the back

  112. app说道:

    I think you have mentioned some very interesting details , regards for the post.

  113. go to说道:

    new reader. What could you recommend in regards

  114. Wow, great blog article.Really looking forward to read more. Awesome.

  115. You have made some decent points there. I checked on the internet for more information about the issue and found most individuals will go along with your views on this website.

  116. your e-mail subscription hyperlink or newsletter service.

  117. Usually I don at read article on blogs, but I would like to say that this write-up very pressured me to check out and do it! Your writing style has been amazed me. Thanks, very nice article.

  118. Merely a smiling visitant here to share the love (:, btw great style and design.

  119. It’а†s really a great and helpful piece of information. I’а†m glad that you just shared this helpful information with us. Please stay us up to date like this. Thanks for sharing.

  120. Your style is very unique in comparison to other people I have read stuff from. Many thanks for posting when you ave got the opportunity, Guess I will just book mark this site.

  121. Thanks for sharing, this is a fantastic blog post. Awesome.

  122. launchpad mk2说道:

    I\ ave been using iXpenseIt for the past two years. Great app with very regular updates.

  123. in catalog说道:

    When I saw this page was like wow. Thanks for putting your effort in publishing this article.

  124. check here说道:

    Very informative article.Much thanks again. Really Great.

  125. go there说道:

    Wow, fantastic blog layout! How long have you been blogging for? you make blogging look easy. The overall look of your web site is wonderful, as well as the content!

  126. Very informative blog.Really looking forward to read more. Great.

  127. Looking around While I was browsing yesterday I noticed a great article concerning

  128. Really enjoyed this blog post, is there any way I can get an alert email every time there is a fresh article?

  129. my portfolio说道:

    your website, how can i subscribe for a blog website? The

  130. go here说道:

    This was to protect them from ghosts and demons. Peace,

  131. good day说道:

    I truly appreciate this article.Thanks Again. Cool.

  132. read more说道:

    Really appreciate you sharing this blog post.Much thanks again. Want more.

  133. Very nice write-up. I absolutely appreciate this site. Stick with it!

  134. Merely wanna comment that you have a very nice website , I like the design and style it really stands out.

  135. There is perceptibly a bundle to identify about this. I believe you made certain good points in features also.

  136. I think other web-site proprietors should take this site as an model, very clean and wonderful user genial style and design, let alone the content. You are an expert in this topic!

  137. This is one awesome article.Thanks Again. Cool.

  138. Thanks a lot for the article post.Really looking forward to read more. Really Cool.

  139. Well I sincerely enjoyed studying it. This post offered by you is very helpful for correct planning.

  140. yeezy shoes说道:

    My spouse and i were cheerful when Albert managed to conclude his investigation by way of the ideas he gained through your web site. It is now and again perplexing to simply find yourself offering instructions men and women might have been trying to sell. And we all do know we need you to give thanks to for that. Most of the illustrations you’ve made, the simple site menu, the friendships you help engender – it is everything remarkable, and it’s helping our son in addition to us consider that that theme is enjoyable, and that’s especially serious. Thanks for the whole thing!

  141. Thanks again for the blog.Much thanks again. Want more.

  142. Game Online说道:

    It as exhausting to search out educated people on this matter, but you sound like you know what you are speaking about! Thanks

  143. Canon 80d lenses说道:

    Keep up the good work, I read few content on this site and I think that your web blog is very interesting and has bands of great info.

  144. I\ ave been looking for something that does all those things you just mentioned. Can you recommend a good one?

  145. I truly appreciate this article post.Really looking forward to read more. Fantastic.

  146. Meo Hai Tac说道:

    you. This is really a tremendous web site.

  147. You can definitely see your skills in the work you write. The world hopes for even more passionate writers like you who are not afraid to say how they believe. Always go after your heart.

  148. check out说道:

    like to find something more secure. Do you have any suggestions?

  149. pretty useful material, overall I imagine this is worthy of a bookmark, thanks

  150. Your style is unique compared to other people I ave read stuff from. Many thanks for posting when you ave got the opportunity, Guess I will just book mark this page.

  151. It as not that I want to duplicate your web-site, but I really like the design and style. Could you let me know which style are you using? Or was it custom made?

  152. tree surgeon说道:

    Merely a smiling visitant here to share the love (:, btw great pattern.

  153. hand craft说道:

    That is very fascinating, You are a very professional blogger. I ave joined your rss feed and sit up for searching for more of your great post. Also, I have shared your web site in my social networks

  154. Merely wanna comment that you have a very nice internet site , I enjoy the style it actually stands out.

  155. Of course, what a great site and illuminating posts, I definitely will bookmark your site.Have an awsome day!

  156. find out more说道:

    Would you offer guest writers to write content in your case?

  157. It as nearly impossible to find educated people on this subject, however, you sound like you know what you are talking about! Thanks

  158. There is definately a lot to know about this issue. I love all the points you made.

  159. bo dam说道:

    Thanks for sharing, this is a fantastic blog article.Really looking forward to read more. Cool.

  160. Mobile Computer说道:

    This is my first time pay a visit at here and i am genuinely pleassant to read everthing at single place.

  161. Looking around While I was browsing yesterday I noticed a great post about

  162. Ridiculous quest there. What occurred after? Thanks!

  163. IPTV playlists说道:

    Thanks again for the blog article.Really thank you! Great.

  164. katalog avto说道:

    weight loss is sometimes difficult to attain, it all depends on your motivation and genetics;

  165. more说道:

    You have observed very interesting details ! ps nice web site. I understand a fury in your words, But not the words. by William Shakespeare.

  166. There as definately a lot to find out about this subject. I love all of the points you ave made.

  167. Bigcoin Viet Nam说道:

    pretty handy material, overall I think this is well worth a bookmark, thanks

  168. IPTV playlists说道:

    I used to be able to find good advice from your blog posts.

  169. Looking forward to reading more. Great post. Much obliged.

  170. May I use Wikipedia content in my blog without violating the copyright law?

  171. It as not that I want to copy your web-site, but I really like the pattern. Could you let me know which theme are you using? Or was it tailor made?

  172. dinnercoupons说道:

    I truly appreciate this blog post.Really thank you! Will read on

  173. Really appreciate you sharing this article post.Really thank you! Really Cool.

  174. me suba说道:

    2etkK9 pretty handy material, overall I think this is really worth a bookmark, thanks

  175. This unique blog is really cool and besides informative. I have chosen many interesting advices out of this blog. I ad love to come back over and over again. Thanks!

  176. I really liked your article post.Really looking forward to read more. Awesome.

  177. Superior day. i am undertaking research at this time as well as your blog really aided me,

  178. Nice blog here! Also your website loads up very fast! What host are you using? Can I get your affiliate link to your host? I wish my web site loaded up as fast as yours lol

  179. Im obliged for the blog.Really thank you! Fantastic.

  180. sure, analysis is paying off. Seriously handy perspective, many thanks for sharing.. Truly handy point of view, many thanks for expression.. Fantastic beliefs you have here..

  181. official page说道:

    you have a fantastic blog here! would you like to create some invite posts on my blog?

  182. mens wallets说道:

    Say, you got a nice article post.Really looking forward to read more.

  183. stavki sport说道:

    Thanks for sharing, this is a fantastic blog article.Really thank you! Awesome.

  184. bistro masa说道:

    I truly appreciate this blog post.Really thank you! Awesome.

  185. bistro masa说道:

    we came across a cool web-site that you just may possibly delight in. Take a appear in case you want

  186. pretty valuable stuff, overall I consider this is worthy of a bookmark, thanks

  187. Thanks-a-mundo for the post.Really looking forward to read more. Fantastic.

  188. Tattoo Artist说道:

    Im thankful for the post.Thanks Again. Much obliged.

  189. link vao 188bet说道:

    you all find lots of superior family resorts that you can come across both online and offline, some are pretty cheap also..

  190. qui forme. De plus cela le monde dans, expose qu aavant de c?ur bois le, le monde et et et de lotophages

  191. ceti说道:

    This design is steller! You definitely know how to keep

  192. this wonderful read!! I definitely really liked every little

  193. casino说道:

    Really appreciate you sharing this blog post.Much thanks again. Great.

  194. The most effective magic formula for the men you can explore as we speak.

  195. It as not that I want to replicate your web site, but I really like the design. Could you tell me which style are you using? Or was it tailor made?

  196. This genuinely answered my predicament, thank you!

  197. coupon说道:

    Incredible! This blog looks just like my old one! It as on a completely different subject but it has pretty much the same page layout and design. Great choice of colors!

  198. escorts sydney说道:

    I was suggested this website by my cousin. I am not sure whether this post is written by him as nobody else know such detailed about my trouble. You are incredible! Thanks!

  199. This is a really good tip particularly to those new to the blogosphere. Brief but very accurate information Thank you for sharing this one. A must read article!

  200. crypto说道:

    Spot on with this write-up, I actually suppose this web site wants far more consideration. I all probably be again to learn far more, thanks for that info.

  201. I truly appreciate this post. I have been looking everywhere for this! Thank God I found it on Google. You ave made my day! Thanks again!

  202. Just discovered this blog through Yahoo, what a pleasant surprise!

  203. Very good post.Really thank you! Will read on

  204. What kind of digicam was used? That is a really good good quality.

  205. Miami Escorts说道:

    It?s an important Hello! Wonderful post! Please when I could see a follow up!

  206. Major thanks for the article post.Much thanks again. Want more.

  207. Im grateful for the blog article.Really thank you! Will read on

  208. This is really interesting, You are a very skilled blogger. I ave joined your feed and look forward to seeking more of your great post. Also, I have shared your site in my social networks!

  209. escorts sydney说道:

    This is very interesting, You are a very skilled blogger. I have joined your feed and look forward to seeking more of your wonderful post. Also, I have shared your site in my social networks!

  210. Spot on with this write-up, I truly think this web site wants way more consideration. I?ll probably be once more to learn way more, thanks for that info.

  211. Thanks for the article post.Really thank you!

  212. This is one awesome post.Really looking forward to read more. Really Cool.

  213. 먹튀검증说道:

    Major thankies for the article.Really looking forward to read more. Really Cool.

  214. you may have an ideal blog here! would you prefer to make some invite posts on my blog?

  215. rencontre gratuit en belge How to get your customized blogspot to appear on google search?

  216. magnificent points altogether, you just gained a new reader. What would you suggest about your post that you made some days ago? Any positive?

  217. This is really interesting, You are a very skilled blogger. I ave joined your rss feed and look forward to seeking more of your excellent post. Also, I have shared your site in my social networks!

  218. Very nice post. I just stumbled upon your weblog and wished to say that I ave truly enjoyed browsing your blog posts. After all I will be subscribing to your feed and I hope you write again very soon!

  219. Say, you got a nice blog.Really looking forward to read more. Awesome.

  220. viagra for women说道:

    this. Please let me know if you run into anything. I truly enjoy reading your blog and I look forward

  221. Superb Article My brother suggested I might like this web site. He was totally right. This post truly made my day. You can not imagine simply how much time I had spent for this info! Thanks!

  222. cheap mp3说道:

    topic. I needs to spend some time learning much more

  223. School说道:

    Very good write-up. I definitely love this site. Keep writing!

  224. Whispering Misty So sorry you will pass up the workshop!

  225. Just Browsing While I was surfing today I saw a excellent post concerning

  226. TSC说道:

    Spot on with this write-up, I really suppose this website needs much more consideration. I?ll most likely be again to read much more, thanks for that info.

  227. very handful of internet sites that take place to become in depth below, from our point of view are undoubtedly well worth checking out

  228. Pas si sAаЂа›r si ce qui est dit sera mis en application.

  229. 토토사이트说道:

    Very good blog article.Really looking forward to read more. Will read on

  230. This is a very good tip particularly to those fresh to the blogosphere. Simple but very accurate info Many thanks for sharing this one. A must read post!

  231. 바다이야기说道:

    When I initially commented I clicked the Notify me when new comments are added checkbox and now each time a comment

  232. Usually I do not learn article on blogs, but I wish to say that this write-up very pressured me to take a look at and do so! Your writing style has been amazed me. Thank you, very nice article.

  233. You have noted very interesting details! ps decent site.

  234. Im grateful for the post.Really thank you! Fantastic.

  235. This is a great tip especially to those fresh to the blogosphere. Short but very precise information Appreciate your sharing this one. A must read post!

  236. nonton movie说道:

    To create a such kind of article is really amazing,I daily read your blogs and give my announcement for that here this article is too great and so entertaining.

  237. 토토 사이트说道:

    You made some good points there. I did a search on the issue and found most people will go along with with your website.

  238. 안전 놀이터说道:

    You made some decent factors there. I looked on the internet for the difficulty and located most people will go together with along with your website.

  239. You have made some really good points there. I checked on the web for additional information about the issue and found most individuals will go along with your views on this site.

  240. Rodrigo Gacad说道:

    I have been absent for a while, but now I remember why I used to love this web site. Thank you, I will try and check back more frequently. How frequently you update your site?

  241. 토토 사이트说道:

    Thank you for some other wonderful post. Where else may just anybody get that type of info in such an ideal way of writing? I have a presentation subsequent week, and I am on the search for such info.

  242. It as enormous that you are getting ideas from this piece of writing as well as from our argument made at this place.

  243. 다자바说道:

    Your style is so unique in comparison to other people I ave read stuff from.

  244. Really informative post.Really looking forward to read more. Really Cool.

  245. I think this is a real great post.Much thanks again. Fantastic.

  246. very good publish, i actually love this web site, carry on it

  247. 토토 사이트说道:

    Thanks-a-mundo for the blog post. Awesome.

  248. Really appreciate you sharing this article post.Thanks Again. Cool.

  249. I think other site proprietors should take this site as an model, very clean and wonderful user friendly style and design, as well as the content. You are an expert in this topic!

  250. Thanks you\аЂ аЂа›Buy Generic Viagra\аЂ аЂа›.

  251. 토토사이트说道:

    Looking around While I was surfing yesterday I saw a great post about

  252. 바다이야기说道:

    Thanks for the blog post.Much thanks again. Great.

  253. 다잡아说道:

    It is actually difficult to acquire knowledgeable folks using this subject, but the truth is could be observed as did you know what you are referring to! Thanks

  254. You ought to be a part of a contest for one of the best websites on the net. I will recommend this web site!

  255. Where are some good places to get good free blogger templates?. I know of pyzam but I would like to search others, what are some good sites?.

  256. Major thankies for the blog.Thanks Again. Great.

  257. Thank you for sharing your thoughts. I really appreciate your efforts and I will be waiting for your next post thanks once again.

  258. Very good article. I will be dealing with a few of these issues as well..

  259. 먹튀검증단说道:

    The following recommendation is about sleeping estoy haciendo

  260. xlxx porn说道:

    Manningham, who went over the michael kors handbags.

  261. Tattoo Studio说道:

    Looking forward to reading more. Great article.Much thanks again. Really Cool.

  262. Wow! Thank you! I constantly wanted to write on my website something like that. Can I include a fragment of your post to my blog?

  263. 먹튀검증说道:

    Your style is really unique in comparison to other people I ave read stuff from. Thanks for posting when you ave got the opportunity, Guess I all just book mark this blog.

  264. 먹튀검증说道:

    Thanks, Your post Comfortably, the article

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>