我正在开发一个使用php制作的API的android应用。在这里,我正在动态创建列及其值。
我正在通过邮递员验证API,每次都会发生奇怪的事情,在遍历Json Object时,我要做的是首先创建列,然后插入其值。 问题在于,只有第一个迭代会保存元素,而其余的元素只会创建列,而不会插入值。我不知道我做错了什么,下面是我的php代码。
<?php
include("connection.php");
$data = file_get_contents('php://input');
$json_data = json_decode($data);
foreach($json_data as $key => $val) {
$column_name = $key ;
$c_column_name = preg_replace('/[^a-zA-Z]+/', '', $column_name);
$column_value = $val ;
$table_name = "test2";
$email = "ht@t.com";
$result = mysqli_query($conn,"SHOW COLUMNS FROM $table_name LIKE '$c_column_name'");
$exists = (mysqli_num_rows($result))?TRUE:FALSE;
if($exists) {
$query1 = "INSERT INTO $table_name($c_column_name)VALUES('$column_value') ";
$data0=mysqli_query($conn,$query);
if($data0)
{
echo json_encode(array("success"=>"true - insertion","message"=>"Column existed, Successfully data sent."));
}
else{
echo json_encode(array("success"=>"false - insertion","message"=>"Column existed, data not inserted."));
}
}
else{
$query2="ALTER TABLE $table_name ADD COLUMN `$c_column_name` varchar(50) NOT NULL";
$data1=mysqli_query($conn,$query2);
if($data1){
$query3="INSERT INTO $table_name($c_column_name)VALUES('$column_value')";
$data2=mysqli_query($conn,$query3);
if($data2)
{
echo json_encode(array("success"=>"true - insertion","message"=>"Successfully data sent."));
}
else{
echo json_encode(array("success"=>"false - insertion","message"=>"Column created but data not inserted."));
}
}
else
{
echo json_encode(array("success"=>"false - column creation","message"=>"Failed to create column.'$column_name', '$table_name', '$conn'"));
}
}
}
?>
这里是邮递员的Json对象。
{"Shape":"rewq","Trans.No.":"yuuiop","Color":"qwert"}
请帮助我,非常感谢您的帮助或建议。
答案 0 :(得分:0)
第二个列名是Trans.No.
,其中包含一个点,这就是为什么它失败的原因,可能是由于错误导致无法创建其他列。
我认为使用具有这种结构的表会更好:
属性(ID,键,值)
,并且每当收到一个键值对时,您只需插入/更新它,这取决于您需要执行的逻辑。您当前的模型将为每个属性创建一个单独的行,这可能不是您想要实现的。
编辑
根据评论部分收到的信息,我得出以下结论:
您可以先创建缺少的列,然后使用单个插入项生成所有列的插入语句。
但是最好不要为每个值创建单独的列,因为列数可能会很快失去控制。相反,您可以有一张桌子:
myentity(id,name)
用于存储JSON表示的实体和
属性(id,myentity_id,键,值)
用于存储其属性。这将是一个具有所有想要的个性的简洁架构。