4
$user='root';

try{
$pdo=new PDO('mysql:host=localhost;dbname=test',$user);
$pdo->exec('set character set utf8');
}
catch(PDOException $e){
echo 'Error: '.$e->getMessage();
}

//using bound variables?
$stmt=$pdo->prepare('insert into test(name) value(:name)');
$stmt->bindParam(':name',$_POST['name']);
$stmt->execute();

//using named parameters
$stmt=$pdo->prepare('insert into test(name) value(:name)');
$stmt->execute(array(':name'=>$_POST['name']));

//using placeholders
$stmt=$pdo->prepare('insert into test(name) value(?)');
$stmt->execute(array($_POST['name']));

//using bound parameters w/ placeholders
$stmt=$pdo->prepare('insert into test(name) value(?)');
$stmt->bindParam($_POST['name']);
$stmt->execute();

我只是想知道作为 PHP 初学者最适合使用什么,我只是对使用什么感到困惑,我想知道什么是最好的和最常用的。

4

3 回答 3

5

我发现第二种方法最好:

//using named parameters
$stmt=$pdo->prepare('insert into test(name) value(:name)');
$stmt->execute(array(':name'=>$_POST['name']));

您已经命名了参数,因此您知道数组中的内容 - 我讨厌查看?代码中的五个或更多并尝试确定顺序是否正确,并且将更少的代码行放入数组并执行这一切都在同一时间而不是通过许多->bindParam()线路。

如果这个选项不在桌面上,我会通过其他的许多行->bindParam()

这个问题归结为个人喜好。选择最适合您的内容、易于阅读和理解的内容(特别是如果您在数周或数月后再次阅读)以及对于可能不得不通过您的代码进行调试的其他人来说易于阅读的内容。

编辑:没有什么比这更快了。以某种方式将查询放在一起可能需要多毫秒的时间,但查询将花费相同的时间在数据库上执行。更快真的不是在这里看的东西。

于 2012-08-27T14:21:33.777 回答
2

答案归结为一件事——个人喜好。它们都按预期工作并且同样给出相同的结果,但是“你如何编写它”完全取决于你更喜欢什么 - 以及可能(最终)可能使用你的代码的其他人。

我个人的观点,我认为命名参数是最好的,因为它可以很清楚你正在设置什么值。在查询中使用单个参数可能毫无意义 - 但是当有 10 多个时,它可以派上用场。

于 2012-08-27T14:22:10.907 回答
1

就个人而言,我更喜欢这四个中的第一个。很清楚您在做什么,因此您的代码将被证明更易于维护。当数组已经存在并且所有值都将在查询中使用时,使用数组很有用。尽管如此,在编写代码时,您仍会遇到错误。并且调试使用?占位符的查询可能会很痛苦。

在性能方面,这 4 种方法中的任何一种都没有太大的区别,但是有一些区别:

在 4 个示例中的 2 个中,您正在创建一个数组。创建数组很便宜,但不是免费的。
使用时bindParam,您可以轻松指定数据类型(只需浏览 PDO 预定义的常量)。大多数情况下,这不会产生太大的影响,但在执行全表扫描的情况下,最好不要让 MySQL 进行类型转换。

所以关于性能:如果你不需要,不要构造新的数组,并尽可能设置正确的数据类型。

关于代码质量:命名参数通常会让你的生活更轻松,所以我建议你尽可能多地使用它们

于 2012-08-27T14:36:14.407 回答