Php Mysql未返回预期结果
我尝试了很多不同的方法,我不明白为什么这不能返回我预期的结果。这是我现在的代码。在LIKE之后,我在SQL语句中尝试了许多变量的变体,但没有任何结果返回预期的数组。我还验证了$search变量中的字符串是否正确 index.php操作开关(此开关正常工作): 我的数据库搜索功能: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
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%'