im new here and new in PHP too..
Just wondering how to make my own flexible loop just like in Wordpress... Note im not talking about wordpress.. I want to implement it on myown PHP application...
let's look back in WP, there is a code something like this:
while (have_post() : thepost())// .. bla bla...
echo the_title();
echo the_content();
endwhile; // this is just an ilustration
Could you figure out how have_post() or the_post() interact with database, so that they can be loop..
thanks..
WordPress uses global variables that these functions modify when iterating through the loop. e.g.:
var $posts = null;
var $post = null;
var $post_count = 0;
var $post_index = 0;
function have_post() {
global $posts, $post_count, $post_index;
$post_index = 0;
// do a database call to retrieve the posts.
$posts = mysql_query('select * from posts where ...');
if ($posts) {
$post_count = count($posts);
return true;
} else {
$post_count = 0;
return false;
}
}
function thepost() {
global $posts, $post, $post_count, $post_index;
// make sure all the posts haven't already been looped through
if ($post_index > $post_count) {
return false;
}
// retrieve the post data for the current index
$post = $posts[$post_index];
// increment the index for the next time this method is called
$post_index++;
return $post;
}
function the_title() {
global $post;
return $post['title'];
}
function the_content() {
global $post;
return $post['content'];
}
I would definitely recommend using OOP style coding over what WordPress does, however. This will keep variables definied within an instance of an object instead of being globally accessible. e.g.:
class Post {
function __construct($title, $content) {
$this->title = $title;
$this->content = $content;
}
function getTitle() {
return $title;
}
function getContent() {
return $content;
}
}
class Posts {
var $postCount = 0;
var $posts = null;
function __construct($conditions) {
$rs = mysql_query('select * from posts where $conditions...');
if ($rs) {
$this->postCount = count($rs);
$this->posts = array();
foreach ($rs as $row) {
$this->posts[] = new Post($row['title'], $row['content']);
}
}
}
function getPostCount() {
return $this->postCount;
}
function getPost($index) {
return $this->posts[$index];
}
}
You could implement the Iterator interface.
the idea is to use global scope variables, and then the functions will modify those variables:
// first define the global variables:
$post_index = 0;
$posts_count = 0;
$post = null;
$posts = null;
$connection = null;
$connection = new PDO('mysql:host=127.0.0.1;dbname=YOUR_DB', 'YOUR_DB_USERNAME', 'YOUR_DB_USER_PASSWORD', array(PDO::ATTR_FETCH_MODE => PDO::FETCH_ASSOC));
$query = $connection->query('SELECT * FROM posts');
$posts = $query->fetchAll();
$posts_count = count($posts); // or = $query->rowCount()
// now you create the functions that will deal with and change those variables
function have_posts()
{
global $post_index, $posts_count, $posts, $post;
// if posts found and if post_index < posts_count return true else return false
if($posts && $post_index < $post_count)
return true;
else
return false;
}
function the_post()
{
global $post_count, $post_index, $posts, $post;
if($post_index > $post_count)
return false;
// fetch the post of the current index
$post = $posts[$post_index];
// increment the $post_index so that the next call to this function grapes the next post
$post_index++;
}
function get_ID()
{
global $post;
return $post['ID'];
}
function get_title()
{
global $post;
return $post['title'];
}
I hope that help.
Go to this problem again :D
finally I got the solution,
@Matt Huggins, i have made some revision to your code, and now it's work...
$posts = $wpdb->get_results('SELECT * FROM my_table',OBJECT);
$post = null;
$post_count = 0;
$post_index = 0;
function have_post() {
global $posts, $post_count, $post_index;
if ($posts && ($post_index <= $post_count)){
$post_count = count($posts);
return true;
}
else {
$post_count = 0;
return false;
}
}
function the_post() {
global $posts, $post, $post_count, $post_index;
// make sure all the posts haven't already been looped through
if ($post_index > $post_count) {
return false;
}
// retrieve the post data for the current index
$post = $posts[$post_index+1];
// increment the index for the next time this method is called
$post_index++;
return $post;
}
function the_title() {
global $post;
return $post->Title;
}
function the_content() {
global $post;
return $post->Content;
}
//and the output
if(have_post()) : while(have_post()) : the_post();
echo '<h2>'.the_title().'</h2>';
echo '<p>'.the_content().'</p>';
endwhile; endif;
Many thanks... :)
来源:https://stackoverflow.com/questions/1516181/how-to-make-my-own-while-loop-just-like-wordpress-loop