2009-03-06 19 views
1

Ich habe eine Funktion, die ein Array von Zeilen zurückgeben soll, die Datensätze aus einer Datenbank enthalten, die basierend auf einer LIKE-Abfrage ausgewählt werden. Ich möchte, dass diese Abfrage aus Sicherheitsgründen eine vorbereitete Aussage ist. Anscheinend kann ich gebundene Parameter und die Abfragefunktion nicht verwenden, wie ich es tue. Ich bin mir nicht sicher, wie ich mich als vorbereitete Aussage halten und die Zeilen zurückgeben soll, die ich zurückgeben möchte.Abrufen von Daten aus einer vorbereiteten Anweisung

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

Die while-Schleife wird nie eingegeben.

+1

warum der Kommentar gesetzt ist execute ?? – vladr

+0

Dup von [SQL wie Anweisung Probleme] (http://stackoverflow.com/q/618527/). – outis

Antwort

4

Obwohl langweilig, wenn Sie viele Spalten haben, könnten Sie einfach tun:

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

Im Wesentlichen müssen Sie sich Ihr gewünschtes assoziatives Array erstellen, da Sie nicht $result_set->fetch_assoc() verwenden können.

+0

hmmmm, gibt es irgendeinen Grund, nicht in der Lage zu sein, account mit Abfrage zu holen? –

+0

Nein, aber Sie können 'Abfrage' mit gebundenen Parametern nicht verwenden. Wenn Sie _really_ vorsichtig sind, können Sie 'query' und 'mysql_real_escape_string' verwenden, um sich vor SQL-Injection zu schützen. – Alnitak

+0

Auch Ihre Funktion gibt unerwartete T_IF, aber ich kann nicht sehen, warum. –

1

schreiben "... LIKE ? ..." (statt "... LIKE '%?%' ...") und $getRecords->bind_param("s", "%$searchString%");

Verwandte Themen