这是什么意思?(关于IT技术的问题)

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语法,还是他只是试图简化示例?


感谢大家的反馈。

3个回答

12

预处理语句中,这是非常常见的。如下所示,?仅充当占位符:

$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))将所有参数一起传递。注意不要改变原意。 - mario

4
问号是准备SQL语句中数值的占位符,它们对抗SQL注入攻击至关重要。如果每个用户都将自己的姓名用引号括起来且您用引号括起密码散列值,则第一个替代方案将无法正常工作。第二个替代方案容易遭受SQL注入攻击。使用占位符可以在执行SQL时传递占位符的值。请注意,Tim O'Reilly 确实需要输入 "'Tim O''Reilly'"。

2

这是不同的。问号在预编译语句查询中使用。这些基本上允许您多次运行相同的查询,而只需要系统解析一次查询。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接