Usando sprintf y LIKE en consultas SQL en WordPress
Cuando se trabaja con consultas en WordPress, siempre es mejor preparar la consulta antes de ejecutarla; sin embargo, si está interactuando con una API de terceros o trabajando con otra variante de SQL (como Transact-SQL), entonces las cosas pueden funcionar de manera un poco diferente.
Ojalá las bases de datos fueran realmente así de ordenadas.
El TL; DR de todo esto es que el manejo de sprintf y LIKE en T-SQL necesita un manejo estratégico. Y el ejemplo de código en la siguiente sección debería proporcionarle todo lo que necesita.
sprintf y LIKE en SQL
Algunos antecedentes sobre el problema en cuestión:
Digamos que está trabajando en un proyecto en el que está realizando llamadas a una API de terceros y dicha API usa T-SQL para interactuar con su base de datos.
Además, supongamos que desea recuperar registros que tienen un segmento de la cadena que se va a consultar (ya sabe, una cláusula LIKE ). La advertencia es que no puede usar la función de preparación estándar proporcionada por WordPress, por lo que opta por usar sprintf para ayudar a desinfectar la información entrante.
Dado que sprintf usa %spara cadenas y que está usando una cláusula LIKE que también requiere %, ¿cómo se maneja el caso de usar ambos?
Aquí hay un ejemplo de cómo puede funcionar para usted:
<?php
/**
* Queries a third-party API using sprintf and a LIKE clause to retrieve the users
* with a last name like the specified argument.
*
* @param string $lastName An unsanitized version of the user's last name.
*/
public function getUserByLastName(string $lastName)
{
// Sanitize the argument as you see fit here.
$query = sprintf("
SELECT FIRST_NAME, LAST_NAME
FROM USERINFO
WHERE LAST_NAME LIKE '%%%s%%'
", $lastName);
// Make a query to the third-party API here.
}
Por supuesto, sigo pensando en usar algún tipo de escape en el $nameargumento, pero hay varias formas diferentes de hacerlo y está más allá del objetivo de esta publicación.
En resumen, agregue el prefijo y el sufijo %scon %%y debería estar listo para comenzar.