0

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

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

这些是具有命名约定的 rinex 文件,例如iisc001.10h. 有多个文件,范围从iisc001.10htoiisc100.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;


        }
4

1 回答 1

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 中的正则表达式

但是正则表达式的工作速度不会那么快,如果可能的话,创建附加列,其中将放置您需要的整数值,例如:

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%'
于 2013-11-06T15:45:15.877 回答