准备好的语句LIKE通配符

时间:2014-08-09 19:12:09

标签: php mysql mysqli prepared-statement

我已经创建了一个接受搜索列,搜索词和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()检索连接。假设我正在执行我的所有错误检查以及控制器级别中的所有内容,并且可能会在以后添加类似的内容。只是想立即获得结果。提前感谢你能指出的任何事情。

1 个答案:

答案 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);
}