我无法在数据库中插入任何行,而我得到的错误是:
这没有任何意义,因为之前工作正常,据我所知,没有任何改变。 ID字段设置为primary,而不是null和自动增量:
我能够通过PHPMyAdmin手动插入一行。下面是插入的代码:
$query = "INSERT INTO wp_genomics_results (file_id,snp_id,genotype,reputation,zygosity) VALUES (?,?,?,?,?)";
$stmt = $ngdb->prepare($query);
$file_id = $this->fileID;
$snp_id = $row['id'];
$genotype = $this->formatGenotype($extractedGenotype);
$zygosity = $this->assignZygosity($genotype,$minor_allele);
$reputation = $this->assignReputation($zygosity,$genotypes);
$stmt->bind_param("sssss", $file_id,$snp_id,$genotype,$reputation,$zygosity);
$stmt->execute();
我尝试删除该表并创建一个新表,但它没有修复它。还有什么我可以做的来尝试和诊断并解决这个问题吗?
答案 0 :(得分:0)
确保这一行:
$ stmt-> bind_param( “SSSSS”, $的file_id,$ snp_id,$基因型,$信誉,$接合性);
您使用的bind_param()的第一个参数是“sssss”,表示所有关闭数据都是字符串。请将其修复为表数据库中类型的正确类型数据。 请使用“i”表示整数。例如:
$ stmt-> bind_param( “iisss”, $的file_id,$ snp_id,$基因型,$信誉,$接合性);
我将上面的代码作为一个例子,因为我无法看到你所有的表格。
答案 1 :(得分:0)
修改强>
表定义看起来很奇怪。看起来id
列上有第二个索引。 id
列已定义为PRIMARY KEY
表格定义中的这一行困扰着我......
KEY `id` (`id`)
奇怪的是,MySQL甚至会让你在同一列上添加第二个索引,并且不会返回错误,例如“这样的索引已经存在”或“列集已经被索引”或者这样的。
我建议你运行一个语句来删除名为id
的索引。执行
DROP INDEX `id` ON `wp_genomics_results`;
-OR -
ALTER TABLE `wp_genomics_results` DROP KEY `id`;
这个指数可能是导致这个问题的原因。
原始回答
我建议您弄明白正好哪个语句会引发错误。
我怀疑不执行INSERT INTO wp_genomics_results
语句。
如果是我,我会看一下assignZygosity
和assignReputation
函数。我怀疑罪魁祸首在那里。
我怀疑这些功能正在发生。我的猜测(只是猜测)是其中一个函数正在执行查找以获取外键的值。并且,如果未找到外键值,则执行某些操作以将行插入到引用的表中。必须有某些原因才能调用函数,我们不仅仅使用提供的值作为参数......
formatGenotype
功能也是一个嫌疑人,靠近。 (我不太担心那个函数名......但是,我再也不知道那个函数在做什么了。)
如果那不是问题,如果它确实是代码中显示的INSERT语句的执行,那么我会在wp_genomics_results
表上查找“BEFORE INSERT”触发器...也许触发器是执行插入到其他表。
作为快速测试,我会注释掉对这些功能的调用,只需为$zygosity
和$reputation
分配一个字面值。
我想知道正在抛出错误的 exact 文件中的完全行号。
我还想从MySQL获得完整的错误消息。
在每次执行数据库交互之后,我想检查返回,如果有错误,我想要(出于调试目的)一条唯一的消息,指示我们在代码中的位置抛出错误,以及从MySQL(mysqli_error
)返回的完整错误消息。
在没有证据的情况下,我不会假设执行此特定语句导致错误。
如果真的是这个陈述,那么我们需要看一下表的实际MySQL定义......来自SHOW CREATE TABLE wp_genomics_results
语句的输出。
我们希望确保我们正在查看代码所连接的相同的 MySQL实例和数据库,而不是其他一些MySQL实例或数据库。
答案 2 :(得分:0)
我尝试使用WordPress数据库连接插入:
$wpdb->query("INSERT INTO wp_genomics_results (file_id,snp_id,genotype,reputation,zygosity) VALUES ('$file_id','$snp_id','$genotype','$reputation','$zygosity')");
并且它可以工作,但如果我尝试使用与我自己的数据库连接相同的查询:
$db = new mysqli('localhost', NG_DB_USER, NG_DB_PASS, NG_DB_NAME);
$db->query("INSERT INTO wp_genomics_results (file_id,snp_id,genotype,reputation,zygosity) VALUES ('111','$snp_id','$genotype','$reputation','$zygosity')");
我得到同样的错误:
错误号码:1364 - MySQL错误字段'id'没有默认值
我不明白为什么它适用于wordpress但不适用于我自己的数据库连接。我进入了我的mysql.ini文件并更改了它:
SQL模式=“STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE, NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER“
到此:
SQL模式= “”
现在我可以插入一行,错误停止发生。我仍然不明白为什么这个错误一开始就出现了。现在发生了一个新的错误:
键'PRIMARY'重复输入'0'
我不明白,因为id列设置为自动增量。那里也没有ID = 0的行。我甚至清空了表,以确保在ID = 0时没有行。我对发生的事情感到非常困惑。下面是表结构的输出:
> mysql> SHOW CREATE TABLE wp_genomics_results;
| wp_genomics_results | CREATE TABLE `wp_genomics_results` (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`file_id` int(11) NOT NULL,
`snp_id` int(11) NOT NULL,
`genotype` varchar(3) NOT NULL,
`reputation` varchar(3) NOT NULL,
`zygosity` int(3) NOT NULL,
PRIMARY KEY (`id`),
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+---------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
答案 3 :(得分:0)
天哪,我觉得自己像个白痴。一直以来,问题在于我选择了错误的数据库。所以它是从不同的数据库查询表,并且这个表ID字段没有设置自动增量。好吧,这是一个很好的学习经验,更好地了解MySQL。