关于pdo我的结论是否正确?

时间:2015-06-17 10:27:55

标签: php mysql pdo

一个:如果我使用bindParam();,那么execute();将没有参数。但是如果我使用数组而不是bindParam();,那么execute();将有参数。像这样的东西:

// one
$queryResults->bindParam(1,$test);
$queryResults->execute();

// two
$params = array($mfg, $price);
$queryResults->execute($params);

是不是?是或否?

二:我使用prepare($query);来防止恶意代码。

是不是?是或否?

三: fetchAll();fetch();快,但需要更多内存。

是不是?是或否?

四:使用::代码是可选的。例如:fetchAll(PDO::FETCH_ASSOC);fetchAll();相同。

是不是?是或否?

五:我无法在union中使用已发布的参数,我必须使用命名参数。

是不是?是或否?

六:使用try {} catch(){}是为了便于捕获和处理错误,使用try {}并非强制要求。

是不是?是或否?

七:

(第一部分)在PDO中,如果变量不存在,我可以使用query();exec();,但是当我有变量时,我应该使用{ {1}}。这样对吗 ?是或否?

(第二部分)这两者都是相同的。这样对吗 ?是或否?

prepare();

1 个答案:

答案 0 :(得分:0)

一个:是的,你是对的。如果将数组作为参数传递给execute方法,则它会将其作为绑定参数处理,并将其视为字符串(PDO::PARAM_STR)。

两个:是的,但您必须与bindParam()bindValue()或参数化execute()一起使用。您必须确保您转义所有来自用户的数据(例如表单帖子或查询字符串)。

:是的,根据>this< Stackoverflow的回答,就像你已经描述过的那样。

:是,否:是的,因为它是可选的(它们只是常量整数值)。不,fetchAll(PDO::FETCH_ASSOC)fetchAll()不同。如果在实例化PDO类时使用option参数,则可以更改默认提取模式以用于fetchAll()。例如:

$params = array(
    PDO::ATTR_DEFAULT_FETCH_MODE    => PDO::FETCH_ASSOC
);
$db = new PDO("mysql:host=" . $host . ";dbname=" . $dbname, $user, $pwd, $params);

您还可以在现有实例上使用setAttribute()方法以非常类似的方式设置默认提取模式:

$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

结果是一样的。任何没有参数的后续fetch()fetchAll()调用都将使用您设置的获取模式,或者直到实例处于活动状态。

默认提取模式为PDO::FETCH_BOTH,它返回一个包含关联索引和零启动数字索引的数组,如下例所示:

Array
(
  [0] => Array
    (
      [id] => 675
      [0] => 675
      [some_value] => foo
      [1] => foo
    )

  [1] => Array
    (
      [id] => 681
      [0] => 681
      [some_value] => bar
      [1] => bar
    )
)

:我不太清楚你是什么意思。可以在PDO中使用未命名的参数,但如果将关联数组传递给execute(),则会显示错误。解决这个问题的方法是,当您将数据传递给array_values()时,在您的数组上调用execute()。例如:

$parameters = array(
  "id"          => 123,
  "some_value"  => "foo"
);
$db->prepare("SELECT * FROM table_name WHERE id = ? AND some_value = ?");
$db->execute(array_values($parameters));

对于union运算符(和类似项目),您应该只使用命名参数。 see here

:使用try-catch是完全可选的,它取决于您的实现和错误处理首选项。我更喜欢在try-catch中使用异常,但您可以使用警告或静默错误代码,如PDO :: SetAttribute文档>here<的相关部分所述。

可以使用PDO实例化期间的option参数或在现有PDO实例上使用setAttribute()方法来设置这些参数。例如:

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
/*
  PDO::ERRMODE_EXCEPTION can be replaced with either
  PDO::ERRMODE_SILENT or PDO::ERRMODE_WARNING
*/

如果某些事情不清楚,或者您认为我还没有提供完整的答案,那么请告诉我,我会更新答案。