0

当我执行一个指定表中某些但不是所有字段的 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"));

问题服务器是一个带有 MySql 5、PHP 5.2.6 的 IIS。在具有 MySql 5、PHP 5.2.6 的不同服务器 Apache 上,两个语句都按预期插入。所以我想知道是否需要在问题服务器上设置一些 MySQL 安装/设置,以告诉它接受仅指定表中字段子集的语句。?

谢谢!

4

3 回答 3

1

您的 SQL 语句在语法上没有任何问题。MySQL 服务器中没有特定的“设置”来控制这种行为,但是有一些设置可以影响特定的 INSERT 语句是否成功,例如,允许无效日期的设置(即不存在的日期)例如 6 月 31 日),以及允许存储零日期('0000-00-00')的设置。(此行为已在不同版本中发生变化,其中“旧”(例如 V3.23)默认值是允许无效日期,而“较新”(例如 v5.1)默认值是不允许无效日期。)

如果为绑定参数提供的值是有效的,那么对您观察到的行为最可能的解释是存在(或将)违反的 CONSTRAINT。

这可能是主键约束、唯一键约束、外键约束、NOT NULL 约束,甚至可能是引发异常的触发器。

例如,列干预可能被定义为 NOT NULL 并且没有指定默认值。

MySQL 错误信息可能对调试有用。

另一种可能性是该语句实际上是成功的,但是是在随后被回滚而不是提交的事务的上下文中执行的。)

您的问题中没有足够的信息可以说明。

我建议您比较两个数据库上的表定义。最简单的方法(对我来说)是SHOW CREATE TABLE intervention从每个数据库的语句中获取输出,并寻找差异。也有可能其中一个数据库有一个 BEFORE INSERT FOR EACH ROW 触发器,而另一个数据库中缺少该触发器。

于 2012-08-08T14:25:24.917 回答
0
INSERT INTO data_agreements 
  (id, time) 
VALUES 
  (?, ?) ;

如果其他字段(intervention在这种情况下)已使用DEFAULT属性或AUTO_INCREMENT创建表时定义,则运行良好。如果没有,您必须显式地为INSERT语句提供一个值。

检查SHOW CREATE TABLE data_agreements2 个安装中的表是如何定义的。

表的TIMESTAMP列具有不明显的功能。其中只有一个可以有一个DEFAULT CURRENT_TIMESTAMP属性(如果你没有说明,只有表中的第一个获得这个默认值)。

如果您定义了一个包含多个时间戳列的表,然后删除了第一个,则可能会导致您遇到的问题。

于 2012-08-08T14:01:22.373 回答
0

我敢打赌列intervention 不允许 null值。

尝试改变表格,看看它是否有效:

ALTER table data_agreements Modify intervention varchar(50) null DEFAULT '';

并尝试再次执行查询。我认为这intervention是字符串,但当然,您可以修改它以满足您的需要。

谢谢。

于 2012-08-08T14:38:57.037 回答