如何使用 PHP 搜索包含多个单词的值的数据库?

Posted

技术标签:

【中文标题】如何使用 PHP 搜索包含多个单词的值的数据库?【英文标题】:How to search database using PHP with values containing multiple words? 【发布时间】:2021-03-23 18:55:34 【问题描述】:

我正在我的 php 课程中开展一个项目,我必须使用 SQLite 为博物馆和他们所在的国家/地区创建一个数据库,从网页(使用 PHP/html)连接到该数据库并生成一个基于博物馆的列表从下拉列表中选择的国家。我遇到的问题是,我似乎无法从包含多个单词(美国、英国等)的国家/地区值返回数据。它非常适合单字国家。生成了包含正确信息的预选列表,但未正确生成选择列表。

这是一个数据库示例(SQLite):

CREATE TABLE museums (
    museum_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    museum_name TEXT NOT NULL,
    country TEXT NOT NULL
);

INSERT INTO museums (museum_name, country) VALUES

('Louvre'  ,  'France'),
('State Hermitage Museum'  ,  'Russia'),
('National Museum of China'  ,  'China'),
('Metropolitan Museum of Art'  ,  'United States'),
('Vatican Museums'  ,  'Vatican City'),
('Tokyo National Museum'  ,  'Japan'),
('National Museum of Anthropology'  ,  'Mexico'),
('Victoria and Albert Museum'  ,  'United Kingdom'),
('National Museum of Korea'  ,  'South Korea'),
('Art Institute of Chicago'  ,  'United States');

这是 PHP/HTML 代码:

<?php

    $museumDb = new PDO('sqlite:museum.sqlite');
    $query = $museumDb->prepare('SELECT * FROM museums');
    $query->execute();
    $museums = $query->fetchAll(PDO::FETCH_ASSOC);
    
    $country = $museumDb->prepare('SELECT DISTINCT country FROM museums ORDER BY country ASC');
    $country->execute();
    $countryLists = $country->fetchAll(PDO::FETCH_ASSOC);

?>

 <form method="POST"> //selection form
   <fieldset>
      <legend><strong>Select from the drop down list below to narrow your search results by country</strong></legend>

      
        <select name="country" id="country">

           <?php foreach($countryLists as $countryList): ?>

           <!--Generates drop down list of countries from DB-issue may be here?-->
           <option value=<?php print $countryList['country']; ?>><?php print $countryList['country']; ?></option>     
           <?php endforeach; ?>
    
        </select>
       
            <input type="submit" name="submit" value="Submit">
            
        </fieldset>
    </form>
    

<?php if (isset($_POST) && !empty($_POST)) 
        $countryName = htmlspecialchars($_POST['country']); //retrieves POST data from form selection
        print $countryName; //testing

        $new = $museumDb->prepare("SELECT country, museum_name FROM museums WHERE country = '$countryName'"); //sqlite query setting country = selected country from form
        $new->execute();
        $newLists = $new->fetchAll(PDO::FETCH_ASSOC);


        print '<pre><code>';
        while ($row = $new->fetch(PDO::FETCH_ASSOC)) //testing
            var_dump($row);
        
        

        var_dump($newLists); //testing query
        var_dump($new); //testing
        print '</code></pre>';
        ?>


<table><!--table not generating for countries with two words in name-->
     <tr>
          <th>Museum Name</th>
          <th>Country</th>
     </tr>
    
     <?php foreach ($newLists as $newList): ?>
            
          <tr>
              <td><?php print $newList['museum_name']; ?></td>
              <td><?php print $newList['country']; ?></td>
          </tr>
            
      <?php endforeach; ?>

</table>

【问题讨论】:

htmlspecialchars 会将空格转换为与 DB 值不匹配的 HTML 实体。相反,您应该使用参数化查询。它们实际上很容易实现,对您来说只需更改 2 或 3 行即可。 对值使用引号:&lt;option value="&lt;?php print $countryList['country']; ?&gt;"&gt; 就像您对其他所有属性所做的那样 我可能错了回复:htmlspecialchars。看起来它不会改变空间。但是关于:参数化查询的建议仍然有效。 @brombeer 谢谢!这是一个我会花几个小时来解决的问题,只是为了找出它的一个简单的解决方法。 @waterloomatt 谢谢我一定会研究参数化查询以了解它们的全部内容。看来 brombeer 的建议为我解决了这个问题 【参考方案1】:

我不知道如何将此问题标记为已回答,但一条评论为我提供了我需要更改的信息,这是一个非常简单的解决方法。

原行:

 <option value=<?php print $countryList['country']; ?>><?php print $countryList['country']; ?></option>

固定线路:

 <option value="<?php print $countryList['country']; ?>"><?php print $countryList['country']; ?></option>

谢谢!

【讨论】:

以上是关于如何使用 PHP 搜索包含多个单词的值的数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle Apex 中过滤给定单词的穿梭列表?

wordpress 搜索不适用于多个单词

php - 数组中的值的“前两个单词”多重匹配然后array_intersect?

使用PHP和MySQLi进行数据库搜索的多个单词字符串

带有多个单词的PHP Mysql搜索查询

如何在 Jquery 中搜索数组,如 SQL LIKE %value% 语句