2012-09-17 102 views
1

我经历了将mysql_ *代码转换为PDO代码的过程。我已经跑了,并检查它的工作原理和一切。我只是想要stackoverflow的审查,以确保我正确地杀死连接,我应该使用其他方法(例如交易),确保没有大规模的安全漏洞。这里的代码:PHP PDO访问mysql

<?php 
try { 
    $link = new PDO('mysql:****;dbname=****;charset=UTF-8','****','****'); 
    $link->exec("INSERT INTO Registration (`First Name`, `Last Name`) VALUES ('$_POST[fname]', '$_POST[lname]')"); 
} catch(PDOException $e) { 
    print "Error!: " . $e->getMessage() . "<br/>"; 
    die(); 
} 
?> 

就像我说的,它的工作原理,但我希望它是安全和有效的,当100人同时注册。一切看起来好吗?

+0

您应该使用绑定参数来生成SQL - 如果你只是在用户提供的输入增加,没有安全收益在所有使用PDO。 – andrewsi

+0

您可以使用我的简单单文件[PDO库](https://github.com/Xeoncross/DByte),因此您不必担心SQL注入或在页面周围传递全局'$ link'变量。现在,由于您直接将变量插入查询字符串中,因此您并不安全。 – Xeoncross

+0

请勿直接在查询中使用来自用户的未经过清理的数据。另外,当你使用一个数组变量时,在键上放置单引号或双引号。 – AdamGold

回答

5

不,您正在将mysql_转换为PDO 1:1。这样,mysql_中的问题也将成为PDO中的一个问题。

您应该查看准备好的查询和参数绑定。

这里是什么,我的意思是一个例子:

$dbh = new PDO('mysql:****;dbname=****;charset=UTF-8','****','****'); 

$first = 'John'; 
$last = 'Doe'; 

$stmt = $dbh->prepare(
    "INSERT INTO Registration (firstname, lastname) VALUES (:first, :last)"); 
$stmt->bindParam(':first', $first); 
$stmt->bindParam(':last', $last); 

$stmt->execute(); 

// insert another row with different values 
$first = 'John'; 
$last = 'Smith'; 
$stmt->execute(); 
+1

我可以把它变成for-loop吗?因为假设我有21个人想插入,那么我是否可以遍历$ _POST来添加每个人? – Richard

+1

是的,你可以。您创建dbh并准备一次查询。然后循环,并在每个循环中更改参数并执行。不需要做mysql_escape_stuff! – JvdBerg

+0

好吧会做。所以我不确定bindParam函数的作用。我尝试阅读它的文档,但我不完全理解它的目的。我知道变量$ first正被绑定到一个sql语句......但是这对我做了什么O.o – Richard