Phân biệt giữa Statement và PreparedStatement [JDBC trong Java]

Nói về Statement và PreparedStatement [Tất cả trong một – JDBC trong Java]

Written by IT Phú Trần on 27/06/2019 in Câu hỏi phỏng vấn and JDBC trong JAVA and LẬP TRÌNH JAVA with 119 comments.

Nếu bạn đã làm việc với java kết nối cơ sở dữ liệu bằng API JDBC thì bạn có thể biết rằng API JDBC cung cấp ba dạng interface để gửi câu lệnh SQL đến cơ sở dữ liệu và thực thi truy vấn, 3 interface này có tên là Statement , PreparedStatement và CallableStatement . Đầu tiên, Statement được sử dụng để thực thi các truy vấn SQL thông thường, ví dụ: chọn Count (*) từ các khóa học. Bạn cũng có thể sử dụng nó để thực thi các câu lệnh DDL, DML và DCL SQL. Với PreparedStatement chuyên dùng để thực hiện các truy vấn được tham số hóa, ví dụ: chọn * từ các khóa học trong đó CourseId =?, bạn có thể thực thi SQL này nhiều lần bằng cách thay đổi các tham số khóa học. Chúng được biên dịch và lưu trữ vào cuối cơ sở dữ liệu, do đó khá nhanh để thực hiện lặp lại.

Thành viên thứ ba của gia đình có nhiệm vụ chức năng tương tự này là CallableStatement , có mặt để thực thi hoặc gọi sử dụng stored procedures.

Vì vậy, bạn thấy, mỗi lớp thực hiện một chức năng ý nghĩa khác nhau, có một mục đích khác nhau và bạn nên sử dụng chúng cho những gì chúng đã thiết kế cho. Điều rất quan trọng là phải hiểu chúng là gì và mục đích của chúng là gì, cùng với cách sử dụng nó một cách chính xác.

Trong bài viết này, tôi sẽ tập trung vào việc tìm hiểu sự khác biệt giữa hai thành viên đầu tiên của gia đình này, Statement và PreparedStatement , để bạn có thể sử dụng chúng một cách hiệu quả.


Sự khác biệt giữa Statement vs PreparedStatement

Dù sao, không lãng phí thêm thời gian của bạn, hãy xem một số khác biệt chính giữa hai lớp này, chúng dựa trên cú pháp, mục đích, hiệu suất, bảo mật và khả năng.

1. Mục đích

Mục đích duy nhất của PreparedStatement là thực hiện các truy vấn liên kết. Nếu bạn cần thực hiện một truy vấn nhiều lần chỉ với các dữ liệu khác nhau thì hãy sử dụng PreparedStatement và sử dụng trình giữ chỗ, ký hiệu dấu hỏi (?) cho dữ liệu biến truyền vào tham số ? đó.

Khi bạn lần đầu tiên thực hiện truy vấn câu lệnh SQL.SQL đã chuẩn bị, cơ sở dữ liệu sẽ biên dịch nó và lưu trữ nó để sử dụng lại trong tương lai, lần sau bạn gọi cùng một truy vấn nhưng với một tham số khác, thì cơ sở dữ liệu sẽ trả về kết quả gần như ngay lập tức. Do quá trình biên dịch trước này, lớp này được gọi là PreparedStatement trong Java.

Rất hữu ích để xây dựng tìm kiếm và chèn truy vấn, ví dụ: nếu ứng dụng của bạn cung cấp giao diện để tìm kiếm một số dữ liệu, ví dụ: bạn cần tìm kiếm cho khóa học, trong đó có thể tìm theo tên khóa học, giá khóa học và tác giả người hướng dẫn. Bạn có thể tạo PreparedStatement để xử lý việc tìm kiếm đó để có hiệu suất tốt hơn.

Mặt khác, mục đích duy nhất của đối tượng Statement là thực thi truy vấn SQL . Bạn cung cấp cho họ bất kỳ truy vấn nào và nó sẽ thực hiện nó, nhưng không giống như PreparedStatement , nó sẽ không cung cấp tiền biên dịch.

2. Cú pháp

Cú pháp của Statement giống như truy vấn SQL, bạn thực sự có thể sao chép SQL từ trình soạn thảo SQL yêu thích của mình và chuyển nó dưới dạng String sang Statement để thực thi, nhưng đối với PreparedStatement , bạn cần bao gồm các dấu giữ chỗ hay nói cách khcs là tham số hóa tức là dấu hỏi (?) Trong truy vấn SQL

select count(*) from Books; // Sử dụng Statement để thực thi

select * from Books where book_id=?; // sử dụng PreparedStatement

Giá trị thực được đặt trước khi thực hiện truy vấn trong thời gian chạy bằng cách sử dụng các phương thức setXXX() khác nhau, ví dụ: nếu giữ chỗ tham chiếu đến một cột varchar thì bạn có thể sử dụng phương thức setString (value) để đặt giá trị. Tương tự, nếu giữ chỗ tham chiếu đến một cột số nguyên thì bạn có thể sử dụng phương thức setInt(value).

Bạn có thể xem thêm   Nền tảng Java: Làm việc với Cơ sở dữ liệu Sử dụng  khóa học JDBC trên Pluarlsight để tìm hiểu thêm về cách sử dụng các đối tượng này.

JDBC trong java
JDBC trong java

3. Hiệu suất

Nói chung, PreparedStatement cung cấp hiệu năng tốt hơn đối tượng Statement vì biên dịch trước truy vấn SQL trên máy chủ cơ sở dữ liệu.

Khi bạn sử dụng PreparedStatement, truy vấn được biên dịch lần đầu tiên nhưng sau đó nó được lưu trữ tại máy chủ cơ sở dữ liệu, làm cho lần chạy tiếp theo nhanh hơn.

Mặt khác, với đối tượng Statement , ngay cả khi bạn thực hiện cùng một truy vấn, chúng luôn được biên dịch trước và sau đó được thực thi, làm cho chúng chậm hơn so với các truy vấn PreparedStatement.

4. Bảo mật

Các PreparedStatement cũng cung cấp an toàn chống SQL injection, nhưng việc sử dụng không đúng cách có thể gây Statement SQL injection . Nếu bạn còn nhớ, nguyên nhân của việc tiêm SQL là mã SQL độc hại do các hacker tiêm vào.

Ví dụ: bạn có thể đã viết truy vấn ở trên trả về một cuốn sách sau khi chuyển Id như dưới đây:

String id = getFromUser();
String SQL = “select * from Books where book_id=” + id;

Nếu bạn chuyển đối tượng SQL này sang đối tượng Statement thì nó có thể gây ra lỗi SQL nếu người dùng gửi mã SQL độc hại dưới dạng id, ví dụ  1 == 1 OR id , sẽ trả về mỗi cuốn sách từ cơ sở dữ liệu.

Mặc dù sách, có thể không phải là dữ liệu nhạy cảm, nó cũng có thể xảy ra với bất kỳ dữ liệu nhạy cảm nào của người dùng. Tuy nhiên với bảng users, lưu trữ danh sách người dùng thì đây thật sự là một vấn đề trở ngại lớn. PreparedStatement bảo vệ chống lại điều này.


Dưới đây là bảng so sánh tổng quan giữa statement và preparedStatement, CallableStatement

Statement PreparedStatement CallableStatement
Nó được sử dụng để thực hiện các truy vấn SQL bình thường. ( truy vấn 1 lần) Được sử dụng để thực hiện các truy vấn SQL được tham số hóa hoặc động. (Truy vấn lặp và thay đổi giá trị) Nó được sử dụng sử dụng để gọi stored procedures.
Nó được ưa thích khi một truy vấn SQL cụ thể chỉ được thực hiện một lần. Nó được ưa thích khi một truy vấn cụ thể được thực hiện nhiều lần. Nó được ưa thích khi gọi stored procedures và functions.
Bạn không thể truyền tham số cho truy vấn SQL bằng giao diện này. Bạn có thể chuyển các tham số cho truy vấn SQL trong thời gian chạy bằng giao diện này.
Giao diện này chủ yếu được sử dụng cho các câu lệnh DDL như CREATE, SELECT khôn có tham số, ALTER, DROP, v.v. Nó được sử dụng cho bất kỳ loại truy vấn SQL nào sẽ được thực hiện nhiều lần. Nó được sử dụng sử dụng để gọi stored procedures.
Hiệu suất của giao diện này rất thấp. Hiệu suất của giao diện này tốt hơn giao diện Statement (khi được sử dụng để thực hiện nhiều truy vấn giống nhau). Hiệu suất của giao diện này cao.

Hiểu thêm và sâu hơn

Statement không thể được sử dụng để lưu trữ / truy xuất hình ảnh và tệp trong cơ sở dữ liệu (nghĩa là sử dụng kiểu dữ liệu BLOB, CLOB) trong java JDBC.
PreparedStatement có thể được sử dụng cho
lưu trữ / truy xuất hình ảnh và
Lưu trữ / truy xuất tệp trong cơ sở dữ liệu
(tức là bằng cách sử dụng các kiểu dữ liệu BLOB, CLOB ) trong java JDBC.
java.sql.Statement không cung cấp phương thức addBatch (), nó chỉ cung cấp phương thức addBatch (String sql).
Do đó, cùng một truy vấn SQL không thể được thực thi lặp lại trong Statement trong java JDBC
java.sql.PreparedStatement mở rộng Statement và kế thừa tất cả các phương thức từ Statement và thêm vào đó phương thức addBatch () .
Phương thức addBatch () – thêm một tập các tham số vào  lệnh của đối tượng PreparedStatement trong java JDBC.
Do đó, cùng một truy vấn SQL có thể được thực thi lặp lại trong PreparedStatement trong java JDBC .
Hiệu suất của giao diện này rất thấp. Hiệu suất của giao diện này tốt hơn giao diện Statement (khi được sử dụng để thực hiện nhiều truy vấn giống nhau). Hiệu suất của giao diện này cao.



5. Chứng minh SQL Injection với Statement cực kỳ nguy hiểm và khuyến cáo không nên dùng nối chuỗi hay truyền tham số vào câu lệnh truy vấn

Chuẩn bị cơ sở dự liệu với table users:

Chứng minh và ví dụ về SQL Injection
Chứng minh và ví dụ về SQL Injection

Thông thường khi đăng nhập ta có form login để đăng nhập vào trang cá nhân hay trang quản trị viên nào đó, đòi hỏi các bạn cần nhập thông tin username cũng như password vào.

Form login
Form login

Chẳng hạn như một trường hợp tôi đã biết được username của người dùng hoặc thông thường với một table users ta luôn có tài khoản username có tên là admin.

Trường hợp tôi là môt người dùng cố tính truy cập vào một tài khoản khi chưa biết mật khẩu. Các bạn tin không nếu tôi có thể đăng nhập vào được nhỉ?

Tôi đoán rằng với câu lệnh kiểm tra đăng nhập vào đúng sai như sau:

String sql = “SELECT * FROM users WHERE username = ‘”+username + “‘ AND password = ‘”+password+”‘”;

câu lệnh truy vấn trên chúng ta đang nối chuỗi với các biến bằng cách sử dụng dấu + trong java như chúng ta đã biết.

Giải thích câu lệnh truy vấn trên như sau:

Câu lệnh truy vấn trên dùng đẻ kiểm tra đăng nhập vào thành công hay không. Với hai tham số: username và password là hai biến tương ứng hai giá trị khi người dùng nhập vào form.Có hai trường hợp xảy ra:

TH1:  Người dùng đăng nhập sai, nghĩa là password hoặc username sai, thì lúc này tất nhiên trả về 1 bảng tạm không có dòng dữ liệu nào. Khi các bạn viết phương thức trong java thì sẽ trả về một object User. Tương ứng trường hợp này user đang bằng null.

TH2:  Người dùng đăng nhập sai, nghĩa là password và username đúng, thì lúc này tất nhiên trả về 1 bảng tạm  có lớn hơn 1 dòng dữ liệu. Khi các bạn viết phương thức trong java thì sẽ trả về một object User. Tương ứng trường hợp này user đang khác bằng null.

Dựa vào câu lệnh truy vấn trên tôi có thể nhập vào thông tin của username và password như sau.

Test:username : adminpassword: password’ || ‘1

Như vậy câu lệnh SQL trên tương ứng như sau:

String sql = “SELECT * FROM users WHERE username = ‘admin’
AND password =
‘password’ || ‘1’ “;

Khi truy vấn và thực hiện câu lệnh SQL trên, kết quả trả về như sau:

Như các bạn thấy, mặc dù tôi không biết password của username là admin nhưng tôi có thể đoán được và có thể login thành công.

Đây được gọi là SQL Injection, SQL.

Định nghĩa: 

SQL injection là một kỹ thuật cho phép những kẻ tấn công lợi dụng lỗ hổng của việc kiểm tra dữ liệu đầu vào trong các ứng dụng web và các thông báo lỗi của hệ quản trị cơ sở dữ liệu trả về để inject (tiêm vào) và thi hành các câu lệnh SQL bất hợp pháp. SQL injection có thể cho phép những kẻ tấn công thực hiện các thao tác, delete, insert, update, v.v. trên cơ sở dữ liệu của ứng dụng, thậm chí là server mà ứng dụng đó đang chạy. SQL injection thường được biết đến như là một vật trung gian tấn công trên các ứng dụng web có dữ liệu được quản lý bằng các hệ quản trị cơ sở dữ liệu như SQL Server, MySQL, Oracle, DB2, Sysbase…

Như vậy, các bạn thấy tác hại và hạn chế khi sử dụng Statement chưa?

Statement không có tham số hóa ? nên muốn truyền vào tham số chúng ta cần thêm dấu + để nối với 1 biến nào đó. Từ đó hacker hay người dùng xấu có thể cố tình và  truy cập đăng nhập thành công.

Vậy PreparedStatement sinh ra để khắc phục nhược điểm trên, các bạn chỉ cần truyền vào câu lệnh SQL trên như sau:

String sql = “SELECT * FROM users WHERE username = ? AND password =  ?”;

Từ đó ta có thể set giá trị cho các biến được tham số hóa dấu ?.

PreparedStatement sẽ tự loại bỏ những ký tự đặc biệt và phù hợp với câu lệnh truy vấn của bạn, tránh xảy ra SQL Injection.


6. Chứng minh về hiệu suất của Statement và PreparedStatement 

Các bạn có thể review đoạn code bên dưới để kiểm chứng:

File : TestDemo.java

File : Category.java

Bên dưới là kết quả:

Như vậy các bạn có thể thấy, đối với những trường hợp truy vấn với SELECT không có điều kiện WHERE hay những câu lệnh không có tham số và chỉ truy vấn một lần duy nhất mà không lặp thì nên sử dụng Statement, còn lại đối với những trường hợp lặp lại câu lệnh truy vấn và chỉ thay đổi giá trị, hoặc đối với những trường hợp có tham số thì nên sử dụng PreparedStatement.

7. Tổng kết

Đó là tất cả về sự khác biệt giữa Statement và PreparedStatement trong Java . Bạn có thể sử dụng Statement để thực thi các truy vấn sử dụng một lần, trong trường hợp sử dụng câu lệnh SQL đó nhiều lần chỉ thay đổi dữ liệu sau mỗi lần truy vấn thì điều đó không được khuyến khích.Sử dụng PreparedStatement, cách tiếp cận nhanh hơn và an toàn hơn để lấy dữ liệu từ cơ sở dữ liệu. Nếu bạn phải truyền tham số luôn sử dụng PreparedStatment, cũng như dùng câu lệnh SQL đó nhiều lần. Không bao giờ tạo truy vấn SQL động bằng cách nối chuỗi, điều đó không an toàn và dễ bị tấn công SQL Injection.

119 Responses to “Nói về Statement và PreparedStatement [Tất cả trong một – JDBC trong Java]

  1. I simply want to mention I am just very new to blogs and honestly loved you’re blog site. More than likely I’m want to bookmark your blog . You definitely have good stories. With thanks for revealing your blog.

  2. Thanks for discussing your ideas. I’d personally also like to state that video games have been at any time evolving. Technology advances and enhancements have assisted create realistic and enjoyable games. These entertainment video games were not as sensible when the concept was being tried out. Just like other kinds of technological innovation, video games also have had to evolve through many ages. This is testimony for the fast progression of video games.

  3. Together with almost everything that seems to be building inside this specific area, a significant percentage of opinions are actually rather exciting. However, I am sorry, but I do not give credence to your whole strategy, all be it exciting none the less. It would seem to everyone that your comments are actually not completely justified and in simple fact you are your self not even entirely convinced of your point. In any event I did appreciate reading through it.

  4. Hello there! This blog post could not be written much better! Looking at this post reminds me of my previous roommate! He constantly kept talking about this. I will forward this information to him. Fairly certain he’ll have a very good read. Thanks for sharing!

  5. I absolutely love your website.. Great colors & theme. Did you make this amazing site yourself? Please reply back as I’m looking to create my own personal blog and want to learn where you got this from or just what the theme is called. Appreciate it.

  6. I absolutely love your site.. Very nice colors & theme. Did you make this website yourself? Please reply back as I’m looking to create my own personal blog and want to know where you got this from or exactly what the theme is named. Cheers.

  7. Faytech North America is a touch screen Manufacturer of both monitors and pcs. They specialize in the design, development, manufacturing and marketing of Capacitive touch screen, Resistive touch screen, Industrial touch screen, IP65 touch screen, touchscreen monitors and integrated touchscreen PCs. Contact them at http://www.faytech.us, 121 Varick Street, New York, NY 10013, +1 646 205 3214.

  8. Sapid Agency is a Search Engine Optimization company in New York City that provides SEO Services. Their proprietary SEO strategies help struggling websites and aspiring business owners to rank their websites higher in multiple search engines like Google , Yahoo and Bing. They provide local and gmb map ranking for businesses in NYC and many other local areas. Find more at https://www.sapidagency.com/ @ 145 E 57TH NEW YORK, NY 10022, USA, +1 971 341 5608 USA

  9. After I initially commented I appear to have clicked on the -Notify me when new comments are added- checkbox and now every time a comment is added I recieve 4 emails with the exact same comment. Perhaps there is an easy method you are able to remove me from that service? Thanks.

  10. This is the perfect web site for everyone who wants to find out about this topic. You know a whole lot its almost tough to argue with you (not that I really will need to…HaHa). You certainly put a fresh spin on a topic that has been discussed for a long time. Great stuff, just wonderful.

  11. Right here is the right webpage for everyone who really wants to find out about this topic. You understand so much its almost hard to argue with you (not that I personally will need to…HaHa). You definitely put a fresh spin on a topic which has been discussed for a long time. Excellent stuff, just great.

  12. An outstanding share! I have just forwarded this onto a friend who was conducting a little homework on this. And he actually bought me breakfast simply because I found it for him… lol. So let me reword this…. Thank YOU for the meal!! But yeah, thanks for spending the time to discuss this topic here on your website.

  13. I’m extremely pleased to uncover this page.
    I need to to thank you for your time for this particularly wonderful read!!
    I definitely liked every bit of it and i also have you book marked to
    see new information in your web site.

  14. Nice blog here! Also your site loads up fast! What host are
    you the use of? Can I get your associate hyperlink to your host?

    I desire my site loaded up as quickly as yours lol

  15. Everything is very open with a clear explanation of the issues.

    It was definitely informative. Your website is very helpful.
    Thanks for sharing!

  16. This article offers clear idea for the new people of blogging, that really how to do blogging and site-building.

  17. I loved as much as you’ll receive carried out right here.
    The sketch is attractive, your authored material stylish.
    nonetheless, you command get bought an nervousness over that you wish be delivering the
    following. unwell unquestionably come more formerly again since exactly the same nearly a lot often inside case you shield this
    hike.

  18. Thank you for some other great post. The place else may anyone get that kind of info in such an ideal means of writing?
    I’ve a presentation next week, and I’m on the search for such information.

  19. Great blog right here! Additionally your website quite a bit up fast!
    What web host are you the use of? Can I am getting your affiliate hyperlink on your host?
    I wish my web site loaded up as fast as yours lol

  20. Hi, i feel that i saw you visited my website thus i got here to return the desire?.I’m attempting to
    find things to improve my web site!I guess its
    adequate to make use of some of your ideas!!

  21. It’s remarkable to pay a visit this site and
    reading the views of all colleagues regarding this paragraph, while I am
    also zealous of getting know-how.

  22. With havin so much written content do you ever run into any issues of plagorism or copyright
    infringement? My blog has a lot of unique content I’ve either written myself or outsourced but it appears a
    lot of it is popping it up all over the web without my authorization. Do
    you know any methods to help prevent content from being ripped off?

    I’d definitely appreciate it.

  23. Hello There. I discovered your weblog the usage of msn. That is a really well written article.
    I will make sure to bookmark it and return to learn more of your helpful information. Thank you for the post.

    I will definitely comeback.

  24. It’s the best time to make some plans for the future and it is time to be happy.
    I’ve read this post and if I could I wish to suggest you some interesting things
    or tips. Perhaps you can write next articles referring to this article.
    I wish to read more things about it!

  25. Hi to every single one, it’s truly a pleasant for me to pay a visit this website, it contains
    priceless Information.

  26. These are truly great ideas in about blogging. You have touched some good factors here.
    Any way keep up wrinting.

  27. Hello, i think that i saw you visited my site so i came to go back the want?.I’m attempting to find things to enhance my web site!I
    guess its adequate to make use of a few of your ideas!!

  28. Hi to every body, it’s my first pay a visit of
    this blog; this web site carries amazing and actually good
    material designed for readers.

  29. An impressive share! I have just forwarded this onto a colleague who has been doing a little homework on this. And he actually bought me dinner due to the fact that I discovered it for him… lol. So allow me to reword this…. Thanks for the meal!! But yeah, thanx for spending time to talk about this topic here on your web page.

  30. My partner and I stumbled over here coming from a different page and thought I might check
    things out. I like what I see so i am just
    following you. Look forward to looking at your
    web page repeatedly.

  31. I’m amazed, I must say. Rarely do I encounter a blog that’s both educative and engaging, and
    let me tell you, you have hit the nail on the head. The problem is something which not enough men and
    women are speaking intelligently about. I’m very happy that I came across this
    during my hunt for something relating to this.

  32. Awesome issues here. I am very satisfied to look your post.
    Thank you a lot and I am taking a look forward to
    contact you. Will you kindly drop me a e-mail?

  33. First of all I want to say excellent blog! I had a quick question in which I’d like to
    ask if you do not mind. I was curious to know how you center yourself and clear your head prior to writing.
    I’ve had a difficult time clearing my mind in getting my ideas out.
    I do take pleasure in writing but it just seems like the
    first 10 to 15 minutes are generally lost just trying to figure out
    how to begin. Any ideas or tips? Thank you!

  34. Oh my goodness! Incredible article dude! Many thanks, However I am going through
    problems with your RSS. I don’t know the reason why I can’t join it.
    Is there anyone else having the same RSS problems?
    Anyone that knows the answer can you kindly respond? Thanx!!

  35. Hi there! I could have sworn I’ve been to this site before but after going through some of the articles I realized it’s new to me. Anyways, I’m certainly delighted I found it and I’ll be bookmarking it and checking back frequently.

  36. I was more than happy to uncover this website. I wanted to thank you for ones time for this fantastic read!! I definitely savored every little bit of it and I have you saved as a favorite to look at new information on your website.

  37. Neat blog! Is your theme custom made or did you download it from somewhere?

    A design like yours with a few simple tweeks would really make my blog
    jump out. Please let me know where you got your design. Thanks a lot

  38. Today, I went to the beachfront with my kids.
    I found a sea shell and gave it to my 4 year old daughter and said “You can hear the ocean if you put this to your ear.” She put the
    shell to her ear and screamed. There was a hermit crab inside and it pinched her ear.
    She never wants to go back! LoL I know this is entirely off topic but I had to tell someone!

  39. I have read so many content on the topic of the blogger lovers
    except this piece of writing is actually a pleasant article,
    keep it up.

  40. Howdy! This post couldn’t be written much better! Going through this post reminds me of my previous roommate! He continually kept preaching about this. I will forward this information to him. Fairly certain he’ll have a good read. Thanks for sharing!

  41. Good post. I learn something totally new and challenging on blogs I stumbleupon on a daily basis. It’s always useful to read through articles from other writers and use a little something from their websites.

  42. Oh my goodness! Impressive article dude! Thanks, However I am encountering issues with your RSS. I don’t understand the reason why I am unable to subscribe to it. Is there anybody else having identical RSS issues? Anyone who knows the answer can you kindly respond? Thanx.

  43. Howdy! This blog post couldn’t be written much better! Looking through this article reminds me of my previous roommate! He always kept talking about this. I am going to send this post to him. Pretty sure he’ll have a great read. I appreciate you for sharing!

  44. I’m very happy to uncover this page. I wanted to thank you for ones time for this wonderful read!! I definitely savored every little bit of it and I have you saved to fav to look at new things in your blog.

  45. Excellent site you have here.. It’s difficult to find high-quality writing like yours nowadays. I honestly appreciate individuals like you! Take care!!

  46. I really like your blog.. very nice colors & theme.
    Did you create this website yourself or did you hire someone to do it for you?
    Plz respond as I’m looking to design my own blog and would like to know where u got
    this from. appreciate it

  47. Good web site you have here.. It’s difficult to find high quality writing like yours nowadays. I truly appreciate people like you! Take care!!

  48. You’ve made some really good points there. I checked on the internet to find out more about the issue and found most people will go along with your views on this website.

  49. I’m amazed, I must say. Rarely do I encounter a blog that’s equally educative and amusing, and without a doubt, you’ve hit the nail on the head. The issue is something that too few folks are speaking intelligently about. I am very happy I stumbled across this in my hunt for something regarding this.

  50. MetroClick specializes in building completely interactive products like Photo Booth for rental or sale, Touch Screen Kiosks, Large Touch Screen Displays , Monitors, Digital Signages and experiences. With our own hardware production facility and in-house software development teams, we are able to achieve the highest level of customization and versatility for Photo Booths, Touch Screen Kiosks, Touch Screen Monitors and Digital Signage. Visit MetroClick in NYC at http://www.metroclick.com/ or , 121 Varick St, New York, NY 10013, +1 646-843-0888.

  51. You’re so awesome! I don’t believe I have read through anything like that before. So nice to discover another person with a few original thoughts on this subject. Really.. thank you for starting this up. This site is something that’s needed on the internet, someone with a bit of originality.

  52. Hello there! I could have sworn I’ve visited this web site before but after browsing through a few of the posts I realized it’s new to me. Anyhow, I’m definitely delighted I discovered it and I’ll be bookmarking it and checking back regularly.

  53. Oh my goodness! Incredible article dude! Thank you so much, However I am experiencing problems with your RSS. I don’t know why I can’t join it. Is there anybody having identical RSS issues? Anybody who knows the solution can you kindly respond? Thanks!

  54. Your style is so unique in comparison to other people I have read stuff from. Many thanks for posting when you have the opportunity, Guess I’ll just bookmark this site.

  55. Nice post. I learn something totally new and challenging on websites I stumbleupon everyday. It will always be exciting to read content from other authors and use something from other sites.

  56. Greetings! Very helpful advice within this article! It is the little changes that produce the most important changes. Thanks for sharing!

  57. Hi, I do think this is a great site. I stumbledupon it 😉 I will revisit once again since i have book-marked it. Money and freedom is the best way to change, may you be rich and continue to help other people.

  58. Oh my goodness! Incredible article dude! Thanks, However I am having difficulties with your RSS. I don’t know the reason why I am unable to subscribe to it. Is there anyone else getting the same RSS problems? Anyone that knows the solution will you kindly respond? Thanks!!

  59. Hello! I could have sworn I’ve visited your blog before but after browsing through many of the posts I realized it’s new to me. Regardless, I’m certainly happy I came across it and I’ll be bookmarking it and checking back regularly.

  60. The very next time I read a blog, I hope that it doesn’t disappoint me as much as this particular one. After all, Yes, it was my choice to read through, however I genuinely thought you’d have something interesting to say. All I hear is a bunch of moaning about something you could fix if you weren’t too busy searching for attention.

  61. I absolutely love your blog.. Great colors & theme. Did you create this amazing site yourself? Please reply back as I’m planning to create my very own website and would love to find out where you got this from or just what the theme is called. Thank you!

  62. I’m pretty pleased to uncover this great site. I want to to thank you for your time for this particularly wonderful read!! I definitely savored every part of it and I have you bookmarked to look at new stuff on your blog.

  63. Oh my goodness! Amazing article dude! Thanks, However I am having difficulties with your RSS. I don’t understand the reason why I am unable to subscribe to it. Is there anybody else having identical RSS issues? Anybody who knows the answer can you kindly respond? Thanks!

  64. Everything is very open with a clear description of the issues. It was definitely informative. Your site is useful. Thanks for sharing.

  65. I really like reading through an article that can make men and women think. Also, many thanks for allowing for me to comment.

  66. Hello there! I could have sworn I’ve been to this web site before but after looking at many of the articles I realized it’s new to me. Nonetheless, I’m definitely delighted I stumbled upon it and I’ll be book-marking it and checking back regularly.

  67. Hi there! This post could not be written much better! Reading through this post reminds me of my previous roommate! He constantly kept preaching about this. I’ll send this post to him. Pretty sure he’s going to have a great read. Thank you for sharing!

  68. I was more than happy to find this web site. I want to to thank you for your time for this particularly wonderful read!! I definitely really liked every bit of it and i also have you saved as a favorite to see new things in your blog.

  69. I’m amazed, I must say. Seldom do I encounter a blog that’s both equally educative and engaging, and without a doubt, you have hit the nail on the head. The problem is something that too few folks are speaking intelligently about. Now i’m very happy I stumbled across this in my hunt for something regarding this.

  70. An outstanding share! I have just forwarded this onto a colleague who has been doing a little homework on this. And he actually ordered me dinner due to the fact that I stumbled upon it for him… lol. So allow me to reword this…. Thanks for the meal!! But yeah, thanx for spending time to talk about this topic here on your blog.

  71. Greetings, I believe your website could possibly be having browser compatibility problems. When I take a look at your site in Safari, it looks fine however when opening in I.E., it’s got some overlapping issues. I just wanted to provide you with a quick heads up! Besides that, great website.

  72. I absolutely love your website.. Very nice colors & theme. Did you build this site yourself? Please reply back as I’m hoping to create my own personal website and would love to find out where you got this from or just what the theme is called. Thank you.

  73. Oh my goodness! Amazing article dude! Thanks, However I am encountering issues with your RSS. I don’t understand why I cannot subscribe to it. Is there anybody else having identical RSS problems? Anyone that knows the solution will you kindly respond? Thanx.

  74. Oh my goodness! Incredible article dude! Thank you so much, However I am experiencing problems with your RSS. I don’t understand the reason why I can’t subscribe to it. Is there anyone else having identical RSS problems? Anybody who knows the answer will you kindly respond? Thanx.

  75. Google

    We prefer to honor many other internet internet sites on the web, even when they aren’t linked to us, by linking to them. Beneath are some webpages worth checking out.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *