PDO准备语句,使用正确吗?

16 浏览
0 Comments

PDO准备语句,使用正确吗?

我只是想确保我已经正确使用了PDO准备语句,以下代码是否能防止SQL注入攻击?\n

$data['username'] = $username;
$data['password'] = $password;
$data['salt'] = $this->generate_salt();
$data['email'] = $email;
$sth = $this->db->prepare("INSERT INTO `user` (username, password, salt, email, created) VALUES (:username, :password, :salt, :email, NOW())");  
$sth->execute($data);

\n请问上述代码是否能防止SQL注入攻击?

0
0 Comments

问题:(PDO prepared statement, correctly used?)这个问题的出现的原因以及解决方法。

问题的原因:问题的原因是在代码中使用了PDO预处理语句,但在绑定变量时没有正确处理时间戳(NOW()函数)。

解决方法:为了正确处理时间戳,可以使用PHP的date()函数来获取当前时间,并将其作为一个绑定变量。可以按照以下步骤进行修改:

1. 在$data数组中添加一个键为'created'的元素,值为date("Y-m-d H:i:s"),以获取当前时间戳。

2. 在准备语句中使用绑定变量:created来替代NOW()函数。

具体修改代码如下:

// start with an empty array for data
$data = array();
// bind date
$data['created'] = date("Y-m-d H:i:s");
// updated prepare statement
$sth = $this->db->prepare("INSERT INTO `user` (username, password, salt, email, created) VALUES (:username, :password, :salt, :email, :created)");

以上就是关于问题(PDO prepared statement, correctly used?)的原因和解决方法的整理。通过使用正确的绑定变量,我们可以解决时间戳处理的问题,并确保代码的正确性。

0
0 Comments

PDO prepared statement, correctly used?

在上述代码中,PDO预处理语句被正确使用。然而,代码可以进一步简化。这段代码的目的是将用户信息插入到数据库中。下面是问题的出现原因和解决方法:

问题出现的原因:

- 代码冗长:代码中使用了多行来执行预处理语句,可以通过链式调用来简化代码。

- 命名变量:代码中使用了命名变量,可能会增加代码的复杂性。

解决方法:

- 简化代码:可以通过链式调用来简化代码,如在预处理语句中直接调用`execute`方法。

- 不使用命名变量:如果不需要调试或多次使用命名参数,可以不使用命名变量。

下面是更新后的代码示例:

$data = array($username, $password, $this->generate_salt(), $email);
$this->db->prepare("
    INSERT INTO `user` (username, password, salt, email, created)
    VALUES (?, ?, ?, ?, NOW())
")->execute($data);
// 或者更简短的写法
$sth = $this->db->prepare("
    INSERT INTO user (username, password, salt, email, created)
    VALUES (?, ?, ?, ?, NOW())
")->execute($data);
// 如果不使用命名变量
$this->db->prepare("
    INSERT INTO user (username, password, salt, email, created)
    VALUES (?, ?, ?, ?, NOW())
")->execute(array($username, $password, $this->generate_salt(), $email));

通过这些改进,代码更简洁、易读,并且仍然保持了安全性。

0