【发布时间】:2021-08-06 21:44:41
【问题描述】:
几乎每天我的任务是通过 PHP 将 JSON 数据插入到关系数据库中,就像 JSON 数据一样,有些记录具有某些列,而另一些则没有,这在插入表时往往会成为问题。
如果我要插入数千名学生,一条记录可能看起来像
{"name": "Billy Jackson", "Height": 172, "DOB" : "2002-08-21"}
但是不确定是否在任何记录中设置了高度和/或 DOB,我目前所做的是类似于
<?php
foreach($records as $json){
$name = addslashes($json['name']);
if(isset($json['Height']){
$height = $json['Height'];
}
else{
$height = "NULL"
}
if(isset($json['DOB']){
$dob = $json['DOB'];
}
else{
$dob = "NULL"
}
}
$db->query("INSERT INTO table (name, height, dob) VALUES ('$name', $height, '$dob')");
您可能会看到这并不优雅,也不适用于多种类型,DOB 等字段不接受 NULL,枚举也不接受。
是否有更优雅的内置解决方案,仅尝试插入到 JSON 中存在值的列中。
这是准备好的语句处理的吗?
编辑
假设上面的示例记录没有设置 DOB,插入语句看起来像
"INSERT INTO table (name, height, dob) VALUES ('Billy Jackson', 172, 'NULL')"
如果将 $dob 设置为 null ($dob = null) 则失败,如果未设置,则插入语句如下所示
"INSERT INTO table (name, height, dob) VALUES ('Billy Jackson', 172, '')"
失败了
为什么还要包含 dob 列?因为有些记录确实有 dob,我希望它们包含在插入中
【问题讨论】:
-
DOB 字段可以接受空值,检查这个stackoverflow.com/questions/1691117/…
-
你为什么不使用这样的表:ID | DATA:ID 是索引(此处无关紧要)| DATA:JSON 编码字段,您可以在其中放置您想要的所有内容,当您阅读此字段时,您只需将 [KEY] 更改为表 Header | [VALUE] 作为它的价值
-
“像 DOB 这样的字段不接受 NULL” 这并不是您的代码或数据的问题,而是您的数据库架构的问题。您必须使该列可以为空或丢弃缺少该字段的行。
-
@BilalAhmad 的问题是如何将变量设置为 null ,如图所示,如果我说 $dob = null 插入看起来像 Values ('Billy Jackson', 172, '')确实会引发错误
-
@AlexandroGiles 这就是我最初的做法,但不仅仅是存储数据,而是尽可能轻松地对其进行查询,我想通过一个查询轻松找到最高的学生,以及其他不太可能将所有 json 存储在一列中的示例