Utilizzo di sprintf e LIKE nelle query SQL in WordPress
Quando si lavora con le query in WordPress, è sempre meglio preparare la query prima di eseguirla; tuttavia, se ti capita di interfacciarti con un’API di terze parti o di lavorare con un’altra variante di SQL (come Transact-SQL), le cose potrebbero funzionare in modo leggermente diverso.
Se solo i database fossero davvero così ordinati.
Il TL; DR di tutto questo è che la gestione di sprintf e LIKE in T-SQL richiede una gestione strategica. E l’esempio di codice nella sezione successiva dovrebbe fornire tutto ciò di cui hai bisogno.
sprintf e LIKE in SQL
Alcuni retroscena sul problema in questione:
Supponiamo che tu stia lavorando a un progetto in cui stai effettuando chiamate a un’API di terze parti e la suddetta API utilizza T-SQL per interfacciarsi con il suo database.
Inoltre, supponiamo che tu voglia recuperare record che hanno un segmento della stringa da interrogare (sai, una clausola LIKE ,). L’avvertenza è che non puoi utilizzare la funzione di preparazione standard fornita da WordPress, quindi scegli di utilizzare sprintf per aiutare a disinfettare le informazioni in arrivo.
Poiché sprintf utilizza %sper le stringhe e poiché stai utilizzando una clausola LIKE% che richiede anche, come si gestisce il caso di utilizzo di entrambi?
Ecco un esempio di come potrebbe funzionare per te:
<?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.
}
Ovviamente, penso ancora di usare un qualche tipo di evasione $namesull’argomento, ma ci sono diversi modi per farlo ed è oltre lo scopo di questo post.
In breve, prefisso e suffisso %scon %%e dovresti essere a posto.