Non puoi associare nomi di colonne e tabelle, solo dati. Devi specificare la tabella e quindi eseguire il binding per il tuo '%calendar weekday%'
.
$stmt = $conn->prepare("SELECT " . $selectLang . " FROM `TranslationsMain` WHERE `location` LIKE ? ORDER BY `sortOrder`, " . $selectedLang);
$stmt->bind_param('s', $calendar_weekday);
Se si desidera utilizzare nomi dinamici di tabelle/colonne, è necessario eseguire la whitelist minima di tali elementi. È possibile creare una white list dinamica chiedendo al database quali colonne sono valide per una determinata tabella del database. Ad esempio:
SELECT `COLUMN_NAME`
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA` = `database_name`
AND `TABLE_NAME` = `table_name`
È possibile inserire tutte queste informazioni negli array e quindi verificare che i nomi di tabella/colonna utilizzati nella query siano negli array. È necessario prestare maggiore attenzione ai nomi di tabelle e colonne, assicurandosi che non vengano utilizzate parole chiave/riservate per questi nomi.
Infine, usa i backtick attorno ai nomi di tabella/colonna convalidati quando chiami i valori per le query dinamiche. Ciò coprirà eventuali modifiche all'elenco delle parole chiave/riservate e fornirà un ulteriore livello di protezione.