2014-09-10 124 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