如何使用文件名使用多个搜索键

时间:2013-11-06 10:37:14

标签: php html mysql

我有一个数据库,其中的文件名为abcd100.00b,abcd101.00b,...

我需要一个代码,当用户单独输入abcd然后100到110时,应显示名称为abcd且范围为100到110的所有文件。

这些是具有iisc001.10h等命名约定的rinex文件。有多个文件,范围从iisc001.10hiisc100.30h,依此类推。我希望能够搜索iisc(前4个字符),然后搜索001到100 - 此范围内的所有文件都需要以表格形式显示。

以下代码只能显示前四个字符,我该如何实现呢?

    <?php

//capture search term and remove spaces at its both ends if the is any

     $searchTerm = trim($_GET['keyname']) ;

//check whether the name parsed is empty

     if($searchTerm == "rinex_file")
     {
       echo "Enter name you are searching for.";
       exit();
      }
      if($searchTerm == "rinex_file")
     {
      echo "Enter name you are searching for.";
      exit();
      }

//database connection info

    $host = "localhost"; //server
    $db = "rinex"; //database name
    $user = "m"; //dabases user name
    $pwd = "c"; //password

//connecting to server and creating link to database

    $link = mysqli_connect($host, $user, $pwd, $db);

//MYSQL search statement

    $query = "SELECT * FROM rinexo WHERE rinex_file LIKE '%$searchTerm%'";

     $results = mysqli_query($link, $query)  ;

/* check whethere there were matching records in the table
by counting the number of results returned */

     if(mysqli_num_rows($results) >= 1){
     echo '<table border="1">
     <tr>
     <th>rinex version</th>
     <th>program</th>
      <th>date</th>
     <th>maker name</th>
     <th>maker number</th>
      <th>observer</th>
      <th>agency</th>
     <th>position_X_Y_Z</th>
      </tr>';
     while($row = mysqli_fetch_array($results)){
     echo '<tr>
     <td>'.$row['rinex_version'].'</td>
     <td>'.$row['pgm'].'</td>
      <td>'.$row['date'].'</td>
      <td>'.$row['marker_name'].'</td>
        <td>'.$row['marker_no'].'</td>
         <td>'.$row['observer'].'</td>
        <td>'.$row['agency'].'</td>
      <td>'.$row['position_X_Y_Z'].'</td>

     </tr>';

       }
     echo '</table>';

      }else{

       echo "There was no matching record for the name " . $searchTerm;


        }

1 个答案:

答案 0 :(得分:0)

您可以尝试使用正则表达式:

SELECT * 
FROM rinexo 
WHERE rinex_file regexp '^$searchTerm([0][0-9]{2}|100)\.' 

如果$ searchTerm ='iisc',则此代码将获取从“iisc001”开始的记录。并且达到“iisc100。”。你需要引用$ searchTerm(php函数preg_quote),所以没有特殊字符不会进入查询。

http://dev.mysql.com/doc/refman/5.1/en/regexp.html

的mysql中查看有关正则表达式的更多信息

但是reqular表达式可以不那么快,如果可能的话创建addtional列,其中将放置你需要的整数值,例如:

1 for iisc001.10h
2 for iisc002.10h
100 for iisc100.10h

搜索词(在数字之前,作为“iisc”)也有意义移动到单独的列并为它们创建索引,并且搜索将仅在它们上进行。

还有一种方式:

select rinex_file, 
       substr(rinex_file, 1, 4) as prefix,
       substr(rinex_file, 5, locate('.', rinex_file)-5) as digits,
       substr(rinex_file, -3, 2) as suffix,
       substr(rinex_file, -1) as postfix
from rinexo
where substr(rinex_file, 1, 4) like 'iis%'
  and substr(rinex_file, 5, locate('.', rinex_file)-5) like '0%'