列名とテーブル名はバインドできません。データのみをバインドできます。テーブルを指定してから、'%calendar weekday%'
にバインドする必要があります 。
$stmt = $conn->prepare("SELECT " . $selectLang . " FROM `TranslationsMain` WHERE `location` LIKE ? ORDER BY `sortOrder`, " . $selectedLang);
$stmt->bind_param('s', $calendar_weekday);
動的なテーブル/列名を使用する場合は、それらのアイテムの最小限のホワイトリストを実行する必要があります。特定のデータベーステーブルに有効な列をデータベースに問い合わせることで、動的ホワイトリストを作成できます。例:
SELECT `COLUMN_NAME`
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA` = `database_name`
AND `TABLE_NAME` = `table_name`
このすべての情報を配列に配置してから、クエリで使用されるテーブル/列の名前が配列に含まれていることを確認できます。テーブル名と列名については特に考慮し、これらの名前にキー/予約語が使用されていないことを確認する必要があります。
最後に、動的クエリの値を呼び出すときは、検証済みのテーブル/列名の前後にバッククォートを使用します。これにより、キー/予約語リストへの潜在的な変更がすべてカバーされ、保護の追加レイヤーが提供されます。