【发布时间】:2013-05-19 08:58:31
【问题描述】:
有人告诉我,当您使用 PDO 时,您不能使用“INSERT INTO .... SET”将数据插入数据库,因为它不适用于 MySQL 以外的数据库。我不确定他到底是什么意思,也许他的意思是我应该使用其他插入方法,例如,
INSERT INTO table (column1, column2) VALUES (?, ?)
我尝试在互联网上搜索此内容,但找不到任何内容。请让我知道这件事。
谢谢。
【问题讨论】:
有人告诉我,当您使用 PDO 时,您不能使用“INSERT INTO .... SET”将数据插入数据库,因为它不适用于 MySQL 以外的数据库。我不确定他到底是什么意思,也许他的意思是我应该使用其他插入方法,例如,
INSERT INTO table (column1, column2) VALUES (?, ?)
我尝试在互联网上搜索此内容,但找不到任何内容。请让我知道这件事。
谢谢。
【问题讨论】:
INSERT INTO ... SET 语法不是 ANSI SQL 标准的一部分,因此在不同的 RDBMS 实现中不受广泛支持。如果您正在设计应用程序以使其与 MySQL 紧密耦合,那么使用这种语法就可以了。如果您尝试设计使您的应用程序与 RDBMS 实现不紧密耦合,那么您应该使用更标准的 INSERT INTO table (columns) VALUES (values) 语法。
【讨论】:
如 this 中所述,唯一提到的区别,b/n mysql 驱动程序和其他如下所述。假设这是一个简单的查询:
<?php
$stmt = $db->query('SELECT * FROM table');
$row_count = $stmt->rowCount();
echo $row_count.' rows selected';
现在,让我们阅读文档如何说明该查询如何/为什么只能在 mysql 驱动程序时返回 affected_rows 的计数
注意:虽然文档说此方法仅用于返回 来自
UPDATE、INSERT、DELETE查询的受影响行,使用 PDO_MYSQL 驱动程序(仅限此驱动程序)您可以获得SELECT的行数 查询。为多个数据库编写代码时请记住这一点。这是因为 MySQL 的协议是提供此功能的极少数协议之一 向客户提供
SELECT语句的信息。大多数其他数据库 供应商不会费心将这些信息泄露给客户,因为它 会在他们的实现中产生更多的开销。
所以,据我所知,差别不大。
【讨论】:
您应该使用INSERT INTO table (column1, column2) VALUES (?, ?) 语句而不是INSERT INTO table SET column1=? 语句,因为这是基于SQL 的数据库语言的正确语法。虽然MySQL accepts it,但其他人可能不会。
【讨论】:
PHP PDO 中的位置参数就可以了。另一个选项是命名参数。如果我从我在 PDO C 代码中看到的内容中没有记错的话,是 PHP 而不是 DBM 进行了替换。
【讨论】: