Domanda

Negli ultimi giorni ho visto un paio di domande che hanno usato mysqli ma dove le risposte sembrano non aver riconosciuto la differenza tra $ stmt- > execute () e $ db- > query () .

A quanto ho capito, ci sono due diversi modelli per accedere ai risultati in mysqli .

Questo utilizza SQL non elaborato e richiede al programmatore di sfuggire all'input per impedire attacchi di iniezione SQL, ma consente al programmatore di recuperare un array associativo (o un array normale) contenente column = > valore :

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

In alternativa, puoi farlo, il che consente una buona associazione di parametri e risultati, ma non può (AFAIK) darti alcun tipo di risultato di matrice semplice:

$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
}

La mia domanda è: esiste un modo con mysqli per ottenere l'output di array semplice mostrato nel primo modello, ma usando comunque i parametri di input associati in modo sicuro come nel secondo modello?

Non riesco comunque a trovarlo (a parte usare PDO invece!).

È stato utile?

Soluzione

Esistono molteplici implementazioni di una funzione per fare questo genere di cose nei commenti su questa pagina del manuale php: mysqli_stmt :: fetch

Altri suggerimenti

Alnitak,

AFAIK, non è possibile associare automaticamente un intero array ai risultati recuperati. Sfortunatamente. Tuttavia, se stai cercando un comportamento dell'array (presumibilmente quindi è più facile passare i risultati), puoi provare questo:

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

Questo ti darà il comportamento che hai richiesto, sopra. Tuttavia, non assocerà dinamicamente i campi dell'array agli indici associativi dell'array, ovvero è necessario specificare che id sia associato a $ arr ['id'], ecc.

Se il tuo scenario richiede davvero l'associazione dinamica agli indici associativi, puoi sempre scrivere una classe semplice che prima analizzerebbe la query per i campi selezionati, quindi imposta gli indici dell'array assoc, quindi eseguirà la query.

Direi di no. Pensando di non aver lavorato con mysqli o di aver preparato dichiarazioni per un sacco, credo che ogni passaggio del tuo secondo esempio sia discreto e necessario. L'unica consolazione che posso darti è che il tuo primo esempio ha sorvolato alcuni escape SQL che puoi ignorare in modo sicuro e reale nel tuo secondo esempio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top