php - SQL 到 PDO 用于将表内容传输到另一个表

标签 php mysql sql pdo

我正在尝试将用sql编写的电子邮件确认函数更改为PDO。这是供您进一步引用的教程:http://www.phpeasystep.com/phptu/24.html .

在用户点击发送到其电子邮件的验证链接后,此特定部分会将用户的信息从临时表移至永久表。

我遇到的问题是在该教程的这个标题下:STEP4:confirmation.php

我的代码与此类似,但我添加了一些准备好的语句,因为我试图防止 SQL 注入(inject)。

需要明确的是:我正在寻找有关我还需要做什么才能将其从 sql 切换到 PDO 并防止任何 sql 注入(inject)的指导。因为我是一个视觉学习者,所以提供答案时的例子至关重要。谢谢。

这是我的代码:

<?php

include('config.php');

//Test DB connection
try {
    $conn = new PDO("mysql:host=$Host;db=$svrDb", Username, $Password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} 
catch(PDOException $e) {
    echo 'ERROR: ', $e->getMessage(), "\n";
}

// Passkey that got from link
$passkey=$_GET['passkey'];

$sql1= $conn->prepare("SELECT * FROM temp_members_db WHERE confirm_code ='$passkey'");
$sql_conf1->execute() or die ('Error updating database: '.mysql_error());
$result1=$sql1->fetchall();

// If successfully queried
if($result1){

// Count how many row has this passkey
$count=mysql_num_rows($result1);

// if found this passkey in our database, retrieve data from table "temp_members_db"
if($count==1){

$name=$rows['name'];
$email=$rows['email'];
$password=$rows['password'];
$country=$rows['country'];

// Insert data that retrieves from "temp_members_db" into table "registered_members"
$sql2="INSERT INTO registered_members(name, email, password, country)VALUES('$name', '$email', '$password', '$country')";
$result2=mysql_query($sql2);
}

// if not found passkey, display message "Wrong Confirmation code"
else {
echo "Wrong Confirmation code";
}

// if successfully moved data from table"temp_members_db" to table "registered_members" displays message "Your account has been activated" and don't forget to delete confirmation code from table "temp_members_db"
if($result2){

echo "Your account has been activated";

// Delete information of this user from table "temp_members_db" that has this passkey
$sql3="DELETE FROM temp_members_db WHERE confirm_code = '$passkey'";
$result3=mysql_query($sql3);

}

}
?>

最佳答案

好吧,所以你的方向是正确的,但并不完全......

使用预准备语句的全部原因是数据库知道什么可以解释为 SQL,什么不可以解释为 SQL。现在,您拥有以下内容:

$sql1= $conn->prepare("SELECT * FROM temp_members_db WHERE confirm_code ='$passkey'");
$sql_conf1->execute() or die ('Error updating database: '.mysql_error());
$result1=$sql1->fetchall();

要充分利用 PDO 和准备好的语句,您应该将其更改为如下所示:

$sql1= $conn->prepare("SELECT * FROM temp_members_db WHERE confirm_code = ?");
try{
     $sql1->execute(array($passkey));
}catch(PDOException $e){
     print "Error!: " . $e->getMessage() . "<br/>";
     die();
}
$result1=$sql1->fetchall();

这有几个原因。在您的代码中,您将变量 $passkey 与准备语句一起发送,因此实质上准备操作是无用的,因为 $passkey 尚未被清理。请注意,在我的代码中,我将其替换为 ?。这告诉数据库:

“嘿,我将执行一条 SELECT 语句,并将 ? 替换为我的变量之一的值,所以不要解释它作为 SQL!”

这里有一个很棒的 PDO 资源:

http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers

关于php - SQL 到 PDO 用于将表内容传输到另一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25297001/

相关文章:

php - 为包含的内容网站进行 Bootstrap 导航栏调整

php - iPhone-在 POST 中将 JSON 对象发送到 PHP 服务器并从服务器获取响应

PHP 连接到 mySQL - 访问被拒绝

MySQL 使用 * 以及连接表中的列名

php - 表单不会传递隐藏值

mysql - 插入时出错 - 错误代码 1241。操作数应包含 1 列

php - 如何在mysql中插入和更新 View 计数?

mysql - 查找具有最少关联记录的记录

php - 计算特定用户的两个表的总和

python - Django - (1366,“错误的字符串值 :. ..错误