PHP: цикл while не работает после настройки SELECT для предотвращения инъекций SQL

Я пытаюсь настроить PHP-запросы для MySQL таким образом, чтобы предотвратить внедрение SQL (стандартный веб-сайт).

У меня было несколько запросов INSERT, в которых изменение было сработало хорошо, но в следующем SELECT я продолжаю получать ошибку с момента обновления, и похоже, что цикл while не работает с изменениями, которые я сделал (он работает хорошо, не используя инструкцию как в старом коде).

Может ли кто-нибудь сказать мне, что я делаю неправильно здесь?

Новый PHP:

$stmt = $conn->prepare("SELECT ? FROM TranslationsMain WHERE location LIKE '%calendar weekday%' ORDER BY sortOrder, ?"); $stmt->bind_param('s', $selectedLang); $stmt->execute(); $result = $stmt->get_result(); while($arrCalWeekdays = $result->fetch_assoc()){ $calWeekdays[] = $arrCalWeekdays; } $conn->close(); 

Старый PHP (измененная часть):

 $sql = "SELECT " . $selectedLang . " FROM TranslationsMain WHERE location LIKE '%calendar weekday%' ORDER BY sortOrder, " . $selectedLang; $result = $conn->query($sql); while($arrCalWeekdays = $result->fetch_assoc()){ $calWeekdays[] = $arrCalWeekdays; } $conn->close(); 

Сообщение об ошибке:

Неустранимая ошибка: вызов функции-члена fetch_assoc () для не-объекта в /homepages/21/d580042014/htdocs/myform.php в строке 21

Спасибо заранее.

Вы не можете связывать имена столбцов и таблиц, а только данные. Вам нужно указать таблицу, а затем привязать ее к '%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` 

Вы можете разместить всю эту информацию в массивах, а затем проверить, чтобы имена таблиц и столбцов, используемые в запросе, находились в массивах. Необходимо выполнить дополнительное рассмотрение имен таблиц и столбцов, убедившись, что для этих имен не используются ключевые / зарезервированные слова.

Наконец, используйте обратные ссылки вокруг утвержденных имен таблиц и столбцов при вызове значений для динамических запросов. Это будет охватывать любые возможные изменения в списке ключевых / зарезервированных слов и обеспечивает дополнительный уровень защиты.