Devo usar o wpdb prepare?

28

Eu sou novo no SQL e estou querendo saber se preciso usar wpdb->preparea seguinte consulta em uma tabela que criei

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

Preciso usar prepareaqui? Como eu faria isso?

Felicidades

Richard Sweeney
fonte

Respostas:

33

É sempre recomendável usar sempre, preparemas o principal uso é evitar ataques de injeção de SQL e, como não há entrada de usuários / visitantes ou eles não podem efetuar a consulta, isso não é um problema no seu exemplo atual.

Mas, como eu disse antes, é uma prática recomendada usá-lo e, uma vez que você começa a usá-lo, nunca para; portanto, no seu exemplo, você pode usá-lo da seguinte maneira:

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

para ler mais sobre como usá-lo, vá para o codex

Bainternet
fonte
Oi @Bainternet, obrigado por uma explicação tão clara - por algum motivo, quando tento seu código, ele retorna uma matriz vazia. Eu verifiquei e dobrei para erros de digitação. Se eu fizer a consulta despreparada, recebo a matriz. Eu não entendo por que não está funcionando ..!
Richard Sweeney
Ímpar. Eu tentei usar o mesmo código com outra consulta: $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 funciona muito bem! Não sei por que isso seria. Mas eu entendo agora em qualquer caso!
Richard Sweeney
6
Colocar o nome da tabela entre aspas simples não funcionará. O escape normal é com acentos graves, por isso sua consulta deve acabar com essa aparência: SELECT * FROM `wp_my_custom_table`. Você pode ativar o suporte de aspas duplas, mas então ele teria que ficar assim: SELECT * FROM "wp_my_custom_table".
Jan Fabry
3
Eu não concordo com esta resposta. Por que você deve escapar quando a função já escapa de tudo? Você acha que o Wordpress decidirá remover os escapes do núcleo? Além disso, não há motivo para escapar do nome da tabela :) porque é codificado e você sabe que está ok. Eu sei que este é apenas um exemplo, mas de qualquer maneira não escapa nomes de tabelas, eu tenho problemas ao usar o preparar com nomes de tabelas que adiciona backticks e erro de trows SQL.
Tommixoft #
@ Tommixoft Se você ler a resposta novamente, verá que realmente diz a mesma coisa que eu disse e que o nome da tabela é um exemplo.
Bainternet
0

Quando você usa o prepare, ele protege o código contra vulnerabilidades de injeção do SQL.

Aqui está o código que você precisa modificar para usar 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 );
softnwords
fonte
0

No seu caso, não é possível ataque de injeção SQL . Seu código não precisa de proteção adicional, porque não use a entrada do usuário como: post, get, request, cookie.

Não use funções complicadas quando não forem necessárias para economizar recursos do servidor.

SaschArt
fonte