Blog Tutorial - Invalid Post ID - blog-read.php

Post here is you are having problems with any of the tutorials.
Post Reply
dmanzer2
Posts: 6
Joined: Wed Feb 29, 2012 6:42 pm

Blog Tutorial - Invalid Post ID - blog-read.php

Post by dmanzer2 »

After making a new blog post or comment the page goes blank after clicking button (blog_post.php & blog_read.php). The posts are posting when I view blog_list.php and the comments are posting when I view blog_read.php. If I just preview the blog_read.php file I get a Invalid post ID message.

Can anyone help? Please

Thank you,
David
User avatar
Temor
Posts: 1186
Joined: Thu May 05, 2011 8:04 pm

Re: Blog Tutorial - Invalid Post ID - blog-read.php

Post by Temor »

Post your code using the proper syntax tags and I'll take a look at it.
dmanzer2
Posts: 6
Joined: Wed Feb 29, 2012 6:42 pm

Re: Blog Tutorial - Invalid Post ID - blog-read.php

Post by dmanzer2 »

Thank you!

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 lang="en" class="no-js">
	<head>
		<meta charset="UTF-8">
		<!-- www.phpied.com/conditional-comments-block-downloads/ -->
		<!--[if IE]><![endif]-->
		
		<script> document.documentElement.className = 'js'; </script>
		<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
		
		<link rel="shortcut icon" href="/favicon.ico">
		<link rel="apple-touch-icon" href="/apple-touch-icon.png">
		
		<link rel="stylesheet" href="css/reset.css" />
		<link rel="stylesheet" href="css/960_24_col.css"/>
		<link rel="stylesheet" href="css/text.css" />
		<link rel="stylesheet" href="css/style.css" />
		
		<!-- For the less-enabled mobile browsers like Opera Mini -->
		<link rel="stylesheet" media="handheld" href="css/handheld.css?v=1">
		
		<!--[if lt IE 9]>
		<script src="http://html5shiv.googlecode.com/svn/tru ... "></script>
		<script src="js/selectivizr.js"></script>
		<![endif]-->
		
		<script src="http://ajax.googleapis.com/ajax/libs/jq ... "></script>
		
		<title>SITENAME</title>
	
	</head>
    <body>
        <div>
            <?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>By <?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>
    </body>
</html>
posts.inc.php
<?php

// checks if the given post id is in the table.
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;
	}
}
		
//fetches a summery of all the blog posts.
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_comments'		=> ($row['last_comment'] === null) ? 'never' : $row['last_comment']
		);
	}
	
	return $rows;
	
}

// fetches a single post from the table.
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;
}

//adds a new blog entry.
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())");
}
	
?>
comments.inc.php
<?php

//fetches all of the comments for a given blog post.
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;
	}
	
	return $return;
}

//adds a comment.
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`, `comment_date`) VALUES ({$pid}, '{$user}', '{$body}', NOW())");
	
	return true;
}

?>
blog_post.php
<?php

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

if (isset($_POST['user'], $_POST['title'], $_POST['body'])){
	add_post($_POST['user'], $_POST['title'], $_POST['body']);
	header('Location: blog_list.php');
	die();
}
?>

<!DOCTYPE HTML>

<html lang="en" class="no-js">
	<head>
		<meta charset="UTF-8">
		<!-- www.phpied.com/conditional-comments-block-downloads/ -->
		<!--[if IE]><![endif]-->
		
		<script> document.documentElement.className = 'js'; </script>
		<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
		
		<link rel="shortcut icon" href="/favicon.ico">
		<link rel="apple-touch-icon" href="/apple-touch-icon.png">
		
		<link rel="stylesheet" href="css/reset.css" />
		<link rel="stylesheet" href="css/960_24_col.css"/>
		<link rel="stylesheet" href="css/text.css" />
		<link rel="stylesheet" href="css/style.css" />
		
		<!-- For the less-enabled mobile browsers like Opera Mini -->
		<link rel="stylesheet" media="handheld" href="css/handheld.css?v=1">
		
		<!--[if lt IE 9]>
		<script src="http://html5shiv.googlecode.com/svn/tru ... "></script>
		<script src="js/selectivizr.js"></script>
		<![endif]-->
		
		<script src="http://ajax.googleapis.com/ajax/libs/jq ... "></script>
		
		<title>SITENAME</title>
	
	</head>
    <body> 
        <form action="" method="post">
            <p>
                <label for="user">Name</label>
                <input type="text" name="user" id="user" />
            </p>
            <p>
                <label for="title">Title</label>
                <input type="text" name="title" id="title" />
            </p>
            <p>
                <textarea name="body" rows="20" cols="60"></textarea>
            </p>
            <p>
                <input type="submit" value="Add Post" />
            </p>     	 
        </form>
    </body>
</html>
blog_list.php
<?php

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

?>
<!DOCTYPE HTML>

<html lang="en" class="no-js">
	<head>
		<meta charset="UTF-8">
		<!-- www.phpied.com/conditional-comments-block-downloads/ -->
		<!--[if IE]><![endif]-->
		
		<script> document.documentElement.className = 'js'; </script>
		<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
		
		<link rel="shortcut icon" href="/favicon.ico">
		<link rel="apple-touch-icon" href="/apple-touch-icon.png">
		
		<link rel="stylesheet" href="css/reset.css" />
		<link rel="stylesheet" href="css/960_24_col.css"/>
		<link rel="stylesheet" href="css/text.css" />
		<link rel="stylesheet" href="css/style.css" />
		
		<!-- For the less-enabled mobile browsers like Opera Mini -->
		<link rel="stylesheet" media="handheld" href="css/handheld.css?v=1">
		
		<!--[if lt IE 9]>
		<script src="http://html5shiv.googlecode.com/svn/tru ... "></script>
		<script src="js/selectivizr.js"></script>
		<![endif]-->
		
		<script src="http://ajax.googleapis.com/ajax/libs/jq ... "></script>
		
		<title>SITENAME</title>
	
	</head>
    <body>
        <div>
            <?php
            
			$posts = get_posts();
			
			foreach ($posts as $post){
				?>
                <h2><a href="blog_read.php?pid=<?php echo $post['id']; ?>"><?php echo $post ['title']; ?></a></h2>
                <h4>By <?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>
    </body>
</html>
init.inc.php
<?php

mysql_connect('localhost', 'root', 'root');
mysql_select_db('blog');

include('inc/posts.inc.php');
include('inc/comments.inc.php');

?>
User avatar
Temor
Posts: 1186
Joined: Thu May 05, 2011 8:04 pm

Re: Blog Tutorial - Invalid Post ID - blog-read.php

Post by Temor »

try adding
echo mysql_error();
under your queries to see if they are doing what they should.
dmanzer2
Posts: 6
Joined: Wed Feb 29, 2012 6:42 pm

Re: Blog Tutorial - Invalid Post ID - blog-read.php

Post by dmanzer2 »

Hi Temor,

I tried the echo mysql_error(); and nothing changed. The same thing is still happening. Blank pages upon click. This might be a stupid question but I'm new at this. I did notice that When I test the comments.inc.php and post.inc.php directly that I get an internal server error. Could this be the issue? If so how would I resolve it? I just figured that message was happening because these are back end files. Any thoughts?

Thank you so much for all your help.

David
User avatar
Temor
Posts: 1186
Joined: Thu May 05, 2011 8:04 pm

Re: Blog Tutorial - Invalid Post ID - blog-read.php

Post by Temor »

Is this on a local server?
Try putting a hashtag (#) as the action in your forms.
<form action="#" method="post">
also, remove the die(); in your first if statement in both blog_read and blog_post.
if (isset($_POST['user'], $_POST['title'], $_POST['body'])){
        add_post($_POST['user'], $_POST['title'], $_POST['body']);
        header('Location: blog_list.php');
        die(); <-- this one.
}
dmanzer2
Posts: 6
Joined: Wed Feb 29, 2012 6:42 pm

Re: Blog Tutorial - Invalid Post ID - blog-read.php

Post by dmanzer2 »

Hi Temor,

Thank you for your help on this.

Yes, I am testing on a local server. I just added the hashtag (#) in the from action, tested it and nothing changed. Then I removed the die(); in both the blog_read and the blog_post and still nothing happened. :?:

Any other suggestions?

Thank you,
David
User avatar
jacek
Site Admin
Posts: 3262
Joined: Thu May 05, 2011 1:45 pm
Location: UK
Contact:

Re: Blog Tutorial - Invalid Post ID - blog-read.php

Post by jacek »

Adding the # will just break the form, don't do that ;)

The die() needs to be there. It is to prevent the rest of the script running once the browser has been redirected.


If you are getting blank pages it probably means there is a syntax error that is being hidden because of your error_reporting setting. In your php.ini file make sure that display_error is set to On and error_reporting is set to E_ALL, if you edit the file with the server running you will need to restart it for it to take effect. There are plenty of guides online if this made no sense ;)
Image
User avatar
Temor
Posts: 1186
Joined: Thu May 05, 2011 8:04 pm

Re: Blog Tutorial - Invalid Post ID - blog-read.php

Post by Temor »

jacek wrote:Adding the # will just break the form, don't do that ;)
I've encountered several cases where the page would redirect to an empty document if the form action was left empty. I never leave it empty now and so far it's working just fine :)
dmanzer2
Posts: 6
Joined: Wed Feb 29, 2012 6:42 pm

Re: Blog Tutorial - Invalid Post ID - blog-read.php

Post by dmanzer2 »

Thanks guys for helping with this. I'm sorry to be such a pain.

Okay, It seems I'm back to square one. I added the die() back and removed the #. As far as the php.ini files goes, where is that on a local server? Do I create it? Do you mean add the error_reporting to the init.inc.php?

Hold on... I think I'm getting close. I added
error_reporting(E_ALL);
ini_set('display_errors', 1);
to the init.inc.php and got this error when I tested the blog_post.php file: Warning: Cannot modify header information - headers already sent by (output started at /Volumes/Project/blog/core/init.inc.php:16) in /Volumes/Project/blog/blog_post.php on line 7

This on the blog_list.php:
Notice: Undefined index: body in /Volumes/Project/blog/blog_list.php on line 52
New
By Dave on 02/03/2012 08:51:55
(0 comments, last comment
Notice: Undefined index: last_comment in /Volumes/Project/blog/blog_list.php on line 48
)


Notice: Undefined index: body in /Volumes/Project/blog/blog_list.php on line 52
By on 02/03/2012 08:51:13
(0 comments, last comment
Notice: Undefined index: last_comment in /Volumes/Project/blog/blog_list.php on line 48
)


Notice: Undefined index: body in /Volumes/Project/blog/blog_list.php on line 52
ads
By vfsdav on 01/03/2012 14:30:16
(1 comments, last comment
Notice: Undefined index: last_comment in /Volumes/Project/blog/blog_list.php on line 48
)

I still don't know the issue. I'm going to try to examine it further. If you have any thoughts on the issue please let me know.

Thank you,
David
User avatar
jacek
Site Admin
Posts: 3262
Joined: Thu May 05, 2011 1:45 pm
Location: UK
Contact:

Re: Blog Tutorial - Invalid Post ID - blog-read.php

Post by jacek »

Hmm, okay
dmanzer2 wrote:to the init.inc.php and got this error when I tested the blog_post.php file: Warning: Cannot modify header information - headers already sent by (output started at /Volumes/Project/blog/core/init.inc.php:16) in /Volumes/Project/blog/blog_post.php on line 7
This is probably the one to fix first. It is happening because you are trying to send a header after there has already been some output form the script (not allowed). It tells you that the output came from line 16 of init.inc.php so you need to either remove that or move it after any headers.

The other ones are just telling you that some variables you have tried to use are not there, this can only happen if they have not been defined. It could be the result of a query failing or maybe just a typo, trace the variable back from the point where the error is and see if you see where it went wrong. I can't see anything right away but I only have a quick look.
Image
dmanzer2
Posts: 6
Joined: Wed Feb 29, 2012 6:42 pm

Re: Blog Tutorial - Invalid Post ID - blog-read.php

Post by dmanzer2 »

Thank you, Jacek and Temor. It works!! :D

Cheers,
David
User avatar
jacek
Site Admin
Posts: 3262
Joined: Thu May 05, 2011 1:45 pm
Location: UK
Contact:

Re: Blog Tutorial - Invalid Post ID - blog-read.php

Post by jacek »

dmanzer2 wrote:Thank you, Jacek and Temor. It works!! :D

Cheers,
David
No problem :D
Image
Post Reply