如何将 $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-&gt;prepare('SELECT * FROM article WHERE art_country LIKE ? OR art_city LIKE ?'); $art_country = '%'.$art_country.'%'; $art_city = '%'.$art_city.'%'; $stmt-&gt;bind_param('ss', $art_country, $art_city); if ($stmt-&gt;execute()) $result = $stmt-&gt;get_result(); ... 应该让您走上正确的道路。我已经为您更正了查询和参数。 不容易,因为我看不到您的数据,也看不到您提交的搜索词。请提供样本数据库数据、样本输入、预期结果和实际结果。然后我们就可以理解这个问题了。 【参考方案1】:

根据 cmets 中的讨论,这应该是您需要的最终版本。

变更摘要:

重新设置$search变量,该变量从$_POST获取数据,然后作为两个参数的参数值传递 在您的查询中重新使用 LIKE,以使查询与旧代码中的查询等效 在bind_param 的第一个参数中添加一个额外的s,因为您有2 个参数而不是1 个 将if($result = $mysqli-&gt;query($sql)) 替换为if ($stmt-&gt;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 中,如何使用“搜索视图”模块将搜索词过滤器添加到我的视图中?

致命错误:调用未定义的方法 mysqli_stmt::get_result()

如何将 Google 搜索框添加到我的网站?

如何将 Google 地图搜索框添加到我的自定义地图?