2009-03-06 4 views
1

J'ai une fonction, qui est de retourner un tableau de lignes contenant des enregistrements d'une base de données, sélectionnés en fonction d'une requête LIKE. Je veux que cette requête soit une instruction préparée pour des raisons de sécurité. Apparemment, je ne peux pas utiliser les paramètres liés et la fonction de requête comme je le fais. Je ne suis pas sûr alors, de la façon de me garder une requête comme une instruction préparée, et de retourner les lignes que j'essaie de retourner.Récupérer des données à partir d'une instruction préparée

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

La boucle while n'est jamais entrée du tout.

+1

pourquoi le exécutons en commentaire ?? – vladr

+0

Dup de [problèmes d'instruction SQL like] (http://stackoverflow.com/q/618527/). – outis

Répondre

4

Bien que fastidieuse si vous avez plusieurs colonnes, vous pouvez simplement faire:

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

Essentiellement, vous devez créer votre tableau associatif nécessaire vous, puisque vous ne pouvez pas utiliser $result_set->fetch_assoc().

+0

hmmmm, y a-t-il une raison pour ne pas pouvoir fetch_assoc avec une requête? –

+0

Non, mais vous ne pouvez pas utiliser 'query' avec des paramètres liés. Si vous êtes vraiment prudent, vous pouvez utiliser 'query' et 'mysql_real_escape_string' pour vous protéger de l'injection SQL. – Alnitak

+0

En outre, votre fonction donne inattendu T_IF cependant je ne vois pas pourquoi. –

1

Ecrire "... LIKE ? ..." (plutôt que "... LIKE '%?%' ...") et $getRecords->bind_param("s", "%$searchString%");

Questions connexes