如何将 $stmt 合并到我的搜索中?
Posted
技术标签:
【中文标题】如何将 $stmt 合并到我的搜索中?【英文标题】:How do I incorporate $stmt into my search? 【发布时间】:2021-06-03 05:27:31 【问题描述】:现在我的代码行已经正确设置了所有内容,因为我的搜索栏可以正常工作,但是我正在尝试将第一段代码添加到我的第二段代码中以帮助防止 sql 注入。这让我绞尽脑汁,我觉得自己好像撞到了一堵砖墙。任何帮助将不胜感激。
我不知道如何合并这些代码行...
$stmt = $mysqli->prepare('SELECT * FROM article WHERE art_country=? OR art_city=?');
$stmt->bind_param('s', $art_country, $art_city);
$stmt->execute();
进入这个,让它工作......
$sql = "SELECT * FROM article WHERE art_country LIKE '%$search%' OR art_city LIKE '%$search%'";
if($result = $mysqli->query($sql))
if($result->num_rows > 0)
while($row = $result->fetch_array())
echo "
//populate to page code...
$result->free();
else
echo "No results, search again.";
else
echo "ERROR: Could not execute $sql. " .$mysqli->error;
谢谢
到目前为止,这里就是我所拥有的一切
<?php
if (isset($_POST['submit-search']))
$stmt = $mysqli->prepare('SELECT * FROM article WHERE art_country LIKE ? OR art_city LIKE ?');
$art_country = '%'.$art_country.'%';
$art_city = '%'.$art_city.'%';
$stmt->bind_param('ss', $art_country, $art_city);
if ($stmt->execute())
$result = $stmt->get_result();
if($result->num_rows > 0)
while($row = $result->fetch_assoc())
echo "
<div class='article-box'>
<a class ='search-link' href='".$row['art_URL']."'>
<img class='search-image' src=".$row['art_imageURL'].">
</a>
<a class ='search-link' href='".$row['art_URL']."'>
<h4 class='search-title'>".$row['art_title']."</h4>
</a>
<a class ='search-link' href='".$row['art_URL']."'>
<p class='article-search'>".$row['art_description']."</p>
</a>
<div class='description-container'>
<span><h3 class='index-page'>".$row['art_city']." | ".$row['art_country']." | ".$row['art_date']."</h3></span>
</div>
<div class='divider'></div>
</div>";
$result->free();
else
echo "No results, search again.";
?>
mysqli之前的原创和工作
if (isset($_POST['submit-search']))
//mysqli...... prevents people from editing the database
$search = mysqli_real_escape_string($conn, $_POST['search']);
//could just be title this seslects everything.
$sql = "SELECT * FROM article WHERE art_country LIKE '%$search%' OR art_city LIKE '%$search%'";
$result = mysqli_query($conn, $sql);
$queryResult = mysqli_num_rows($result);
if ($queryResult > 0)
while ($row = mysqli_fetch_assoc($result))
echo "
<div class='article-box'>
<a class ='search-link' href='".$row['art_URL']."'>
<img class='search-image' src=".$row['art_imageURL'].">
</a>
<a class ='search-link' href='".$row['art_URL']."'>
<h4 class='search-title'>".$row['art_title']."</h4>
</a>
<a class ='search-link' href='".$row['art_URL']."'>
<p class='article-search'>".$row['art_description']."</p>
</a>
<div class='description-container'>
<span><h3 class='index-page'>".$row['art_city']." | ".$row['art_country']." | ".$row['art_date']."</h3></span>
</div>
<div class='divider'></div>
</div>";
else
echo "No results. Search again.";
【问题讨论】:
你在 bind_param 中放了多少变量? 2 真的吗?那你为什么只使用 1 个“s”? 在你的工作代码中你使用 LIKE 而不是 EQUAL 可以吗? 侧节点:正如 Simone 指出的那样,您在这里得到的两个查询实际上并不等价。 无论如何...$stmt = $mysqli->prepare('SELECT * FROM article WHERE art_country LIKE ? OR art_city LIKE ?'); $art_country = '%'.$art_country.'%'; $art_city = '%'.$art_city.'%'; $stmt->bind_param('ss', $art_country, $art_city); if ($stmt->execute()) $result = $stmt->get_result(); ...
应该让您走上正确的道路。我已经为您更正了查询和参数。
不容易,因为我看不到您的数据,也看不到您提交的搜索词。请提供样本数据库数据、样本输入、预期结果和实际结果。然后我们就可以理解这个问题了。
【参考方案1】:
根据 cmets 中的讨论,这应该是您需要的最终版本。
变更摘要:
重新设置$search
变量,该变量从$_POST
获取数据,然后作为两个参数的参数值传递
在您的查询中重新使用 LIKE
,以使查询与旧代码中的查询等效
在bind_param
的第一个参数中添加一个额外的s
,因为您有2 个参数而不是1 个
将if($result = $mysqli->query($sql))
替换为if ($stmt->execute())
,以便检查查询是否成功
使用get_result()
从执行的语句中检索结果对象。
之后,您的代码可以照常进行。
<?php
if (isset($_POST['submit-search']))
$search = $_POST["search"];
$stmt = $mysqli->prepare('SELECT * FROM article WHERE art_country LIKE ? OR art_city LIKE ?');
$search = '%'.$search.'%';
$stmt->bind_param('ss', $search, $search);
if ($stmt->execute())
$result = $stmt->get_result();
if($result->num_rows > 0)
while($row = $result->fetch_assoc())
echo "
<div class='article-box'>
<a class ='search-link' href='".$row['art_URL']."'>
<img class='search-image' src=".$row['art_imageURL'].">
</a>
<a class ='search-link' href='".$row['art_URL']."'>
<h4 class='search-title'>".$row['art_title']."</h4>
</a>
<a class ='search-link' href='".$row['art_URL']."'>
<p class='article-search'>".$row['art_description']."</p>
</a>
<div class='description-container'>
<span><h3 class='index-page'>".$row['art_city']." | ".$row['art_country']." | ".$row['art_date']."</h3></span>
</div>
<div class='divider'></div>
</div>";
$result->free();
else
echo "No results, search again.";
?>
【讨论】:
有什么解释吗?你有什么改变? 不,我问的是答案。评论将被删除。请添加一些解释,以便我能够理解您要教给我的内容。 @Dharman 根据我的经验,评论很少被删除。但我会添加一个摘要。以上是关于如何将 $stmt 合并到我的搜索中?的主要内容,如果未能解决你的问题,请参考以下文章
在 Drupal 7 中,如何使用“搜索视图”模块将搜索词过滤器添加到我的视图中?