我正在将现有的数据存储php代码从mysql_*
函数更改为PDO,并将其从Procedural更改为OOB编程。当我注意到某些东西时,我正在更新SQL语句,在重写过程中相当远。
我正在为多个表INSERT
和UPDATE
查询设置一个数组,因为我正在定义一个数组作为绑定值工作,我注意到 order in调用绑定值的方式与UPDATE
到INSERT
不同,这是一个简短的例子:
$bound_values = array(
':column_aa' => 'aa',
':column_ab' => 'ab',
':column_ac' => 'ac'
)
);
INSERT
的示例sql:
INSERT INTO `table_a`
(`id`, `column_aa`, `column_ab`, `column_ac`)
VALUES
('', :column_aa, :column_ab, :column_ac);
和UPDATE
:
UPDATE `table_a` SET
`column_ab` = :column_ab, `column_ac` = :column_ac, `column_aa` = :column_aa;
示例PHP PDO:
$pdo = new PDO('mysql:host=localhost;dbname=example', 'root', '');
// The second parameter of the PDO cursor is what I saw that raised the flag
$sth = $pdo->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute($boud_values);
所以我的问题是,我可以继续使用这种方法,而不会出现SQL语句与$bound_values
数组的顺序有什么关系,或者我是否正确地关注并需要进行一些更改?
请注意,我正在使用的现有代码并不像 那样简单,就像我上面显示的SQL语句一样简单。
答案 0 :(得分:3)
使用命名占位符(:col_name),您可以按任意顺序放置它们。但是,使用位置占位符(?) - 您需要将它们按顺序排列。
答案 1 :(得分:2)
只要您使用命名参数(:somename
),就无所谓了。绑定只是告诉你的数据库引擎“我在哪里写了占位符:abc
,填写了这个值。我在哪里写了占位符:xyz
,把这个其他值”。
考虑一下如果你在执行中分别绑定每个值而不是一次性绑定代码将会是什么样子
$sth->bindParam(':abc', 'value1', PDO::PARAM_STR);
$sth->bindParam(':xyz', 'value2', PDO::PARAM_STR);
$sth->execute();
切换bindParam()顺序不会产生任何影响。
另外,请注意在INSERT和UPDATE sql查询中设置列的顺序无关紧要,所以如果这真的让你感到烦恼(或者如果你想要标准化一点),你可以只订购列两种查询都是一样的。
UPDATE table SET col2 = 'xyz', col1 = 'abc'
// is the same as
UPDATE table SET col1 = 'abc', col2 = 'xyz'