是否对PDO数组插入值的顺序有限制?


Is there a restriction on the order of the PDO array insert values?

我正在将现有的数据存储php代码从mysql_*函数更改为PDO,并将其从过程性更改为OOB编程。当我在更新SQL语句时,我注意到一些东西,在重写过程中相当远。

我正在为多个表INSERTUPDATE查询设置一个数组,因为我正在定义一个数组作为绑定值工作,我注意到调用绑定值的顺序将不同于UPDATEINSERT,这里是一个简短的例子:

$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'