我已经创建了一个接受搜索列,搜索词和id号的函数,并且我正在尝试构建一个预准备语句并获取结果,并在json中返回。
这就是我所拥有的:
function searchBooks($searchColumn, $searchTerm, $teacherid) {
$books = array();
$link = connect_db();
$sql = "SELECT * FROM book WHERE teacher_id = ? AND ? LIKE ?";
$searchTerm = "%{$searchTerm}%";
$stmt = $link->stmt_init();
$stmt->prepare($sql);
$stmt->bind_param('iss', $teacherid, $searchColumn, $searchTerm);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_array(MYSQLI_BOTH)) {
$book = new Book();
$book->id = $row['id'];
$book->title = $row['title'];
$book->author = $row['author'];
$book->ar_quiz = $row['ar_quiz'];
$book->ar_quiz_pts = $row['ar_quiz_pts'];
$book->book_level = $row['book_level'];
$book->type = $row['type'];
$book->teacher_id = $row['teacher_id'];
array_push($books, $book);
}
mysqli_stmt_close($stmt);
return json_encode($books);
}
我正在使用一个测试页面来传递我知道应该返回结果的值(使用'the'作为通配符和'title'作为搜索列):
echo searchBooks('title', 'the', 1);
...但我在测试页面上没有得到任何结果...... []
输出。
假设connect_db()
检索连接。假设我正在执行我的所有错误检查以及控制器级别中的所有内容,并且可能会在以后添加类似的内容。只是想立即获得结果。提前感谢你能指出的任何事情。
答案 0 :(得分:3)
searchcolumn不能是绑定变量。您无法绑定表/列名称
$sql = sprintf("SELECT * FROM `book` WHERE teacher_id = ? AND `%s` LIKE ?", $searchColumn);
$searchTerm = "%{$searchTerm}%";
$stmt = $link->stmt_init();
$stmt->prepare($sql);
$stmt->bind_param('is', $teacherid, $searchTerm);
将白名单$searchColumn
列入白名单也是一个好主意,在执行此任务之前验证它确实是您的图书表中的一列
修改强>
当你只使用数组中的关联值时,为什么还要使用fetch_array(MYSQLI_BOTH)
呢?使用fetch_assoc()
会更好,或者您可能更聪明,并使用fetch_object(),然后您就不需要按属性填充Book
对象属性
考虑:
while ($book = $result->fetch_object('Book')) {
array_push($books, $book);
}