2015-08-20 4 views
0

Может кто-нибудь сказать мне, что я делаю неправильно? Когда я выполняю и получаю это, я становлюсь правильным результатом.Mysqli bind_param() не работает должным образом

$message = '100'; 
if($stmt = $mysqli->prepare("select english from table where message=? LIMIT 1")) { 
$stmt = bind_param("i", $message); 
} //Return the Message in English 

Но когда я помещаю язык в переменную и использую bind_param(). Я просто получить новую переменную в результате назад напр .:

$message = '100'; 
$language = 'english'; 
if($stmt = $mysqli->prepare("select ? from table where message=? LIMIT 1")) { 
$stmt = bind_param("si", $language, $message); 
} //Returns "english" 

Я думаю, проблема в том, что «$ язык» переплетены как «String». Какой будет правильный тип? Попробовал allready изменить его на blob или double без результата.

ответ

1

Посмотрим, что делает 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); 
} 
+0

Вау благодарит вас за быстрый и подробный ответ. Это очень помогло – Dennis

Смежные вопросы