Du kan inte binda kolumn- och tabellnamn, bara data. Du måste ange tabellen och sedan binda för din '%calendar weekday%'
.
$stmt = $conn->prepare("SELECT " . $selectLang . " FROM `TranslationsMain` WHERE `location` LIKE ? ORDER BY `sortOrder`, " . $selectedLang);
$stmt->bind_param('s', $calendar_weekday);
Om du vill använda dynamiska tabell-/kolumnnamn bör du utföra en minimal vitlista av dessa objekt. Du kan bygga en dynamisk vit lista genom att fråga databasen vilka kolumner som är giltiga för en given databastabell. Till exempel:
SELECT `COLUMN_NAME`
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA` = `database_name`
AND `TABLE_NAME` = `table_name`
Du kan placera all denna information i arrayer och sedan kontrollera att tabell-/kolumnnamnen som används i frågan finns i arrayerna. Extra hänsyn till tabell- och kolumnnamn bör tas, och se till att inga nyckelord/reserverade ord används för dessa namn.
Slutligen, använd backticks runt de validerade tabell-/kolumnnamnen när du anropar värdena för de dynamiska frågorna. Detta kommer att täcka eventuella ändringar i nyckel-/reserverade ordlistan och ger ett extra skyddslager.