0

所以我必须将所有mysql_命令更改为 PDO,因为它们已正式贬值,而 PDO 是最通用的。为什么 INSERT 如此复杂,这样做有什么好处?

例如,在我的旧代码中,我这样做:

mysql_connect("$host", "$username", "$db_password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB");
mysql_query("INSERT INTO $tbl_name(this, that, him, her) VALUES('$this', '$that', '$him', '$her')")or die(mysql_error()); 

和 PDO

$conn = new PDO('mysql:host=HST_NAME;dbname=DB_NAME;charset=utf8', 'USER', 'PASSWORD');
$sql = "INSERT INTO books (this, that, him, her) VALUES (:this,:that,:him,:her)";
$q = $conn->prepare($sql);
$q->execute(array(':this'=>$this,
                  ':that'=>$that,
                  ':him'=>$him,
                  ':her'=>$her ));

当我必须一次输入大量数据时,PDO 会变得很大。这有什么好处?

寻找为什么做的答案而不是做什么

4

2 回答 2

3

因为您的 mysql_query格式不正确
如果您关心正确格式化它,它将使用与 PDO 相同数量的代码

此外,由于某种原因,您选择“长” PDO 语法。虽然代码可能是

$sql = "INSERT INTO books (this, that, him, her) VALUES (?,?,?,?)";
$q = $conn->prepare($sql);
$q->execute(array($this,$that,$him,$her));

不过,对于其中任何一个,您都可以使用某种自动化

要回答已编辑的问题,为什么要使用准备好的语句

于 2013-04-21T19:36:47.940 回答
0

应该在 SQL 语句中直接使用变量;这会导致各种安全漏洞。

正如您所说,这些mysql_功能正在被弃用。mysql_我知道如果您已经使用了很长时间的功能,您可能不愿意迁移到 PDO ,但是 PDO 比旧mysql_功能更好的原因有很多:

  • 它可以防止开箱即用的 SQL 注入漏洞
  • 它比mysql_函数更快
  • 它还具有支持 MySQL 以外的数据库引擎的优点

PDO 还将您的数据库查询与参数分开。考虑以下:

$sql = "INSERT INTO users (first_name, last_name, email)
        VALUES (:first_name, :last_name, :email)";

$smt->prepare($sql);
$smt->bindParam(':first_name', $first_name);
$smt->bindParam(':last_name', $last_name);
$smt->bindParam(':email', $email);
$smt->execute();

或者不那么“臃肿”的语法:

$sql = "INSERT INTO users (first_name, last_name, email)
        VALUES (:first_name, :last_name, :email)";

$smt->prepare($sql);
$smt->execute(array(
    ':first_name' => $first_name,
    ':last_name' => $last_name,
    ':email' => $email
));

如您所见,参数与语句本身是分开的。它比在你的语句中插入变量更干净,这看起来很难看,正如我所说,会导致注入漏洞。

于 2013-04-21T20:23:16.893 回答