Mescolando le funzioni di accesso ai dati mysqli di PHP?
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!).
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.