当我执行指定表中某些但不是所有字段的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安装/设置,告诉它接受只指定表中字段子集的语句。 ?
谢谢!
答案 0 :(得分:0)
INSERT INTO data_agreements
(id, time)
VALUES
(?, ?) ;
运行正常,如果其他字段{在这种情况下为intervention
已使用DEFAULT
属性定义,或者在表格为AUTO_INCREMENT
时定义创建。如果没有,则必须明确地为INSERT
语句提供值。
在2个安装中检查SHOW CREATE TABLE data_agreements
,如何定义表。
表的TIMESTAMP
列具有非显而易见的功能。其中只有一个可以具有DEFAULT CURRENT_TIMESTAMP
属性(如果您没有声明,则表中只有第一个属性具有此默认值)。
如果您定义了一个包含多个时间戳列的表,然后删除了第一个,则可能导致您遇到此问题。
答案 1 :(得分:0)
您的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触发器,而另一个则缺少另一个。
答案 2 :(得分:0)
我打赌列intervention
不允许 null
值。
尝试更改表并查看它是否有效:
ALTER table data_agreements Modify intervention varchar(50) null DEFAULT '';
并尝试再次执行查询。我假设intervention
是字符串,但是,当然,您可以修改它以满足您的需求。
感谢。