-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");
}

或者至少使用 PDO,如果你想坚持使用原始 API。
但是忘记mysqli,它无法使用。

于 2013-02-20T19:05:03.757 回答
0

问题是,只有一个数组$r。每次调用$stmt->fetch()时,该数组的参数都会被覆盖,然后再次将其附加到$book-array。

一种可能的解决方案:(不一定是最好的)

$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 回答