我正在将现有的数据存储php代码从mysql_*
函数更改为PDO,并将其从过程性更改为OOB编程。当我在更新SQL语句时,我注意到一些东西,在重写过程中相当远。
我正在为多个表INSERT
和UPDATE
查询设置一个数组,因为我正在定义一个数组作为绑定值工作,我注意到调用绑定值的顺序将不同于UPDATE
到INSERT
,这里是一个简短的例子:
$bound_values = array(
':column_aa' => 'aa',
':column_ab' => 'ab',
':column_ac' => 'ac'
)
);
sql for INSERT
:
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;
示例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语句是vs $bound_values
数组,或者我是正确的被关注,需要做出一些改变?
请注意,我正在使用的现有代码在附近的任何地方都不像我上面展示的SQL语句那样简单。
使用命名占位符(:col_name),您可以按照您喜欢的顺序排列它们。但是,使用位置占位符(?)-您需要将它们按顺序排列。
只要使用命名参数(:somename
)就没关系。绑定只是告诉数据库引擎"在我写占位符:abc
的地方,用这个值填充"。在我写占位符:xyz
的地方,放置另一个值".
想想如果在execute
中分别绑定每个值而不是一次绑定所有值,代码会是什么样子$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'