Посмотрим, что делает bind_param
.
$stmt = $mysqli->prepare("select * from users where name=?");
$stmt->bind_param("s", "Dennis");
примерно эквивалентен
$stmt = $mysqli->prepare("select * from users where name='Dennis'");
Однако использование bind_param гораздо безопаснее, чем вставить значение вручную в SQL-запрос. Потому что, когда вы добавляете значение руками, вам нужно тщательно обрабатывать специальные символы; иначе злонамеренное значение может заставить SQL-парсер рассматривать части значения не как значение, а как команды, имена таблиц, имена столбцов и т. д. bind_param делает это за вас; с bind_param вы не ханэ беспокоиться о том, что Dennis
должен быть превращен в 'Dennis'
перед вставкой в SQL-запрос, но Dennis O'Brian
должен превратиться в 'Dennis O\'Brian'
(не 'Dennis O'Brian'
), и NUL-character должен превратиться в '\0'
(не остаются NUL-символ).
bind_param подходит только для вставки значений в SQL-запрос. Потому что, когда вам нужно вставить столбец или имя таблицы в SQL-запрос, вам действительно нужно обратное - вам нужно имя столбца, которое нужно вставить непосредственно в SQL-запрос (без добавления кавычек и т. Д.). Так что вы на самом деле нужно:
select english from table where message=... LIMIT 1
не
select 'english' from table where message=... LIMIT 1
Так, просто сделать это:
$message = '100';
$language = 'english';
$sql = "select " . $language . " from table where message=? LIMIT 1";
if($stmt = $mysqli->prepare($sql)) {
$stmt->bind_param("i", $message);
}
Единственное, что вы должны быть уверены, чем $language
содержит имя действительный столбец , В противном случае, если пользователь заставил что-то плохое пройти через $language
, вы получите SQL-injection.
$message = ...;
$language = ...;
...;
if(!in_array($language, array('english', 'german', 'french'), true))
$language = 'english';
$sql = "select " . $language . " from table where message=? LIMIT 1";
if($stmt = $mysqli->prepare($sql)) {
$stmt->bind_param("i", $message);
}
Вау благодарит вас за быстрый и подробный ответ. Это очень помогло – Dennis