Dovrei usare wpdb prepar?


28

Sono nuovo di SQL e mi chiedo se devo usare wpdb->preparela seguente query per una tabella che ho creato

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = "SELECT * FROM " . $tablename . " ORDER BY date_created DESC";
$resulst = $wpdb->get_results( $sql , ARRAY_A );

Devo usare preparequi? Come potrei farlo?

Saluti

Risposte:


33

È consigliabile utilizzare sempre, preparema l'uso principale è quello di prevenire attacchi di iniezione SQL e poiché non vi sono input da parte di utenti / visitatori o non possono effettuare la query, questo non è un problema nell'esempio corrente.

Ma come ho detto prima è meglio usarlo e una volta che inizi a usarlo non ti fermi mai, quindi nel tuo esempio puoi usarlo in questo modo:

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = $wpdb->prepare( "SELECT * FROM %s ORDER BY date_created DESC",$tablename );
$results = $wpdb->get_results( $sql , ARRAY_A );

per saperne di più su come usarlo, vai al codice


Ciao @Bainternet, grazie per una spiegazione così chiara - per qualche motivo quando provo il tuo codice restituisce un array vuoto. Ho controllato e raddoppiato verificato per errori di battitura. Se eseguo la query non preparata ottengo l'array. Non capisco perché non funziona ..!
Richard Sweeney,

Dispari. Ho provato a utilizzare lo stesso codice con un'altra query: $tablename = $wpdb->prefix . "my_custom_table"; $concert_id = 1; $sql = "SELECT * FROM " . $tablename . " WHERE concert_id = %d LIMIT 1;"; $prep_sql = $wpdb->prepare( $sql, $concert_id ); $get_concerts = $wpdb->get_results( $prep_sql , ARRAY_A ); e funziona benissimo! Non sono sicuro del perché. Ma ora capisco adesso!
Richard Sweeney,

6
Racchiudere il nome della tabella tra virgolette singole non funzionerà. La fuga è normale con apici inversi, così il vostro query dovrebbe finire per assomigliare a questo: SELECT * FROM `wp_my_custom_table`. È possibile abilitare il supporto virgolette, ma poi avrebbe dovuto assomigliare a questo: SELECT * FROM "wp_my_custom_table".
Jan Fabry,

3
Non sono d'accordo con questa risposta. Perché dovresti scappare quando la funzione sfugge già a tutto? Pensi che Wordpress deciderà di rimuovere la fuga dal core? Inoltre non ha senso scappare dal nome della tabella :) perché è codificato e sai che va bene. Questo è solo un esempio, ma in ogni caso non sfuggire ai nomi delle tabelle, ho dei problemi quando si usa Prepara con i nomi delle tabelle, aggiunge backtick e SQL trows error.
Tommixoft,

@Tommixoft Se rileggi la risposta, vedrai che in realtà dici la stessa cosa che ho detto e che il nome della tabella è un esempio.
Bainternet,

0

Quando usi prepari protegge il codice dalle vulnerabilità dell'iniezione SQL.

Ecco il codice che devi modificare per l'utilizzo prepare();

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = $wpdb->prepare( "SELECT * FROM {$tablename} ORDER BY date_created DESC");
$resulst = $wpdb->get_results( $sql , ARRAY_A );

0

Nel tuo caso non è possibile un attacco di iniezione SQL . Il tuo codice non necessita di protezione aggiuntiva perché non utilizza l'input dell'utente come: post, get, request, cookie.

Non utilizzare funzioni complicate quando non sono necessarie per salvare le risorse del server.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.