2009-03-09 8 views
0

J'ai vu quelques questions au cours des derniers jours qui ont utilisé mysqli mais où les réponses semblent ne pas avoir reconnu la différence entre $stmt->execute() et $db->query(). Si je comprends bien, il y a deux modèles différents pour accéder aux résultats dans mysqliMixage des fonctions d'accès aux données mysqli de PHP?

Celui-ci utilise SQL brute et exige que le programmeur pour échapper à l'entrée pour empêcher les attaques par injection SQL, mais permet au programmeur de récupérer un tableau associatif (ou un simple tableau) contenant column => value applications:

$result_set = $db->query("SAFE SQL QUERY HERE"); 
while ($row = $result_set->fetch_assoc()) { 
    # do something with $row['fieldname']; 
} 

Alternativement , vous pouvez le faire, ce qui permet bien de liaison des paramètres et des résultats, mais ne peut pas (autant que je sache) vous donner toute sorte de résultat simple tableau:

$stmt = $db-prepare("SQL QUERY WITH ? PLACEHOLDERS"); 
$stmt->bind_param("s", $input_variable); 
$stmt->execute(); 
$stmt->bind_results($output_col1, $output_col2); 
while ($stmt->fetch()) { 
    # do something with $output_col1 and $output_col2 
} 

Ma question est - est-il possible avec mysqli pour obtenir la sortie de tableau simple montrée dans le premier modèle, mais tout en utilisant toujours en toute sécurité les paramètres d'entrée liés selon le deuxième modèle?

Je ne trouve pas de toute façon de le faire (autre que d'utiliser PDO à la place!).

+0

Olafur - J'ai révulsés votre changement d'orthographe. "reconnu" est l'orthographe anglaise standard. – Alnitak

Répondre

1

Il existe plusieurs implémentations d'une fonction pour faire ce genre de chose dans les commentaires sur cette page du manuel php: mysqli_stmt::fetch

0

Je dirais que non. Je n'ai pas travaillé avec mysqli ou préparé des déclarations une tonne, je crois que chaque étape de votre deuxième exemple est discret et nécessaire. La seule consolation que je peux vous donner est que votre premier exemple a passé sous silence un échappement SQL que vous pouvez ignorer en toute sécurité dans votre second exemple.

1

Alnitak,

AFAIK, vous ne pouvez pas lier un tableau entier aux résultats automatiquement récupérés. Malheureusement. Toutefois, si vous êtes à la recherche d'un comportement de tableau hors de celui-ci (sans doute il est donc plus facile de passer les résultats autour), vous pouvez essayer ceci:

<?php 
$dbh = new mysqli(...); 
$arr = array(); 
if($stmt = $dbh->prepare('SELECT id, email FROM email_list'); 
{ 
    $stmt->execute(); 
    $stmt->bind_result($arr['id'], $arr['email']); 

    while($stmt->fetch()) 
    DoSomething($arr); 
} 
?> 

Cela vous donnera le comportement que vous avez demandé, au-dessus. Cependant, il ne liera pas dynamiquement les champs de tableau aux indements associatifs dans le tableau, c'est-à-dire que vous devez spécifier cet identifiant lié à $ arr ['id'], etc.

Si la liaison dynamique aux indeces associatifs est vraiment requis par votre scénario, vous pouvez toujours écrire une classe simple qui va d'abord analyser la requête pour les champs sélectionnés, puis configurer l'assoc array indeces, puis effectuer la requête.

+0

intéressant, mais n'autorise pas (AIUI) $ results [] = $ arr, ce qui est un modèle commun pour obtenir un tableau bidimensionnel de résultats, car il utilise le même $ arr à chaque fois autour de la boucle. Je pense que vous devriez prendre une copie profonde de $ arr avant de l'ajouter à $ results [] – Alnitak

+0

Assez facile à tester, et vous avez raison! Si vous souhaitez créer un tableau multidimensionnel, vous devrez effectuer une copie complète du tableau lié. Dans la boucle while, vous pouvez faire quelque chose comme $ multi [] ['id'] = $ arr ['id']; (pour chaque index associé en $ arr). Cela vous donnera ce dont vous avez besoin. –

Questions connexes