2014-09-10 3 views
0

"look"열이있는 products 테이블을 설정했습니다.이 열에는 테이블 열에서 쉼표로 구분 된 "1,6"과 같은 여러 범위에있을 수 있습니다.PHP 쿼리 중지 LIKE 중지 레코드 복제?

내가 겪고있는 문제는 "1,6,8"에 범위를 추가하면 범위가 "11"로 표시되기 때문에 범위가 10 및 11에 나타납니다.

내 코드는 다음과 같습니다

$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

+2

@Machavity는 코드 개선 사이트에 댓글을 달아 가난한 코드에 대해 그를 슬램하기 만하거나 도움이 될 계획입니까? – Joe

+0

테이블, 입력 및 예상 결과에 sampe 데이터를 입력하십시오. – Bulat

답변

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


그냥 재미는 여기를 전체 코드에 sing mysi :

$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에서이 함수를 잊는다. –

1

'1,2,10'에서 '1'을 두 번 찾습니다. 그러나 여러분은 ', 1,', '1,2,10,'라고만 찾습니다. 이 말은 concat을 사용하여 쉼표를 추가하는 것입니다.

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

이것은 표준 SQL입니다 (다소 차이가 있지만 문자열을 연결하는 방법이 다릅니다). MySQL에서는 Anthony가 제안한 FIND_IN_SET을 사용할 수 있습니다. –