Php MySQL-字段';id';不';没有默认值
我无法在数据库中插入任何行,我遇到的错误是: 这没有任何意义,因为它以前工作得很好,据我所知没有任何变化。ID字段设置为主、非空和自动递增: 我可以通过PHPMyAdmin手动插入一行。下面是我插入的代码: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($
$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已显示