¿Debo usar wpdb prepare?

28

Soy nuevo en SQL y me pregunto si necesito usarlo wpdb->preparepara la siguiente consulta en una tabla que he creado

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

¿Necesito usar prepareaquí? ¿Como podría hacerlo?

Aclamaciones

Richard Sweeney
fuente

Respuestas:

33

Es una buena práctica usarlo siempre, preparepero el uso principal es prevenir ataques de inyección SQL, y dado que no hay entrada de los usuarios / visitantes o no pueden efectuar la consulta, ese no es un problema en su ejemplo actual.

Pero como dije antes, es una buena práctica usarlo y una vez que empiezas a usarlo nunca te detienes, así que en tu ejemplo puedes usarlo así:

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 leer más sobre cómo usarlo, diríjase al códice

Bainternet
fuente
Hola @Bainternet, gracias por una explicación tan clara: por alguna razón, cuando pruebo tu código, devuelve una matriz vacía. He revisado y duplicado revisado los errores tipográficos Si hago la consulta no preparada, obtengo la matriz. ¡No entiendo por qué no funciona ...!
Richard Sweeney
Impar. Intenté usar el mismo código con otra 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 ); y funciona muy bien! No estoy seguro de por qué sería eso. ¡Pero lo entiendo ahora en cualquier caso!
Richard Sweeney
66
Encerrar el nombre de la tabla entre comillas simples no funcionará. El escape es normal, con acentos abiertos, por lo que su consulta debe terminar pareciéndose a esto: SELECT * FROM `wp_my_custom_table`. Puede habilitar el soporte de doble cita, pero entonces tendría que tener este aspecto: SELECT * FROM "wp_my_custom_table".
Jan Fabry
3
No estoy de acuerdo con esta respuesta. ¿Por qué deberías escapar cuando la función ya escapa de todo? ¿Crees que Wordpress decidirá eliminar el escape del núcleo? TAMBIÉN no tiene sentido escapar del nombre de la tabla :) porque está codificado y sabes que está bien. Sé que esto es solo un ejemplo, pero de todos modos no escapo de los nombres de las tablas, tengo problemas al usar preparar con los nombres de las tablas, agrega backticks y error de trows SQL.
Tommixoft el
@Tommixoft Si vuelve a leer la respuesta, verá que realmente dice lo mismo que dije y que el nombre de la tabla es un ejemplo.
Bainternet
0

Cuando usa prepare, está protegiendo el código de las vulnerabilidades de inyección SQL.

Aquí está el código que necesita 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 );
palabras blandas
fuente
0

En su caso no es posible el ataque de inyección SQL . Su código no necesita protección adicional porque no use la entrada del usuario como: publicar, obtener, solicitar, cookie.

No utilice funciones complicadas cuando no sean necesarias para ahorrar recursos del servidor.

SaschArt
fuente