Php MySQL-字段';id';不';没有默认值

Php MySQL-字段';id';不';没有默认值,php,mysql,Php,Mysql,我无法在数据库中插入任何行,我遇到的错误是: 这没有任何意义,因为它以前工作得很好,据我所知没有任何变化。ID字段设置为主、非空和自动递增: 我可以通过PHPMyAdmin手动插入一行。下面是我插入的代码: $query = "INSERT INTO wp_genomics_results (file_id,snp_id,genotype,reputation,zygosity) VALUES (?,?,?,?,?)"; $stmt = $ngdb->prepare($

我无法在数据库中插入任何行,我遇到的错误是:

这没有任何意义,因为它以前工作得很好,据我所知没有任何变化。ID字段设置为主、非空和自动递增:

我可以通过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();

我尝试删除表并创建一个新表,但没有修复它。我还可以做些什么来尝试诊断和修复此问题?

请确保这一行:

$stmt->bind_参数(“SSS”, $file\u id、$snp\u id、$genetic、$声誉、$zygosity)

您使用的bind_param()的第一个参数是“ssss”,这意味着所有关闭的数据都是字符串。请将其修复为表数据库中您的类型的正确类型数据。 请用“i”表示整数。例如:

$stmt->bind_参数(“iisss”, $file\u id、$snp\u id、$genetic、$声誉、$zygosity)

我以上面的代码为例,因为我看不到所有的表描述。

EDIT

表定义看起来很奇怪。看起来
id
列上还有第二个索引。
id
列已定义为
主键

表定义中的这一行让我感到困扰

  KEY `id` (`id`)
奇怪的是,MySQL甚至允许您在同一列上添加第二个索引,而不返回“这样的索引已经存在”或“列集合已经被索引”之类的错误

我建议您运行一条语句来删除名为
id
的索引。执行

  DROP INDEX `id` ON `wp_genomics_results`;
-或-

有可能是这个指数导致了这个问题


原始答案

我建议您准确地找出哪个语句抛出了错误

我怀疑这不是执行
INSERT-INTO-wp\u genomics\u results
语句

如果是我,我会看看
assignZygosity
assignReputation
函数。我怀疑罪犯在下面

我怀疑这些功能中有什么问题。我的猜测(只是猜测)是其中一个函数正在执行查找以获取外键的值。并且,如果没有找到外键值,则会执行某些操作以将行插入引用的表中。函数被调用肯定是有原因的,我们不只是使用提供的值作为参数

formatGenype
函数也是可疑的。(我不太害怕那个函数名……但我还是不知道那个函数在做什么。)

如果这不是问题所在,如果这确实是代码中显示的INSERT语句的执行,那么我会在
wp\u genomics\u results
表中查找“BEFORE INSERT”触发器。。。可能触发器正在执行对其他表的插入


作为一个快速测试,我会注释掉对这些函数的调用,然后只为
$zygosity
$reputation
分配一个文本值

我想知道抛出错误的确切文件中的确切行号

我还想从MySQL获得完整的错误消息

每次执行数据库交互后,我都要检查返回,如果有错误,我要(为了调试目的)一条唯一的消息,指示抛出错误时我们在代码中的位置,以及从MySQL返回的完整错误消息(
mysqli_error

在没有证据的情况下,我不会假设是这个特定语句的执行导致了错误

如果它真的是这个语句,那么我们需要看看表的实际MySQL定义。。。
的输出显示CREATE TABLE wp_genomics_results
语句


我们希望确保我们看到的是代码连接到的同一个MySQL实例和数据库,而不是其他MySQL实例或数据库。

我尝试使用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')");
它可以工作,但如果我尝试使用与我自己的数据库连接相同的查询:

$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 mode=“严格\u所有\u表,错误\u除以\u零,无\u零\u日期, 没有日期中的零,没有自动创建用户“

为此:

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)
我注意到上面写的是一行,但实际上桌子是空的。再一次,我可以通过PHPMyAdmin插入一个新行:
哦,天哪,我觉得自己像个白痴。一直以来,问题是我选择了错误的数据库。所以它是从不同的数据库查询一个表,而这个表ID字段没有设置自动递增。啊,这是一次很好的学习经历,加深了对MySQL的了解。

什么值是
$snp\u id=$row['id']
而且您的类型在
$stmt->bind\u param(“ssss”)中不匹配,
感谢您的详细回复。我注释掉了$reputation、$Genype和$zygosity,但它没有改变任何东西。没有任何字段连接到任何外键。我尝试用它插入(我将在答案中发布)我在答案中添加了一个编辑。SHOW CREATE TABLE已显示