aboutsummaryrefslogtreecommitdiff
path: root/content/blog/2021-04-23-php-comment-system.org
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2025-11-11 21:25:46 -0600
committerChristian Cleberg <[email protected]>2025-11-11 21:25:46 -0600
commitce7749abd0114d836d116ecbeb001d0a3827be3b (patch)
treefa74563f278197e81e8928aa322d132013b958d5 /content/blog/2021-04-23-php-comment-system.org
parentaf67e996dc93ade1acd4eed47d25da55c0c63b50 (diff)
downloadcleberg.net-ce7749abd0114d836d116ecbeb001d0a3827be3b.tar.gz
cleberg.net-ce7749abd0114d836d116ecbeb001d0a3827be3b.tar.bz2
cleberg.net-ce7749abd0114d836d116ecbeb001d0a3827be3b.zip
fix grammar in 2021 posts
Diffstat (limited to 'content/blog/2021-04-23-php-comment-system.org')
-rw-r--r--content/blog/2021-04-23-php-comment-system.org177
1 files changed, 83 insertions, 94 deletions
diff --git a/content/blog/2021-04-23-php-comment-system.org b/content/blog/2021-04-23-php-comment-system.org
index c00cb75..33ba763 100644
--- a/content/blog/2021-04-23-php-comment-system.org
+++ b/content/blog/2021-04-23-php-comment-system.org
@@ -5,84 +5,79 @@
* The Terrible-ness of Commenting Systems
-The current state of affairs regarding interactive comment systems is,
-well, terrible. It is especially awful if you're a privacy conscious
-person who does not generally load third-party scripts or frames on the
-websites you visit.
+The current state of affairs regarding interactive comment systems is, well,
+terrible. It is especially awful if you're a privacy conscious person who does
+not generally load third-party scripts or frames on the websites you visit.
-Even further, many comment systems are charging exorbitant fees for
-something that should be standard.
+Even further, many comment systems are charging exorbitant fees for something
+that should be standard.
Of course, there are some really terrible options:
- Facebook Comments
- Discourse
-There are some options that are better but still use too many scripts,
-frames, or social integrations on your web page that could impact some
-users:
+There are some options that are better but still use too many scripts, frames,
+or social integrations on your web page that could impact some users:
- Disqus
- Isso
- Remark42
-Lastly, I looked into a few unique ways of generating blog comments,
-such as using Twitter threads or GitHub issues to automatically post
-issues. However, these both rely on external third-party sites that I
-don't currently use.
+Lastly, I looked into a few unique ways of generating blog comments, such as
+using Twitter threads or GitHub issues to automatically post issues. However,
+these both rely on external third-party sites that I don't currently use.
* Stay Static with Server-Side Comments
-The main issue for my personal use-case is that my blog is completely,
-100% static. I use PHP on the back-end but website visitors only see
-HTML and a single CSS file. No external javascript and no embedded
-frames.
+The main issue for my personal use-case is that my blog is completely, 100%
+static. I use PHP on the back-end but website visitors only see HTML (Hypertext
+Markup Language) and a single CSS (Cascading Style Sheets) file. No external
+JavaScript and no embedded frames.
-So, how do we keep a site static and still allow users to interact with
-blog posts? The key actually pretty simple - I'm already using PHP, so
-why not rely on the classic HTML =<form>= and a PHP script to save the
-comments somewhere? As it turns out, this was a perfect solution for me.
+So, how do we keep a site static and still allow users to interact with blog
+posts? The key actually pretty simple - I'm already using PHP, so why not rely
+on the classic HTML =<form>= and a PHP script to save the comments somewhere? As
+it turns out, this was a perfect solution for me.
-The second issue for my personal use-case is that I am trying to keep
-the contents of my website accessible over time, as described by
-[cite/t:@brandur], in his post entitled
-[[https://brandur.org/fragments/graceful-degradation-time][Blog with
-Markdown + Git, and degrade gracefully through time]] .
+The second issue for my personal use-case is that I am trying to keep the
+contents of my website accessible over time, as described by [cite/t:@brandur],
+in his post entitled [[https://brandur.org/fragments/graceful-degradation-time][Blog with Markdown + Git, and degrade gracefully through
+time]] .
-This means I cannot rely on a database for comments, since I do not rely
-on a database for any other part of my websites.
+This means I cannot rely on a database for comments, since I do not rely on a
+database for any other part of my websites.
-I blog in plain Markdown files, commit all articles to Git, and ensure
-that future readers will be able to see the source data long after I'm
-gone, or the website has gone offline. However, I still haven't
-committed any images served on my blog to Git, as I'm not entirely sold
-on Git LFS yet - for now, images can be found at
-[[https://img.cleberg.net][img.cleberg.net]].
+I blog in plain Markdown files, commit all articles to Git, and ensure that
+future readers will be able to see the source data long after I'm gone, or the
+website has gone offline. However, I still haven't committed any images served
+on my blog to Git, as I'm not entirely sold on Git LFS (large file storage)
+yet - for now, images can be found at [[https://img.cleberg.net][img.cleberg.net]].
-Saving my comments back to the Git repository ensures that another
-aspect of my site will degrade gracefully.
+Saving my comments back to the Git repository ensures that another aspect of my
+site will degrade gracefully.
* Create a Comment Form
-Okay, let's get started. The first step is to create an HTML form that
-users can see and utilize to submit comments. This is fairly easy and
-can be changed depending on your personal preferences.
+Okay, let's get started. The first step is to create an HTML form that users can
+see and utilize to submit comments. This is fairly easy and can be changed
+depending on your personal preferences.
-Take a look at the code block below for the form I currently use. Note
-that =<current-url>= is replaced automatically in PHP with the current
-post's URL, so that my PHP script used later will know which blog post
-the comment is related to.
+Take a look at the code block below for the form I currently use. Note that
+=<current-url>= is replaced automatically in PHP with the current post's URL
+(uniform resource locator), so that my PHP script used later will know which
+blog post the comment is related to.
The form contains the following structure:
-1. =<form>= - This is the form and will determine which PHP script to
- send the comment to.
-2. =<section hidden>= - This section is hidden from the user and is used
- to ensure that we know which blog post sent the comment.
-3. =<section>= Display Name (Optional) - Used to accept a display name,
- if entered.
-4. =<section>= Comment (Required) - Used to accept the user's full
- comment. Markdown is allowed.
+1. =<form>= - This is the form and will determine which PHP script to send the
+ comment to.
+2. =<section hidden>= - This section is hidden from the user and is used to
+ ensure that we know which blog post sent the comment.
+3. =<section>= Display Name (Optional) - Used to accept a display name, if
+ entered.
+4. =<section>= Comment (Required) - Used to accept the user's full comment.
+ Markdown is allowed.
5. =<button>= - A button to submit the form.
#+begin_src html
@@ -129,25 +124,25 @@ The form contains the following structure:
* Handle Comments via POST
-Now that we have a form and can submit comments, we need to create a PHP
-script so that the server can fetch the comment data and save it. Make
-sure your PHP script name matches the name you entered in the =action=
-field in your form.
+Now that we have a form and can submit comments, we need to create a PHP script
+so that the server can fetch the comment data and save it. Make sure your PHP
+script name matches the name you entered in the =action= field in your form.
-See the code block below for the contents of my =comment.php= script. We
-perform the following tasks in this script:
+See the code block below for the contents of my =comment.php= script. We perform
+the following tasks in this script:
1. Grab the POST data from the HTML form.
2. Sanitize the comment data with =htmlentities=.
3. Set the display name to =Anonymous= if it was left blank.
4. Create a PHP object that combines all of this data.
5. Check if our destination file =comments.json= exists.
-6. If so, convert the PHP object to JSON and save it to the file.
-7. If the =comments.json= file does not exist, the script will exit with
- an error. You can alter this to ensure it creates the script, but my
- source code includes the file by default, so it will always exist.
-8. Finally, send the user back to the =#comments= section of the blog
- post they just read.
+6. If so, convert the PHP object to JSON (JavaScript Object Notation) and save
+ it to the file.
+7. If the =comments.json= file does not exist, the script will exit with an
+ error. You can alter this to ensure it creates the script, but my source code
+ includes the file by default, so it will always exist.
+8. Finally, send the user back to the =#comments= section of the blog post they
+ just read.
#+begin_src php
// Get the content sent from the comment form
@@ -186,9 +181,9 @@ if (file_exists($file_name)) {
header('Location: ' . $post_url . '#comments');
#+end_src
-If you're using Apache, make sure the =www-data= user on your server has
-the correct permissions to your website directory or else it will not be
-able to write to =comments.json=.
+If you're using Apache, make sure the =www-data= user on your server has the
+correct permissions to your website directory or else it will not be able to
+write to =comments.json=.
#+begin_src sh
chgrp -R www-data /path/to/website/
@@ -197,18 +192,15 @@ chmod -R g+w comments.json
* Display User Comments
-Now that we can submit comments, and they are saved to the
-=comments.json= file, let's make sure we can show those comments in each
-blog post.
+Now that we can submit comments, and they are saved to the =comments.json= file,
+let's make sure we can show those comments in each blog post.
-The code block below shows the function I use to decode my
-=comments.json= file, check if the comments apply to the current post,
-and then display them.
+The code block below shows the function I use to decode my =comments.json= file,
+check if the comments apply to the current post, and then display them.
-This piece of code should *really* be inside a function (or at least in
-an organized PHP workflow). Don't just copy-and-paste and expect it to
-work. You need to at least supply a =$query= variable depending on the
-page visited.
+This piece of code should *really* be inside a function (or at least in an
+organized PHP workflow). Don't just copy-and-paste and expect it to work. You
+need to at least supply a =$query= variable depending on the page visited.
#+begin_src php
$query = 'your-blog-post.html';
@@ -246,27 +238,24 @@ echo $comment_section;
* Bonus: Create a 'Recent Comments' Page
-Finally, the last part of my current system is to create a Recent
-Comments page so that I can easily check-in on my blog and moderate any
-spam. As an alternative, you could use PHP's =mail()= function to email
-you for each blog comment.
+Finally, the last part of my current system is to create a Recent Comments page
+so that I can easily check-in on my blog and moderate any spam. As an
+alternative, you could use PHP's =mail()= function to email you for each blog
+comment.
-The code to do this is literally the same code as the previous section,
-I just make sure it is printed when someone visits
-=https://example.com/comments/=.
+The code to do this is literally the same code as the previous section, I just
+make sure it is printed when someone visits =https://example.com/comments/=.
* Possible Enhancements
-This comment system is by no means a fully-developed system. I have
-noted a few possible enhancements here that I may implement in the
-future:
+This comment system is by no means a fully-developed system. I have noted a few
+possible enhancements here that I may implement in the future:
- Create a secure moderator page with user authentication at
- =https://blog.example.com/mod/=. This page could have the option to
- edit or delete any comment found in =comments.json=.
-- Create a temporary file, such as =pending_comments.json=, that will
- store newly-submitted comments and won't display on blog posts until
- approved by a moderator.
-- Create a =/modlog/= page with a chronological log, showing which
- moderator approved which comments and why certain comments were
- rejected.
+ =https://blog.example.com/mod/=. This page could have the option to edit or
+ delete any comment found in =comments.json=.
+- Create a temporary file, such as =pending_comments.json=, that will store
+ newly-submitted comments and won't display on blog posts until approved by a
+ moderator.
+- Create a =/modlog/= page with a chronological log, showing which moderator
+ approved which comments and why certain comments were rejected.