1

我正在将现有的数据存储 php 代码从mysql_*函数更改为 PDO,并将其从过程更改为 OOB 编程。当我注意到一些事情时,我正在更新 SQL 语句,这已经进入了重写过程。

我正在为多个表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 语句那么简单

4

2 回答 2

4

使用命名占位符 (:col_name),您可以按您喜欢的任何顺序排列它们。但是,使用位置占位符 (?) - 您需要将它们按顺序排列。

于 2013-05-31T20:22:23.363 回答
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'
于 2013-05-31T20:27:51.497 回答