我正在尝试创建一个PHP搜索查询,用于搜索数据库中的每个单词。但是在提交搜索查询时我收到此错误。
警告:SQLite3 :: query():无法准备语句:1,无法识别的令牌:"'%export%"在第107行的C:\ xampp \ htdocs \ xport \ searchresult.php
以下是我的代码。
搜索页面
if (isset($_POST['mainSearch']))
{
if (!empty($_POST['mainSearch']))
{
$searchquery = $_POST['mainSearch'];
$query = str_replace(" ", "+", $_POST['mainSearch']);
header("Location: searchresult.php?mainSearch=" . $query);
}
}
显示搜索结果的页面。
if (isset($_GET["mainSearch"]))
{
$condition = '';
$query = explode(" ", $_GET['mainSearch']);
foreach ($query as $text)
{
$condition .= "question LIKE '%".SQLite3::escapeString($text)."%' OR answer LIKE '%".SQLite3::escapeString($text)."%'";
}
$condition = substr($condition, 0, -4);
$sql_query = "SELECT * FROM questions WHERE " . $condition;
$result = $db->query($sql_query);
if ($result)
{
while ($row = $result->fetchArray(SQLITE3_ASSOC))
{
echo '<div class="quesbox_2">
<div class="questitle">
<h2>'.$row["question"].'</h2>
</div>
<div class="quesanswer">'.$row["answer"].'</div>
</div>';
}
}
else
{
}
}
出现此错误的原因是什么。我认为这是因为字符串没有被正确转义,如果这是mysqli_real_escape_string()
中我SQLite3
的原因(这是我正在使用的数据库)。如果没有,请问我该如何解决这个问题。
答案 0 :(得分:1)
将子字符串的数量更改为-3
。
因此,更改
$condition = substr($condition, 0, -4);
到新
$condition = substr($condition, 0, -3);
这应该可以解决问题。
答案 1 :(得分:0)
似乎您的OR
子句中需要WHERE
条件才能获取与任何单词匹配的所有结果。只需在查询部分的末尾添加OR
,就可以了。
foreach ($query as $text)
{
$condition .= "question LIKE '%".SQLite3::escapeString($text)."%' OR answer LIKE '%".SQLite3::escapeString($text)."%' OR ";
}
// Will chop 4 characters ' OR ' from end of the string
$condition = substr($condition, 0, -4);
为了使它变得很干净,你可以从参数中检索一次escapeString,以避免在循环中一次又一次地转义它。
$mainSearch = SQLite3::escapeString($_GET['mainSearch']);
$query = explode(" ", $mainSearch);
foreach ($query as $text)
{
$condition .= "question LIKE '%$text%' OR answer LIKE '%$text%' OR ";
}
// Will chop 4 characters ' OR ' from end of the string
$condition = substr($condition, 0, -4);
答案 2 :(得分:0)
如果您尝试按每个单词搜索
,请尝试这种方法string s = "Abc.CDE.EFG";
string [] n = s.Split('.');
n[0] = "ZEF";
string p = string.Join(".",n);
Console.WriteLine(p);
}