PHP Tutorial: Blog (Including Commenting) [part 04]

Post here is you are having problems with any of the tutorials.
RowruffDesign
Posts: 19
Joined: Mon Apr 09, 2012 1:14 pm
Contact:

PHP Tutorial: Blog (Including Commenting) [part 04]

Post by RowruffDesign »

After I finished part 4 of the tutorial I tried it out in the server

But I don't get the same result as on the tutorial!

This is the error I get

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/name/domains/website.nl/public_html/core/inc/posts.inc.php on line 40

This stands on line 40:
while (($row = mysql_fetch_assoc($posts)) !== false){
I don't understand whats wrong with the code, can someone help me out?

Greatz :ugeek:
Image
User avatar
Temor
Posts: 1186
Joined: Thu May 05, 2011 8:04 pm

Re: PHP Tutorial: Blog (Including Commenting) [part 04]

Post by Temor »

I would need to see more than just one line of code. The problem is not ON line 40, the problem is that the $posts variable you're passing to the mysql_fetch_assoc function is corrupted in some way. Probably because of an error in your SQL syntax.

Try echoing mysql_error() underneath where you run your query and see if it gives you an error.
RowruffDesign
Posts: 19
Joined: Mon Apr 09, 2012 1:14 pm
Contact:

Re: PHP Tutorial: Blog (Including Commenting) [part 04]

Post by RowruffDesign »

Files: comment.inc.php | posts.inc.php | blog_list.php

These are all the files its about!
I hope this will give you a clue about the wrong part in the code

Thanks ;)
<?php
	
function get_comments($pid) {
	$pid = (int)$pid;
	
	$sql = "SELECT
				`comment_body` AS `body`,
				`comment_user` AS `user`,
				DATE_FORMAT(`comment_date`, '%d/%m/%y %H:%i:%s') AS `date`
			FROM `comments`
			WHERE `post_id` = {$pid}";
			
	$comments = mysql_query($sql);
	
	$return = array();
	while (($row = mysql_fetch_assoc($comments)) !== false) {
		$return[] = $row;
	}	
}

function add_comment($pid, $user, $body) {
	if (valid_pid($pid) === false) {
		return false;	
	}
	
	$pid = (int)$pid;
	$user = mysql_real_escape_string(htmlentities($user));
	$body = mysql_real_escape_string(nl2br(htmlentities($body)));
	
	mysql_query("INSERT INTO `comments` (`post_id`, `comment_user`, `comment_body`, `comments_date`) VALUES ({$pid}, '{user}', '{body}', NOW())");

	return true;
}

?>
<?php

function valid_pid($post_id) {
	$pid = (int)$pid;
	
	$total = mysql_query("SELECT COUNT(`post_id`) FROM `posts` WHERE `post_id` = {$pid}");
	$total = mysql_result($total, 0);
	
	if ($total != 1) {
		return false;	
	} else {
		return true;	
	}
}	

function get_posts() {
	$sql = "SELECT
				`posts`.`post_id` AS `id`,
				`posts`.`post_title` AS `title`,
				LEFT(`posts`.`post_body`, 512) AS `preview`,
				`posts`.`post_user` AS `user`,
				DATE_FORMAT(`posts`.`post_date`, '%d/%m/%y %H:%i:%s') AS `date`,
				`comments`.`total_comments`,
				DATE_FORMAT(`comments`.`last_comment`, '%d/%m/%y %H:%i:%s') AS `last_comment`
			FROM `posts`
			LEFT JOIN {
				SELECT 
					`post_id`,
					COUNT(`comment_id`) AS `total_comments`,
					MAX(`comment_date`) AS `last_comment`
				FROM `comments`
				GROUP BY `post_id`	
			} AS `comments`
			ON `posts`.`post_id` = `comments`.`post_id`
			ORDER BY `posts`.`post_date` DESC";
	
	$posts = mysql_query($sql);
	
	$rows = array();
	while (($row = mysql_fetch_assoc($posts)) !== false){
		$rows[] = array(
			'id' 		  		=> $row['id'],
			'title'				=> $row['title'],
			'preview' 			=> $row['preview'],
			'user'   			=> $row['user'],
			'date'				=> $row['date'],				 
			'total_comments'	=> ($row['total_comments'] === null) ? 0 : $row['total_comments'],
			'last_comment'		=> ($row['last_comment'] === null) ? 'never' : $row['last_comment']
		);	
	}
	
	return $rows;
}

function get_post($pid) {
	$pid = (int)$pid;
	
	$sql = "SELECT
				`post_title` AS `title`,
				`post_body` AS `body`,
				`post_user` AS `user`,
				`post_date` AS `date`
			FROM `posts`
			WHERE `post_id` = {$pid}";
	
	$post = mysql_query($sql);
	$post = mysql_fetch_assoc($post);
	$post['comments'] = get_comments($pid);
	
	return $post;
}

function add_post($name, $title, $body) {
	$name = mysql_real_escape_string(htmlentities($name));
	$title = mysql_real_escape_string(htmlentities($title));
	$body = mysql_real_escape_string(nl2br(htmlentities($body)));	
	
	mysql_query("INSERT INTO `posts` (`post_user`, `post_title`, `post_body`, `post_date`) VALUES ('{$name}', '{$title}', '{$body}', NOW())");
}

?>
<?php

include('core/init.inc.php');

?>
<!DOCTYPE HTML>
<html>
<head>
	<meta charset="utf-8">
	<title>Untitled Document</title>
</head>
<body>
<div id="wrapper">
<?php

$posts = get_posts();

foreach ($posts AS $post) {
	?>
    <h2><?php echo $post['title']; ?></h2>
    <h4><?php echo $post['user']; ?> on <?php echo $post['date']; ?></h4>
    <h4>(<?php echo $post['total_comments']; ?> comments, last comment <?php echo $post['last_comment']; ?>)</h4>
    
    <hr />
    
    <p><?php echo $post['body']; ?></p>	
    <?php
}

?>
</div><!-- End #wrapper -->
</body>
</html>
Image
User avatar
Temor
Posts: 1186
Joined: Thu May 05, 2011 8:04 pm

Re: PHP Tutorial: Blog (Including Commenting) [part 04]

Post by Temor »

function get_posts() {
        $sql = "SELECT
                                `posts`.`post_id` AS `id`,
                                `posts`.`post_title` AS `title`,
                                LEFT(`posts`.`post_body`, 512) AS `preview`,
                                `posts`.`post_user` AS `user`,
                                DATE_FORMAT(`posts`.`post_date`, '%d/%m/%y %H:%i:%s') AS `date`,
                                `comments`.`total_comments`,
                                DATE_FORMAT(`comments`.`last_comment`, '%d/%m/%y %H:%i:%s') AS `last_comment`
                        FROM `posts`
                        LEFT JOIN {
                                SELECT
                                        `post_id`,
                                        COUNT(`comment_id`) AS `total_comments`,
                                        MAX(`comment_date`) AS `last_comment`
                                FROM `comments`
                                GROUP BY `post_id`     
                        } AS `comments`
                        ON `posts`.`post_id` = `comments`.`post_id`
                        ORDER BY `posts`.`post_date` DESC";
       
        $posts = mysql_query($sql);
        echo mysql_error(); // This line 
        $rows = array();
        while (($row = mysql_fetch_assoc($posts)) !== false){
                $rows[] = array(
                        'id'                            => $row['id'],
                        'title'                         => $row['title'],
                        'preview'                       => $row['preview'],
                        'user'                          => $row['user'],
                        'date'                          => $row['date'],                                 
                        'total_comments'        => ($row['total_comments'] === null) ? 0 : $row['total_comments'],
                        'last_comment'          => ($row['last_comment'] === null) ? 'never' : $row['last_comment']
                );     
        }
       
        return $rows;
}
on line 38, ( line 23 in my example ) right after where you set the $posts variable, add this line of code:
echo mysql_error();
RowruffDesign
Posts: 19
Joined: Mon Apr 09, 2012 1:14 pm
Contact:

Re: PHP Tutorial: Blog (Including Commenting) [part 04]

Post by RowruffDesign »

Thank you for helping me!

This is the message I get now:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '{ SELECT `post_id`, COUNT(`comment_id`) AS `total_comments`, ' at line 10
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/domains/website.nl/public_html/core/inc/posts.inc.php on line 41
Image
User avatar
Temor
Posts: 1186
Joined: Thu May 05, 2011 8:04 pm

Re: PHP Tutorial: Blog (Including Commenting) [part 04]

Post by Temor »

that's it, you're using curly brackets { } instead of parentheses ( ) around your select statement.

This:
LEFT JOIN {
                               SELECT
                                       `post_id`,
                                       COUNT(`comment_id`) AS `total_comments`,
                                       MAX(`comment_date`) AS `last_comment`
                               FROM `comments`
                               GROUP BY `post_id`    
                       } AS `comments`
Should look like this:
LEFT JOIN (
                               SELECT
                                       `post_id`,
                                       COUNT(`comment_id`) AS `total_comments`,
                                       MAX(`comment_date`) AS `last_comment`
                               FROM `comments`
                               GROUP BY `post_id`    
                       ) AS `comments`
RowruffDesign
Posts: 19
Joined: Mon Apr 09, 2012 1:14 pm
Contact:

Re: PHP Tutorial: Blog (Including Commenting) [part 04]

Post by RowruffDesign »

Thank you for helping me out! A little beginner mistake :P

Thanks a lot!
Image
RowruffDesign
Posts: 19
Joined: Mon Apr 09, 2012 1:14 pm
Contact:

Re: PHP Tutorial: Blog (Including Commenting) [part 04]

Post by RowruffDesign »

Damn, got another problem now!

I have finished the PHP Tutorial: Blog (Including Commenting). When i tried it out everything was working fine, until I tried to watch one of the posts. It gives me the message: Invalid post ID. The error message comes from line 27/28. I think that there is the problem, I tried to leave it out, but that didn't work out either!

This is the source code i used ;)
<?php

include('core/init.inc.php');

if (isset($_GET['pid'], $_POST['user'], $_POST['body'])) {
	if (add_comment($_GET['pid'], $_POST['user'], $_POST['body'])) {
		header("Location: blog_read.php?pid={$_GET['pid']}");	
	} else {
		header('Location: blog_list.php');
	}
	
	die ();
}

?>
<!DOCTYPE HTML>
<html>
<head>
	<meta charset="utf-8">
	<title>Blog by RowruffDesign</title>
</head>

<body>
<div id="wrapper">
<?php

if (isset($_GET['pid']) === false || valid_pid($_GET['pid']) === false) {
	echo 'Invalid post ID.';	
} else {
	$post = get_post($_GET['pid']);	?>
    
    <h2><?php echo $post['title']; ?></h2>
    <h4>By <?php echo $post['user']; ?> on <?php echo $post['date']; ?> (<?php echo count($post['comments']); ?> comments)</h4>
    <hr />
    <p><?php echo $post['body']; ?></p>
	<hr/>
<?php

foreach ($post['comments'] as $comment) {
?>

<h4><?php echo $comment['user']; ?> on <?php echo $comment['date']; ?></h4>
<p><?php echo $comment['body']; ?></p>
<hr />
    
<?php	
}
	    
?>
<form action="" method="post">
	<p>
    	<label for="user">Name</label>
        <input type="text" name="user" id="user" />
    </p>
    
    <p>
    	<textarea name="body" rows="20" cols="60"></textarea>
    </p>
    <p>
    	<input type="submit" value="Add Comment" />
    </p>
</form>
<?php
}
?>
</div><!-- End #wrapper -->
</body>
</html>
Image
User avatar
Temor
Posts: 1186
Joined: Thu May 05, 2011 8:04 pm

Re: PHP Tutorial: Blog (Including Commenting) [part 04]

Post by Temor »

function valid_pid($post_id) {
        $pid = (int)$pid;
       
        $total = mysql_query("SELECT COUNT(`post_id`) FROM `posts` WHERE `post_id` = {$pid}");
see what's wrong here? :)

The $pid variable is empty.
RowruffDesign
Posts: 19
Joined: Mon Apr 09, 2012 1:14 pm
Contact:

Re: PHP Tutorial: Blog (Including Commenting) [part 04]

Post by RowruffDesign »

I don't really see what i'm doing wrong!

This is the code I used:
function valid_pid($post_id) {
	$pid = (int)$pid;
	
	$total = mysql_query("SELECT COUNT(`post_id`) FROM `posts` WHERE `post_id` = {$pid}");
	$total = mysql_result($total, 0);
	
	if ($total != 1) {
		return false;	
	} else {
		return true;	
	}
}	
Image
User avatar
Temor
Posts: 1186
Joined: Thu May 05, 2011 8:04 pm

Re: PHP Tutorial: Blog (Including Commenting) [part 04]

Post by Temor »

You're setting the $post_id variable.
function valid_pid($post_id) {
and then you're using the $pid variable.
        $pid = (int)$pid;
you need to change $post_id to $pid
RowruffDesign
Posts: 19
Joined: Mon Apr 09, 2012 1:14 pm
Contact:

Re: PHP Tutorial: Blog (Including Commenting) [part 04]

Post by RowruffDesign »

So i need to use the $post_id if I understand it?

:D
Image
RowruffDesign
Posts: 19
Joined: Mon Apr 09, 2012 1:14 pm
Contact:

Re: PHP Tutorial: Blog (Including Commenting) [part 04]

Post by RowruffDesign »

Solved it :D

Thank you very much!
Image
RowruffDesign
Posts: 19
Joined: Mon Apr 09, 2012 1:14 pm
Contact:

Re: PHP Tutorial: Blog (Including Commenting) [part 04]

Post by RowruffDesign »

I still can't get by my posts. Still getting the message that it is a invalid post ID. Don't really see what the problem now is!
<?php

include('core/init.inc.php');

if (isset($_GET['pid'], $_POST['user'], $_POST['body'])) {
	if (add_comment($_GET['pid'], $_POST['user'], $_POST['body'])) {
		header("Location: blog_read.php?pid={$_GET['pid']}");	
	} else {
		header('Location: blog_list.php');
	}
	
	die ();
}

?>
<!DOCTYPE HTML>
<html>
<head>
	<meta charset="utf-8">
	<title>Blog by Me</title>
</head>

<body>
<div id="wrapper">
<?php

if (isset($_GET['pid']) === false || valid_pid($_GET['pid']) === false) {
	echo 'Invalid post ID.';	
} else {
	$post = get_post($_GET['pid']);	?>
    
    <h2><?php echo $post['title']; ?></h2>
    <h4>By <?php echo $post['user']; ?> on <?php echo $post['date']; ?> (<?php echo count($post['comments']); ?> comments)</h4>
    <hr />
    <p><?php echo $post['body']; ?></p>
	<hr/>
<?php

foreach ($post['comments'] as $comment) {
?>

<h4><?php echo $comment['user']; ?> on <?php echo $comment['date']; ?></h4>
<p><?php echo $comment['body']; ?></p>
<hr />
    
<?php	
}
	    
?>
<form action="" method="post">
	<p>
    	<label for="user">Name</label>
        <input type="text" name="user" id="user" />
    </p>
    
    <p>
    	<textarea name="body" rows="20" cols="60"></textarea>
    </p>
    <p>
    	<input type="submit" value="Add Comment" />
    </p>
</form>
<?php
}
?>
</div><!-- End #wrapper -->
</body>
</html>
Image
User avatar
Temor
Posts: 1186
Joined: Thu May 05, 2011 8:04 pm

Re: PHP Tutorial: Blog (Including Commenting) [part 04]

Post by Temor »

what did you do with the valid_pid function?
RowruffDesign
Posts: 19
Joined: Mon Apr 09, 2012 1:14 pm
Contact:

Re: PHP Tutorial: Blog (Including Commenting) [part 04]

Post by RowruffDesign »

I changed the post_id to pid:
function valid_pid($pid) {
	$pid = (int)$pid;
	
	$total = mysql_query("SELECT COUNT(`post_id`) FROM `posts` WHERE `post_id` = {$pid}");
	$total = mysql_result($total, 0);
	
	if ($total != 1) {
		return false;	
	} else {
		return true;	
	}
}	
Image
User avatar
Temor
Posts: 1186
Joined: Thu May 05, 2011 8:04 pm

Re: PHP Tutorial: Blog (Including Commenting) [part 04]

Post by Temor »

well. It looks alright. The only thing I can think of is that you're not passing the $_GET variable correctly. What does your URL look like? Does it look like this?
http://website.com/index.php?pid=1
RowruffDesign
Posts: 19
Joined: Mon Apr 09, 2012 1:14 pm
Contact:

Re: PHP Tutorial: Blog (Including Commenting) [part 04]

Post by RowruffDesign »

I use this code as blog_read.php.
<?php

include('core/init.inc.php');

if (isset($_GET['pid'], $_POST['user'], $_POST['body'])) {
	if (add_comment($_GET['pid'], $_POST['user'], $_POST['body'])) {
		header("Location: blog_read.php?pid={$_GET['pid']}");	
	} else {
		header('Location: blog_list.php');
	}
	
	die ();
}

?>
<!DOCTYPE HTML>
<html>
<head>
	<meta charset="utf-8">
	<title>Blog by Me</title>
</head>

<body>
<div id="wrapper">
<?php

if (isset($_GET['pid']) === false || valid_pid($_GET['pid']) === false) {
	echo 'Invalid post ID.';	
} else {
	$post = get_post($_GET['pid']);	?>
    
    <h2><?php echo $post['title']; ?></h2>
    <h4>By <?php echo $post['user']; ?> on <?php echo $post['date']; ?> (<?php echo count($post['comments']); ?> comments)</h4>
    <hr />
    <p><?php echo $post['body']; ?></p>
	<hr/>
<?php

foreach ($post['comments'] as $comment) {
?>

<h4><?php echo $comment['user']; ?> on <?php echo $comment['date']; ?></h4>
<p><?php echo $comment['body']; ?></p>
<hr />
    
<?php	
}
	    
?>
<form action="" method="post">
	<p>
    	<label for="user">Name</label>
        <input type="text" name="user" id="user" />
    </p>
    
    <p>
    	<textarea name="body" rows="20" cols="60"></textarea>
    </p>
    <p>
    	<input type="submit" value="Add Comment" />
    </p>
</form>
<?php
}
?>
</div><!-- End #wrapper -->
</body>
</html>
Image
User avatar
Temor
Posts: 1186
Joined: Thu May 05, 2011 8:04 pm

Re: PHP Tutorial: Blog (Including Commenting) [part 04]

Post by Temor »

What I mean is
if (isset($_GET['pid']) === false || valid_pid($_GET['pid']) === false) {
        echo 'Invalid post ID.';   
this line checks to see if $_GET['pid'] is empty. If it is empty, it will return " Invalid post ID ". If you don't have ?pid=x ( x being a number ) in your url, the $_GET variable will be empty, thus returning " Invalid post ID ".

That's why your url need to look like this:
http://localhost/blog_read.php?pid=x
( x being the ID of the blog you're looking for )
RowruffDesign
Posts: 19
Joined: Mon Apr 09, 2012 1:14 pm
Contact:

Re: PHP Tutorial: Blog (Including Commenting) [part 04]

Post by RowruffDesign »

That is just the strange thing, because I do got a ID standing in the URL

http://rowrufftest.nl/blog_list.php

I just putted some dummy data in! But if I click the post, you can't visit the post, even knowing there is a ID in the url
Image
User avatar
Temor
Posts: 1186
Joined: Thu May 05, 2011 8:04 pm

Re: PHP Tutorial: Blog (Including Commenting) [part 04]

Post by Temor »

you're calling it id in the url and pid in your code.


this:
rowrufftest.nl/blog_read.php?id=10
needs to be this:
rowrufftest.nl/blog_read.php?pid=10
By the way, you have an error in your blog_read.php file

Warning: Invalid argument supplied for foreach() in /home/xridomqb/domains/rowrufftest.nl/public_html/blog_read.php on line 39

That error is most likely caused by your get_comments function
function get_comments($pid) {
        $pid = (int)$pid;
       
        $sql = "SELECT
                                `comment_body` AS `body`,
                                `comment_user` AS `user`,
                                DATE_FORMAT(`comment_date`, '%d/%m/%y %H:%i:%s') AS `date`
                        FROM `comments`
                        WHERE `post_id` = {$pid}";
                       
        $comments = mysql_query($sql);
       
        $return = array();
        while (($row = mysql_fetch_assoc($comments)) !== false) {
                $return[] = $row;
        }      
}
the function is never actually returning the $return array. You need to add this to the bottom:
return $return;
Post Reply