Page 1 of 2
PHP Tutorial: Blog (Including Commenting) [part 04]
Posted: Mon Apr 09, 2012 1:19 pm
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
Re: PHP Tutorial: Blog (Including Commenting) [part 04]
Posted: Mon Apr 09, 2012 2:53 pm
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.
Re: PHP Tutorial: Blog (Including Commenting) [part 04]
Posted: Mon Apr 09, 2012 3:01 pm
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>
Re: PHP Tutorial: Blog (Including Commenting) [part 04]
Posted: Mon Apr 09, 2012 3:19 pm
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();
Re: PHP Tutorial: Blog (Including Commenting) [part 04]
Posted: Mon Apr 09, 2012 4:57 pm
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
Re: PHP Tutorial: Blog (Including Commenting) [part 04]
Posted: Mon Apr 09, 2012 6:56 pm
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`
Re: PHP Tutorial: Blog (Including Commenting) [part 04]
Posted: Mon Apr 09, 2012 7:35 pm
by RowruffDesign
Thank you for helping me out! A little beginner mistake
Thanks a lot!
Re: PHP Tutorial: Blog (Including Commenting) [part 04]
Posted: Mon Apr 09, 2012 8:35 pm
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>
Re: PHP Tutorial: Blog (Including Commenting) [part 04]
Posted: Mon Apr 09, 2012 8:40 pm
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.
Re: PHP Tutorial: Blog (Including Commenting) [part 04]
Posted: Mon Apr 09, 2012 9:46 pm
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;
}
}
Re: PHP Tutorial: Blog (Including Commenting) [part 04]
Posted: Mon Apr 09, 2012 10:54 pm
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
Re: PHP Tutorial: Blog (Including Commenting) [part 04]
Posted: Tue Apr 10, 2012 12:23 pm
by RowruffDesign
So i need to use the $post_id if I understand it?
Re: PHP Tutorial: Blog (Including Commenting) [part 04]
Posted: Tue Apr 10, 2012 12:26 pm
by RowruffDesign
Solved it
Thank you very much!
Re: PHP Tutorial: Blog (Including Commenting) [part 04]
Posted: Tue Apr 10, 2012 12:29 pm
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>
Re: PHP Tutorial: Blog (Including Commenting) [part 04]
Posted: Tue Apr 10, 2012 12:40 pm
by Temor
what did you do with the valid_pid function?
Re: PHP Tutorial: Blog (Including Commenting) [part 04]
Posted: Tue Apr 10, 2012 1:14 pm
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;
}
}
Re: PHP Tutorial: Blog (Including Commenting) [part 04]
Posted: Tue Apr 10, 2012 1:56 pm
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
Re: PHP Tutorial: Blog (Including Commenting) [part 04]
Posted: Tue Apr 10, 2012 2:00 pm
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>
Re: PHP Tutorial: Blog (Including Commenting) [part 04]
Posted: Tue Apr 10, 2012 2:16 pm
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 )
Re: PHP Tutorial: Blog (Including Commenting) [part 04]
Posted: Tue Apr 10, 2012 2:18 pm
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
Re: PHP Tutorial: Blog (Including Commenting) [part 04]
Posted: Tue Apr 10, 2012 4:22 pm
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;