2013-05-31 45 views
1

我改变现有的数据存储PHP代码从mysql_*功能PDO以及从程序改变它OOB编程。我在注意到某些事情时更新了SQL语句,这与重写过程相差甚远。对PDO数组插入值的顺序有限制吗?

我正在设置为多个表INSERTUPDATE查询的阵列,因为我定义数组作为我注意到结合值的工作,该顺序,其中结合值称为将来自UPDATE不同到INSERT,这里是一个简单的例子:

$bound_values = array(
    ':column_aa' => 'aa', 
    ':column_ab' => 'ab', 
    ':column_ac' => 'ac' 
    ) 
); 

例如,SQL为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; 

示例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语句一样简单。

+3

只要您使用命名的标识符,而不是简单'?'那么也不要紧什么顺序排列是英寸 – Sammitch

+1

好消息,这就是为什么我开始使用命名的标识符,但每一个例子,我看到了他们然后看到'CURSOR_FWDONLY'我开始担心。谢谢@sammitich,如果你会如此友善,请发表您的评论作为答案,我会接受它。再次感谢。 –

+0

只要接受,@ robert-widdick's。这也是对的,他可以使用一些观点。; D – Sammitch

回答

3

使用命名占位符(:col_name),您可以按照您的请求以任意顺序放置它们。但是,使用位置占位符(?) - 您需要按顺序放置它们。

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' 
+0

缺乏标准化或一致性是我的一个大宠物,所以最终'UPDATE'语句将反映列/ INSERT语句的顺序,但是查询太多而且时间太少。感谢您的回答和解释+1 –