2009-03-06 7 views
1

LIKE 쿼리를 기반으로 선택된 데이터베이스의 레코드를 포함하는 행 배열을 반환하는 함수가 있습니다. 보안상의 이유로이 쿼리를 준비된 문으로 지정합니다. 분명히 내가하고있는 것처럼 바인딩 된 매개 변수와 쿼리 함수를 사용할 수 없습니다. 그때 나는 준비된 문장으로 질의를 유지하고, 반환하려고하는 행을 반환하는 방법에 대해 확신 할 수 없다.준비된 문에서 데이터를 가져 오는 중

function getRowsByArticleSearch($searchString, $table, $max) { 
    $con = mysqli_connect("localhost", "x", "x", "x"); 
    //global $con; 
    $recordsQuery = "SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME, date_format(str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), '%d %m %Y') AS shortDate FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE '%?%' ORDER BY str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s')" . $max; 
    if ($getRecords = $con->prepare($recordsQuery)) { 
     $getRecords->bind_param("s", $searchString); 
     //$getRecords->execute(); 
     echo "test if"; 
     //$getRecords->bind_result($ARTICLE_NO, $USERNAME, $ACCESSSTARTS, $ARTICLE_NAME, $shortDate); 
     while ($getRecords->fetch()) { 
      $result = $con->query($recordsQuery); 
      $rows = array(); 
      echo "test while"; 
      while($row = $result->fetch_assoc()) { 
       $rows[] = $row; 
      } 
     } 
     return $rows; 
    } else { 
     print_r($con->error); 
    } 
} 

while 루프는 전혀 입력되지 않습니다. 지루한 비록

+1

이유는 주석 실행된다 ?? – vladr

+0

[SQL과 같은 문 문제] (http://stackoverflow.com/q/618527/). – outis

답변

4

당신이 많은 열을 가지고있는 경우에, 당신은 다만 수 :

function getRowsByArticleSearch($searchString, $table, $max) { 

    $con = mysqli_connect("localhost", "x", "x", "x"); 
    $recordsQuery = "SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME, date_format(str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), '%d %m %Y') AS shortDate FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE ? ORDER BY str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s')" . $max; 
    if ($getRecords = $con->prepare($recordsQuery)) { 
     $getRecords->bind_param("s", $searchString); 
     $getRecords->execute(); 
     $getRecords->bind_result($ARTICLE_NO, $USERNAME, $ACCESSSTARTS, $ARTICLE_NAME, $shortDate); 
     $rows = array(); 
     while ($getRecords->fetch()) { 
      $row = array(
       'ARTICLE_NO' => $ARTICLE_NO, 
       'USERNAME' => $USERNAME, 
       ... 
      ); 
      $rows[] = $row; 
     } 
     return $rows; 
    } else { 
     print_r($con->error); 
    } 
} 

은 기본적으로 당신이 $result_set->fetch_assoc()를 사용할 수 없기 때문에, 당신의 필수 연관 배열 자신을 만들어야합니다.

+0

흠, 쿼리와 함께 fetch_assoc을 수행 할 수없는 이유가 있습니까? –

+0

아니요. 그러나 바인딩 된 매개 변수와 함께 '쿼리'를 사용할 수 없습니다. _really_ 신중하다면 'query'와 'mysql_real_escape_string'을 사용하여 SQL 주입으로부터 자신을 보호 할 수 있습니다. – Alnitak

+0

또한, 당신의 함수는 예기치 않은 T_IF를 제공하지만 나는 왜 그런지 알 수 없다. –

1

쓰기 ("... LIKE '%?%' ..."보다 오히려) "... LIKE ? ..."$getRecords->bind_param("s", "%$searchString%");

관련 문제