当我执行pdo指定表中的某些字段而不是所有字段时,它在一台服务器上插入正常,但在另一台服务器上插入失败。
例如,在有问题的服务器上...
表中包含三个字段id、time和intervention...
如果我运行这条语句,它会按预期插入。
$query = "INSERT INTO data_agreements (`id`, `time`, `intervention`) VALUES (?, ?, ?)";
$q = $pdo->prepare($query);
$q->execute(array("x", "y", "z"));但是如果我运行以下语句,它将无法插入。
$query = "INSERT INTO data_agreements (`id`, `time`) VALUES (?, ?)";
$q = $pdo->prepare($query);
$q->execute(array("x", "y"));出现问题的服务器是带有PHP5、MySql 5.2.6的IIS。在另一台运行PHP5、PHP5.2.6的服务器上,两条语句都按预期插入。因此,我想知道是否需要在有问题的服务器上设置一些MySQL安装/设置,以告诉它接受仅指定表中字段子集的语句。?
谢谢!
发布于 2012-08-08 22:38:57
我敢打赌列intervention不允许null值。
尝试更改该表,看看它是否有效:
ALTER table data_agreements Modify intervention varchar(50) null DEFAULT '';并尝试再次执行该查询。我假设intervention是字符串,当然,您可以根据自己的需要对其进行修改。
谢谢。
发布于 2012-08-08 22:25:25
您的SQL语句在语法上没有错误。在MySQL服务器中没有控制此行为的特定“设置”,但有一些设置可以影响特定INSERT语句是否成功,例如,允许无效日期(即不存在的日期,如6月31日)的设置,以及允许存储零日期('0000-00-00')的设置。(这种行为已经在不同版本之间发生了变化,其中“旧的”(例如V3.23)默认是允许无效日期,而“较新的”(例如v5.1)默认是不允许无效的日期。)
如果为绑定参数提供的值是有效的,那么对于您观察到的行为,最可能的解释是有一个约束被违反(或将被违反)。
这可以是primary key约束、unique key约束、foreign key约束、NOT NULL约束,甚至可以是引发异常的触发器。
例如,可以将列干预定义为NOT NULL,并且不指定默认值。
MySQL错误信息对于调试可能很有用。
另一种可能性是,该语句实际上是成功的,但它是在事务的上下文中执行的,该事务随后被回滚而不是提交。)
您的问题中没有足够的信息可供说明。
我建议您比较两个数据库上的表定义。(对我来说)最简单的方法是从每个数据库的SHOW CREATE TABLE intervention语句中获取输出,并查找差异。也有可能其中一个数据库为每个行触发器都有一个BEFORE INSERT,而另一个数据库上缺少该触发器。
发布于 2012-08-08 22:01:22
INSERT INTO data_agreements
(id, time)
VALUES
(?, ?) ;运行正常,如果在创建表时使用DEFAULT属性或AUTO_INCREMENT定义了其他字段(在本例中为intervention ),则为。如果不是,则必须显式地为INSERT语句提供一个值。
检查两个安装中的SHOW CREATE TABLE data_agreements,了解表是如何定义的。
表的TIMESTAMP列有一个不太明显的功能。它们中只有一个可以有DEFAULT CURRENT_TIMESTAMP属性(如果您没有声明,那么只有表中的第一个拥有这个缺省值)。
如果您定义了一个具有多个时间戳列的表,然后删除了第一个时间戳列,则可能会导致出现此问题。
https://stackoverflow.com/questions/11866077
复制相似问题