这是什么意思?

时间:2011-01-08 06:39:29

标签: php prepared-statement

我在google搜索时在一些代码示例中找到了这个:

$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语法,还是他只是想简化他的例子?


感谢您的反馈,伙计们

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分:4)

问号是准备好的SQL语句中值的占位符 - 并且是对SQL Injection Attacks的重要保护。除非每个用户在引号 * 中包含其名称并将密码哈希括在引号中,否则您的第一个替代方法将无法正常工作。您的第二种替代方案容易受到SQL注入攻击。

使用占位符,可以在执行SQL时传递占位符的值。

* Tim O'Reilly知道他必须输入“'Tim O''Reilly'”。

答案 2 :(得分:2)

它不一样。问号用于准备好的语句查询。这些基本上允许您多次运行相同的查询,同时只让系统解析查询一次。