Du kan ikke binde kolonne- og tabelnavne, kun data. Du skal angive tabellen og derefter binde for din '%calendar weekday%'
.
$stmt = $conn->prepare("SELECT " . $selectLang . " FROM `TranslationsMain` WHERE `location` LIKE ? ORDER BY `sortOrder`, " . $selectedLang);
$stmt->bind_param('s', $calendar_weekday);
Hvis du vil bruge dynamiske tabel-/kolonnenavne, skal du udføre den minimale hvidliste af disse elementer. Du kan bygge en dynamisk hvidliste ved at spørge databasen, hvilke kolonner der er gyldige for en given databasetabel. For eksempel:
SELECT `COLUMN_NAME`
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA` = `database_name`
AND `TABLE_NAME` = `table_name`
Du kan placere alle disse oplysninger i arrays og derefter kontrollere, at tabel-/kolonnenavnene, der bruges i forespørgslen, er i arrays. Der bør tages ekstra hensyn til tabel- og kolonnenavne, og det skal sikres, at der ikke bruges nøgleord/reserverede ord til disse navne.
Til sidst skal du bruge backticks omkring de validerede tabel-/kolonnenavne, når du kalder værdierne for de dynamiske forespørgsler. Dette vil dække eventuelle potentielle ændringer til listen over nøgleord/reserverede ord og giver et ekstra lag af beskyttelse.