使用PHP和SQL db时非字母数字字符的搜索问题

时间:2018-12-14 23:34:38

标签: php sql regex pdo

当查找具有非字母数字字符的部分时,我很难弄清楚如何在SQL db上实现搜索。

搜索非常有效,除非要搜索的字符中有连字符(例如连字符)或括号。 (某些零件号带有正斜杠,但在查询时会正确返回。)

例如:搜索1492-PDL3111将返回0个结果。 (部分字符串搜索效果很好,因此,如果我搜索1492,我将返回1492-PDL3111部件号以及1492-PDL31124、1492-PDL3141、1492-PDL3161,这很好,但是如果包含连字符,则我m返回0结果。当我从字符串的中间或结尾进行部分字符串搜索时,我也会得到正确的结果。唯一的失败是当我搜索具有非数字字符的部件号时。

我正在粘贴下面的代码,希望这里有人能提供帮助。我一直在搜索并寻找无济于事的解决方案。

提前谢谢! Thymallus

<?php 
$searchcross=$_GET[ 'crossref']; 
$remove=array( " ", "-"); 
$searchcross=str_replace($remove, "", $searchcross); 
if ($searchcross !="" ){ 
$query=$handler->prepare("SELECT * FROM php_cross_reference WHERE competitor_part_no LIKE :part_no ORDER BY competitor_part_no;"); 


$query->bindValue(':part_no', '%' . $searchcross . '%');   
$query->execute(); 
if ($query->rowCount()){ ?>

<!--If statement, only make this if there are results?-->
<div class="table-section">
  <table class="search-table search-table-alt">
    <caption>
      <?php echo 'Search results for "'. $searchcross . '"' ?>
    </caption>
    <tr>
      <th>Competitor Part Number</th>
      <th>Competitor</th>
      <th>Our Part Number</th>
    </tr>

    <!--This is where the PHP loop should begin-->
    <?php 
      while ($r=$query->fetch(PDO::FETCH_ASSOC)){ 
    ?>

    <tr>
      <td>
        <?php 
          echo '<strong>',$r[ 'competitor_part_no'], '</strong>' 
        ?>
      </td>
      <td>
        <?php 
          if ($r[ 'competitor_name']){ 
            echo $r[ 'competitor_name']; 
          } else { 
            echo 'N/A'; 
          } 
        ?>
      </td>
      <td>
        <?php 
          if ($r[ 'product_documentation']){ 
            echo '<strong><a href="',$r[ 'product_documentation'], '">',$r[ 'our_part_no'], '</a></strong>'; 
          } else { 
            echo '<strong>',$r[ 'our_part_no'], '</strong>'; 
          } ;?>
      </td>

      <?php 
        } 
        //PHP loop end 
      ?>
  </table>
</div>

<!--  PHP if statement end?-->
<?php 
    } else { 
      echo '<h3 class="module">Your search returned '.$query->rowCount().' results.</h3>'; 
    } 
  } else { 
    echo '<h3 class="module">please enter a search</h3>'; 
  } 
?>

2 个答案:

答案 0 :(得分:0)

这样做时,您要从搜索字符串中删除连字符和空格:

$searchcross=str_replace($remove, "", $searchcross); 

如果要在搜索时忽略这些字符,则还需要从表中的字符串中删除它们。因此查询中的条件应为:

WHERE REPLACE(REPLACE(competitor_part_no, '-', ''), ' ', '') LIKE :part_no

答案 1 :(得分:0)

感谢您的输入。实际上已从此数组中删除了空格和连字符: $ remove = array(“”,“-”); 那不是期望的,一旦我再次查看他们的代码,我就看到了问题。 我删除了那行代码,它运行完美。