【问题标题】:Prepared statement LIKE wildcard准备好的语句 LIKE 通配符
【发布时间】:2014-08-09 19:12:08
【问题描述】:

我已经创建了一个函数,它接受一个搜索列、搜索词和一个 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() 检索到一个连接。假设我正在做我所有的错误检查和我的控制器级别的所有事情,并且以后可能会添加类似的东西。只是想马上得到结果。提前感谢您指出的任何内容。

【问题讨论】:

  • searchcolumn 不能是绑定变量。你不能绑定表/列名

标签: php mysql mysqli prepared-statement


【解决方案1】:

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 列入白名单也是一个好主意,在执行此操作之前验证它确实是您 book 表中的一列

编辑

当您只使用数组中的关联值时,为什么还要使用fetch_array(MYSQLI_BOTH)?使用fetch_assoc() 会更好,或者你可以更聪明,使用fetch_object(),然后你就不需要逐个属性地填充你的Book 对象属性

考虑:

while ($book = $result->fetch_object('Book')) {
    array_push($books, $book);
}

【讨论】:

  • 你的意思是sprintf?我在使用sprint 时得到Error: call to undefined function
  • @Nathan - 是的,错字,已修复
  • 喜欢自动填充Book 对象的建议。只是不知道我可以让字段像那样自动对齐。感谢您的提示,绝对有用。
猜你喜欢
  • 2012-01-05
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 2016-04-18
  • 1970-01-01
  • 2014-09-04
相关资源
最近更新 更多