一个:如果我使用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();
答案 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
*/
如果某些事情不清楚,或者您认为我还没有提供完整的答案,那么请告诉我,我会更新答案。