$sql='SELECT phrase,english FROM static_site_language WHERE page=?;'; $pds=$database->pdo->prepare($sql); $pds->execute(array($_POST['languagepage']));
Вышеприведенный код работает нормально. Однако мне нужно добавить другую переменную в инструкцию подготовки. Я пробовал следующее, но он не работает:
$sql='SELECT phrase,? FROM static_site_language WHERE page=?;'; $pds=$database->pdo->prepare($sql); $pds->execute(array($_POST['language'],$_POST['languagepage']));
Я знаю, что $ _POST ['language'] (от его печати) содержит только слово «английский». Можно ли поставить переменную подготовки в эту часть выбора?
спасибо
Параметры запроса могут заменяться только постоянным значением, а не именем столбца.
Все столбцы и таблицы должны быть указаны в момент подготовки запроса, вы не можете отложить выбор столбцов для последующего шага выполнения.
Когда вы хотите, чтобы пользовательский ввод определял имя столбца, используйте карту белых списков, чтобы ограничить ввод пользователем действительными выборами. Ключами массива карт являются пользовательские входные данные. Значения массива карт – это строки, которые вы хотите использовать в SQL-запросе, в этом случае имена столбцов.
$lang_col_map = array( "DEFAULT" => "english", "en" => "english", "es" => "spanish" ); $lang_col = $lang_col_map[ $_POST["language"] ] ?: $lang_col_map[ "DEFAULT" ]; $sql='SELECT phrase,$lang_col FROM static_site_language WHERE page=?;'; $pds=$database->pdo->prepare($sql); $pds->execute(array($_POST['languagepage']));
Таким образом, вы можете быть уверены, что только значения в файле $ lang_col_map могут стать частью SQL-запроса, и если пользователь пытается отправить что-либо сложное в HTTP-запросе, он игнорируется, потому что он не соответствует ни одному ключу этой карты. Таким образом, запрос безопасен от SQL-инъекции.
Для получения дополнительной информации см. Мою презентацию « Мифы о выбросах SQL» и «Ошибки» .
Подготовленный оператор поддерживает только параметры, которые являются значениями, поддерживаемыми базой данных.
В своем втором заявлении первый «?» является заполнитель для имени столбца, а не значения.
Вместо этого вы должны использовать динамический оператор SQL. Для этого вам необходимо предотвратить внедрение SQL.
$language_authorized = array('english', 'french', 'spanish'); $language = $_POST['language']; if (in_array($language_authorized, $language)) { $sql='SELECT phrase,'.$language.' FROM static_site_language WHERE page=?;'; $pds = $database->pdo->prepare($sql); $pds->execute(array($_POST['languagepage'])); }