-1

次のコードは、テーブルからすべてのレコードを取得し、それらを配列に返すことになっています。正しい数のレコードを返しますが、すべてのレコードは同一です。誰が問題が何であるかの手がかりを持っていますか?

function list_book() {
$username = "user";
$password = "pwd";
$conn =  mysqli_connect('localhost', $username, $password, 'db') or die('Could Not Connect' . mysql_error());
$stmt = $conn->stmt_init();
if ($stmt->prepare("SELECT * FROM book")) {
    $stmt->bind_result($r['book_id'], $r['book_title']);
    if (!$stmt->execute()) {
        echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
        exit();
    }
    while($stmt->fetch()){
        $book[] = $r;
    }
    print_r($book);     //**** added purposely to examine the content of the array
    exit();

    return $book;
}
mysqli_close($conn);

}

4

5 に答える 5

2

ステートメントの実行後にパラメーターをバインドする必要があります...http://www.php.net/manual/en/mysqli-stmt.bind-result.phpを参照してください

また、配列の要素にバインドできるかどうかもわかりません...

ifステートメントでこれを試してください...

if (!$stmt->execute()) {
    echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
    exit();
}

$stmt->bind_result($book_id, $book_title);

while($stmt->fetch()){
    $book[] = array($book_id, $book_title);
}
于 2013-02-20T19:07:36.603 に答える
0

見苦しい mysqli を使用しないでください。
2 行ですべてのジョブを実行できるヘルパー クラスを使用します。luke safemysqlはそうします。

function list_book() {
    global $db; // NEVER connect in the function, connect once and then use ONE connection
    return $db->getAll("SELECT * FROM book");
}

または、生の API に固執する場合は、少なくとも PDO を使用してください。
しかし、mysqli は使えないので忘れてください。

于 2013-02-20T19:05:03.757 に答える
0

問題は、配列が 1 つしかないことです$r。を呼び出すたび$stmt->fetch()に、この配列のパラメーターが上書きされ、$book-array に再度追加されます。

考えられる解決策の1つ:(必ずしも最も良いものとは限りません)

$stmt->bind_result($book_id, $book_title);
...
while($stmt->fetch()){
    $book[] = array($book_id, $book_title);
}
于 2013-02-20T19:05:04.147 に答える
0

whileループ内に次を追加することで問題を解決したと思います。みんなの貢献に感謝します!!! :)

foreach( $r as $key=>$value ) {
    $row_tmb[ $key ] = $value;
}

$book[] = $row_tmb;
于 2013-02-21T10:51:59.993 に答える
-1

テーブルに重複するレコードがありますか?

その場合、わずかに変更されたSQLが役立つ場合があります。次に例を示します。 SELECT DISTINCT book_id, book_title FROM book

そして、明示的な「バインド」ではなく、多分$r = $stmt->fetch_assoc()

$r['book_title']次に、配列(または任意のフィールド)を収集できます。

于 2013-02-20T19:06:44.473 に答える