0

最近この記事を読みました: How to make my own while Loop like Wordpress Loop? 私はこれまで成功せずに自分でループを作ろうとしています。

この記事に記載されている回答では、グローバル変数を使用するのではなく、OOP アプローチを推奨しています。

私は OOP メソッドでうまくいきませんでしたが、以下のグローバル変数メソッドはほとんど機能します。

MySQL テーブルの「item_title」と「item_desc」の値を表示する代わりに、文字が表示されます。文字が正しい while ループ形式であることに注意してください。

私は何を間違っていますか?

どうもありがとう

<?php
//CONNECT TO DATABASE
$mysqli = mysqli_connect("localhost", "username", "password", "testDB");

//VALIDATE ITEMS FROM STORE_ITEMS TABLE
$get_item_sql = "SELECT * FROM store_items";
$get_item_res = mysqli_query($mysqli, $get_item_sql) or die(mysqli_error($mysqli));

//DEFINE VARIABLES
$posts = mysqli_fetch_array($get_item_res);
$post = null;
$post_count = 0;
$post_index = 0;

//HAVE_POST FUNCTION
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;
}
}

//THE_POST FUNCTION
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;

}

//THE_TITLE FUNCTION
function the_title() {
global $post;
return $post['item_title'];
}

//THE_CONTENT FUNCTION
function the_content() {
global $post;
return $post['item_desc'];
}

//OUTPUT
if(have_post()) : while(have_post()) : the_post();
echo '<h2>'.the_title().'</h2>';
echo '<p>'.the_content().'</p>';
endwhile; endif;

?>
4

2 に答える 2

1

あなたはMySQLを間違っています。mysqli_fetch_array は、データの 1 つの ROW をフェッチします。クエリ結果のすべての行を取得するわけではありません。あなたのクエリも非効率的です。投稿数のカウントだけが必要な場合は、次のことができます

$result = mysqli_query("SELECT * FROM ...");
$rows = mysqli_num_rows($result);

しかし、それは非効率的です。実際に使用することを前提として、DB ライブラリに行データのフェッチを強制的に開始させています。それでもあなたはそれを捨てているだけです。より良い方法は

$result = mysqli_query("SELECT count(*) AS cnt FROM ...") or die(mysqli_error());
$row = mysqli_fetch_assoc($result);
$rows = $row['cnt'];

後で、$postsすべてのクエリ結果が含まれているかのように扱いますが、その 1 つの行しか含まれていないため、その 1 つの行のフィールドを単純に反復/フェッチしています。

于 2012-10-29T14:20:30.383 に答える
0

ご覧のとおり、使用して1行をクエリしているだけです

$posts = mysqli_fetch_array($get_item_res);

このように、これらすべての行で1つの配列を埋める必要があります。

$posts = array();
while ($row  = mysqli_fetch_array($get_item_res) ){
    $posts[] = $row;
}
于 2012-10-29T14:24:48.790 に答える