以下代码应该从表中检索所有记录并将它们返回到数组。它确实返回正确的记录数,但所有记录都是相同的。有没有人知道问题是什么?
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);
}
答案 0 :(得分: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);
}
答案 1 :(得分:0)
不要使用丑陋的mysqli 使用一些可以完成两行所有工作的助手类,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,它无法使用。
答案 2 :(得分:0)
问题是,只有一个数组$r
。每次调用$stmt->fetch()
时,都会覆盖此数组的参数,并将其再次附加到$book
- 数组。
一种可能的解决方案:(不一定是最好的解决方案)
$stmt->bind_result($book_id, $book_title);
...
while($stmt->fetch()){
$book[] = array($book_id, $book_title);
}
答案 3 :(得分:0)
我想通过在while循环中添加以下内容来解决问题。感谢大家的贡献! :)
foreach( $r as $key=>$value ) {
$row_tmb[ $key ] = $value;
}
$book[] = $row_tmb;
答案 4 :(得分:-1)
表格是否有重复的记录?
如果是这样,稍加修改的SQL可能有所帮助,例如:
SELECT DISTINCT book_id, book_title FROM book
而不是明确的'绑定',也许$r = $stmt
- > fetch_assoc()
然后你可以收集你的数组的$r['book_title']
(或任何字段)。