在字符串中查找至少一个子字符串

时间:2017-04-25 21:59:11

标签: php

我有一张语言表:

用户

    Id languages
    --------------------------
    1  english,french,german
    2  english,german
    3  english,french
    4  french

我有一个复选框下拉列表(如下)。 我想让用户能够在每个id在用户表中显示的语言中搜索某种语言的子字符串。

例如 - 如果复选框"法语"将标记然后它将在页面上给出id的结果1 3和4。

我想过使用"在套装中找到"功能但如何?

这是代码:     

         var expanded = false;

        function showCheckboxes() {
          var checkboxes = document.getElementById("checkboxes");
          if (!expanded) {
            checkboxes.style.display = "block";
            expanded = true;
          } else {
            checkboxes.style.display = "none";
            expanded = false;
          }
        }   
        </script>

<tr>
      <td>Languages</td>
      <td dir="rtl">

          <form method="post" action="exxx.php">
          <div class="multiselect" dir="rtl">
          <div class="selectBox" onclick="showCheckboxes()" dir="rtl">
        <select>
        <option>choose:</option>
        </select>
        <div class="overSelect" dir="rtl"></div>
        </div>
        <div id="checkboxes">
        <label for="one">  
            <input type="checkbox"  id="one" name="languages[]" 
            value="english">english</label>
            <label for="two">
            <input type="checkbox" id="two" name="languages[]" value="french" 
             >french</label>
            <label for="three">
            <input type="checkbox" id="three" name="languages[]" 
            value="arabic">german</label>
      </div>
  </div>  
   <input type="submit" name="submit">
   </form>

现在,这&#34;语言&#34;字段是我所拥有的一些搜索字段之一,因此我想提取此查询:

$query = "select * from where 1=1,..."

$query.=" AND  
find_in_set(ITEM1 of checkboxes selected, languages) <> 0 OR 
find_in_set(ITEM2 of of checkboxes selected ,languages) <> 0 OR ...
etc.

有什么建议吗?

即使我将表格规范化:我的问题主要是从下拉列表中获取值并按它们搜索。我不知道选择了多少项,所以我无法写

Select where languages = '$languages[0]' OR languages='languages[1]'

我会给我一个偏移量我只选择了一个。

1 个答案:

答案 0 :(得分:1)

不是在用户表的一列中列出语言,而是创建另一个表来将用户链接到语言,如下所示:

user_languages:

user_id   language
   1      english
   1      french
   1      german
   2      english
   2      german
   3      english
   3      french
   4      french

然后,您就可以使用the IN operator将行与您的复选框中的值列表进行匹配。

SELECT DISTINCT user_id FROM user_languages WHERE language IN('french','german')

这适用于所选的任意数量的复选框。有关如何使用PDO准备语句执行此操作的简要示例:

$placeholders = rtrim(str_repeat('?,', count($_POST['languages'])));
$sql = "SELECT DISTINCT user_id FROM user_languages WHERE language IN($placeholders)";
$statement = $pdo->prepare($sql);
$statement->execute($_POST['languages']);
$ids = $statement->fetchAll(PDO::FETCH_COLUMN);