2011-01-08 4 views
7

Я нашел это в некоторых примерах кода, а прибегая к помощи:Что это значит?

$sql = 'INSERT INTO users (username,passwordHash) VALUES (?,?)'; 

это ново для меня, но я бы предположил, что это метод замещения и эквивалентно

$sql = "INSERT INTO users (username,passwordHash) VALUES ($username,$passwordHash)";` 

или

$sql = 'INSERT INTO users (username,passwordHash) VALUES (' . $username . ',' . $passwordHash . ')';` 

было бы правильно? Является ли это фактическим синтаксисом PHP, или он просто пытался упростить свой пример?


Спасибо за обратную связь, люди

ответ

12

Это довольно распространено в prepared statements. ? просто служит в качестве заполнителя, как показано ниже в документации PHP:

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)"); 
$stmt->bindParam(1, $name); 
$stmt->bindParam(2, $value); 

// insert one row 
$name = 'one'; 
$value = 1; 
$stmt->execute(); 

// insert another row with different values 
$name = 'two'; 
$value = 2; 
$stmt->execute(); 
+6

Также редко возникает необходимость в списке '-> bindParam'. Можно просто нажать все параметры с помощью '-> execute (array ($ name, $ value))' call. – mario

2

это не то же самое. вопросительные знаки используются для подготовленных запросов оператора. они в основном позволяют вам запускать один и тот же запрос несколько раз, в то время как только система анализирует запрос один раз.

4

Знаки вопросов являются заполнителями для значений в подготовленных операциях SQL - и являются важной защитой от SQL Injection Attacks. Ваша первая альтернатива не будет работать должным образом, если каждый пользователь не добавит их имя в кавычки * и вы добавите хэш пароля в кавычки. Вторая альтернатива уязвима для SQL-инъекций.

С помощью заполнителей вы передаете значения для заполнителей при выполнении SQL.

* И Тим О'Рейли знает, что он действительно должен набрать «'Tim O''Reilly'».