Php Mysql未返回预期结果

Php Mysql未返回预期结果,php,mysql,Php,Mysql,我尝试了很多不同的方法,我不明白为什么这不能返回我预期的结果。这是我现在的代码。在LIKE之后,我在SQL语句中尝试了许多变量的变体,但没有任何结果返回预期的数组。我还验证了$search变量中的字符串是否正确 index.php操作开关(此开关正常工作): 我的数据库搜索功能: function search_books($search_word){ global $db; $query = ' SELECT * FROM books WHERE bookTitle LI

我尝试了很多不同的方法,我不明白为什么这不能返回我预期的结果。这是我现在的代码。在LIKE之后,我在SQL语句中尝试了许多变量的变体,但没有任何结果返回预期的数组。我还验证了$search变量中的字符串是否正确

index.php操作开关(此开关正常工作):

我的数据库搜索功能:

function search_books($search_word){
global $db;
$query = ' SELECT * FROM books
           WHERE bookTitle LIKE :search_word  ';
$statement = $db->prepare($query);
$statement->bindValue(":search_word", $search_word);
$statement->execute();
$results_search = $statement->fetchAll();
$statement->closeCursor();
return ($results_search);
}
每次$results为NULL并将我踢到不返回结果的页面,即使它应该返回结果。在该页面上,我验证$search是否包含正确的单词,以及$results和$results\u search的数组大小是否为0


(是的,我知道我应该清理$search,这不是上线,只是为了分配任务)

更新:

您使用query绑定变量,但没有将绑定值放入query中,因此请使用以下代码:(希望它对您有用!)


这就是你所需要的

你要找的是通过在搜索词中添加
%
来用通配符包围搜索词,如下所示:

$search_word = '%' . $search_word . '%';

然后,只需像现在一样准备/绑定/执行。这是更改后的代码:

function search_books($search_word){
    global $db;
    $search_word = '%' . $search_word . '%'; // added
    $query = ' SELECT * FROM books
           WHERE bookTitle LIKE :search_word  ';
    $statement = $db->prepare($query);
    $statement->bindValue(":search_word", $search_word);
    $statement->execute();
    $results_search = $statement->fetchAll();
    $statement->closeCursor();
    return ($results_search);
}

在参数获取其位置后,查询看起来像这样:

SELECT * FROM books WHERE bookTitle LIKE '%something here%'
它将查找包含的任何内容
$search\u word
。例如:

对于
$search\u word
作为
铃声

指环王:国王的回归将是一场比赛


您可以在此处阅读更多信息:。

尝试从查询中删除
(引号),并将
$search\u word
替换为
:search\u word
。看一看,没有通配符的
Like
与an=。你需要在搜索字符串中添加/连接通配符吗?是的,我在发布后注意到了这一点。这是许多没有成功的迭代(:search\u word)之一。改变了它,我仍然有同样的问题。就使用LIKE而言,我必须使用它,因为我可能会从书名中搜索一个关键字,而不是一个完全匹配的关键字。我的想法正确吗?您是否尝试过在
搜索词前后添加
%
?类似于
$search\u word='%'之类的内容$搜索单词“%”。我们不要教/传播草率和危险的编码实践。如果你在没有准备好陈述的情况下发布了答案。另外,是的,我在发布后注意到了。这是许多没有成功的迭代之一。Jay,对不起,我只是在课堂上,在作业的框架内工作。一旦我完成了任务,我将研究mysqli,但事实上我只是在研究分配给我的内容。这不是关于mysqli@Alex,而是关于不使用准备好的语句。这个答案忽略了准备好的陈述。@JayBlanchard好的,我查过了。所以这些比我以前做的更安全?我为这些问题感到抱歉,我当然不是一个职业选手,只是按照我们展示的方式来做。我看到了一种在将语句发送到函数之前清理语句的方法,但是我没有看到任何关于准备语句的内容。另外,我非常感谢你的洞察力!是的,我在发帖子后注意到了。这是许多没有成功的迭代之一。改变了它,我仍然有同样的问题。@JayBlanchard这与准备好的陈述毫无关系!op已经在使用准备好的状态,这只会在状态使用之前添加
%
。我的答案甚至没有与数据库相关的php代码,只有字符串连接。@JayBlanchard这里没有草率或危险的编码实践。我从来没有建议op去做这件事。再读一遍我的答案,我只是展示了这个查询的样子。查看变量名:
$search\u word
,它将在准备好的语句中用作参数。我甚至从来没有暗示过你在暗示什么。顺便说一句,我从来没有在查询中直接使用过输入。@JayBlanchard我建议您再次阅读问题和答案,并密切注意变量名称和用法…@JayBlanchard建议与用户输入数据连接是危险的,有趣的是,这正是dup中正在做的事情:使用
%
的变量concat。连接不是在查询中完成的,而是在用作参数的变量中完成的。我真的不知道如何更好地解释它。编辑:我会很快编辑我的答案。
$search_word = '%' . $search_word . '%';
function search_books($search_word){
    global $db;
    $search_word = '%' . $search_word . '%'; // added
    $query = ' SELECT * FROM books
           WHERE bookTitle LIKE :search_word  ';
    $statement = $db->prepare($query);
    $statement->bindValue(":search_word", $search_word);
    $statement->execute();
    $results_search = $statement->fetchAll();
    $statement->closeCursor();
    return ($results_search);
}
SELECT * FROM books WHERE bookTitle LIKE '%something here%'