2009-03-06 16 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

退屈なものの、あなただけ行うことができます:あなたは$result_set->fetch_assoc()を使用することはできませんので、

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); 
    } 
} 

は基本的に、あなたは、あなたの必要な連想配列を自分で作成する必要があります。

+0

hmmmm、クエリでfetch_assocを実行できないような理由はありますか? –

+0

いいえ、バインドされたパラメータで 'クエリ'を使用することはできません。 _really_慎重であれば、 'query'と 'mysql_real_escape_string'を使ってSQLインジェクションから身を守ることができます。 – Alnitak

+0

また、あなたの関数は予期しないT_IFを与えますが、なぜ私は見ることができません。 –

1

(というよりも"... LIKE '%?%' ...")ライト"... LIKE ? ..."$getRecords->bind_param("s", "%$searchString%");

関連する問題