2014-09-10 117 views
0

我已经设置了一个带有“外观”列的产品表,在这个列中它可以有多个范围,例如表格列中的所有逗号分隔的“1,6”。PHP查询停止LIKE停止记录重复?

我遇到的问题是,如果一个范围被添加到“1,6,8”范围似乎显示在10和11也是我认为是因为它在列中包含“1”。

我的代码是:

$query_RSsec = "SELECT * FROM look WHERE seolink = '$_REQUEST[range]'"; 
$RSsec = mysql_query($query_RSsec, $swede) or die(mysql_error()); 
$row_RSsec = mysql_fetch_assoc($RSsec); 
$totalRows_RSsec = mysql_num_rows($RSsec); 

$query_RSrange = "SELECT ranges.*, ranges.name as rname, ranges.seolink as rseo, ranges.image as rimage, category.*, category.name as cname, category.seolink as cseo FROM (ranges LEFT JOIN category ON ranges.category = category.id) WHERE look LIKE '%$row_RSsec[id]%' ORDER BY ranges.name ASC"; 
$RSrange = mysql_query($query_RSrange, $swede) or die(mysql_error()); 
$row_RSrange = mysql_fetch_assoc($RSrange); 
$totalRows_RSrange = mysql_num_rows($RSrange); 
$use = 'yes'; 

然后返回这些我有以下代码:

<?php do { 
      if (strlen($row_RSrange['rname']) > 10) { 
        $name = substr(str_replace('&','&amp;',$row_RSrange['rname']),0,10) . '...'; 
      } else { 
       $name = str_replace('&','&amp;',$row_RSrange['rname']); 
      } 
      ?> 

<li><a title="<?php echo str_replace('&','&amp;',$row_RSrange['rname']); ?>" href="/products/<?php echo $row_RSrange['cseo']; ?>/<?php echo $row_RSrange['rseo']; ?>"><img src="/prod-images/category/<?php echo $row_RSrange['rimage']; ?>" alt="<?php echo str_replace('&','&amp;',$row_RSrange['rname']); ?>" title="<?php echo str_replace('&','&amp;',$row_RSrange['rname']); ?>" width="127" height="127" /><br /> 
     <?php echo $name; ?></a></li> 
     <?php } while ($row_RSrange = mysql_fetch_assoc($RSrange)); ?> 
+1

没有任何针对SQL注入的安全性。并且不推荐使用'mysql_'函数。真棒。 – Machavity 2014-09-10 12:44:01

+2

@Machavity您是否对代码改进网站发表评论,只是抨击他的糟糕代码,或者您是否计划提供帮助? – Joe 2014-09-10 12:45:15

+0

请提供表格中的样本数据,输入和预期结果。 – Bulat 2014-09-10 12:48:48

回答

2
WHERE FIND_IN_SET('$row_RSsec[id]',look) <> 0 

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set


只是为了好玩,这里是你的整个代码你唱MySQLi:

$swede = new mysqli('localhost', 'my_user', 'my_password', 'my_db'); 

try { 
    $RSsec = $swede->query(" 
          SELECT id FROM look 
          WHERE seolink = '{$_REQUEST['range']}' 
          "); 
} catch (mysqli_sql_exception $e) { 
    echo $e->message; 
} 

$RSsecTotalRows = $RSsec->num_rows; 

foreach($RSsec as $id => $RSsecID) { 
    try 
    { 
     $RSrange = $swede->query(" 
     SELECT 
      ranges.*, ranges.name AS rname, ranges.seolink AS rseo, 
      ranges.image AS rimage, 
      category.*, category.name AS cname, category.seolink AS cseo 
     FROM ranges 
     LEFT JOIN category ON ranges.category = category.id 
     WHERE FIND_IN_SET('$RSsecID',look) <> 0 
     ORDER BY ranges.name ASC 
     "); 

     $RSrangeTotalRows = $RSrange->num_rows; 

     foreach($RSrange as $RSrangeRow) { 
      $name = htmlspecialchars($RSrangeRow['rname']); 
      $name = (strlen($name) > 10) ? substr_replace($name,"...",10) : $name; 
      $href_url = "/products/{$RSrangeRow['cseo']}/{$RSrangeRow['rseo']}"; 
      $img_url = "/prod-images/category/{$row_RSrange['rimage']}"; 
?> 

<li> 
    <a title="<? echo $name; ?>" 
     href="<? echo $href_url; ?>"> 
     <img src="<? echo $img_url; ?>" 
     alt="<? echo $name; ?>" 
     title="<? echo $name; ?>" 
     width="127" height="127" /> 
     <br /> 
     <? echo $name; ?> 
    </a> 
</li> 

<?   
     } 
    } catch (mysqli_sql_exception $e) { 
     echo $e->message; 
    } 
} 
+1

+1。我总是在MySQL中忘记这个功能。 – 2014-09-10 12:51:10

1

在'1,2,10'中找到两次'1'。但是,你会发现',1,'只有一次,'1,2,10,'。这就是说,使用concat来添加逗号:

WHERE concat(',',look,',') LIKE '%,$row_RSsec[id],%' 
+0

这是标准的SQL(或多或少;如何连接字符串的方式不同)。在MySQL中,您可以按照Anthony的建议使用FIND_IN_SET。 – 2014-09-10 12:52:20