Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 动态构造INSERT语句后类型转换失败?_Php_Sql_Json_Postgresql_Type Conversion - Fatal编程技术网

Php 动态构造INSERT语句后类型转换失败?

Php 动态构造INSERT语句后类型转换失败?,php,sql,json,postgresql,type-conversion,Php,Sql,Json,Postgresql,Type Conversion,我试图基于JSON键/值对动态创建一个INSERT语句,其中$key是字符串或整数数据类型的数据库字段,$value是整数或字符串。我以前在向Postgres中插入数字字符串时没有遇到过问题,但它失败了 例如: $json = '{"stringField":"string","intString":"42"}'; $columns = $values = ''; foreach (json_decode($json, true) as $key => $value) { if (

我试图基于JSON键/值对动态创建一个INSERT语句,其中$key是字符串或整数数据类型的数据库字段,$value是整数或字符串。我以前在向Postgres中插入数字字符串时没有遇到过问题,但它失败了

例如:

$json = '{"stringField":"string","intString":"42"}';
$columns = $values = '';
foreach (json_decode($json, true) as $key => $value) {
    if ($value != NULL) {
        $columns .= $key . ', ';        
        $values .=  "'" . $value . "', ";
    }
}
$query = ('INSERT INTO table ('.rtrim($columns, ', ').') VALUES ('.trim($values, ', ').');');
这是更干净的PHP:

$json = '{"stringField":"string","numberField":"42"}';
$columns = $values = '';
foreach (json_decode($json, true) as $key => $value) {
    if ($value !== NULL) {
        $columns .= $key . ', ';
        $values .= is_numeric($value) ? $value : "'" . $value . "', ";
    }
}

$query = 'INSERT INTO table ('.rtrim($columns, ', ').') VALUES ('.trim($values, ', ').');';

请考虑转义您的值。

问题是,其中一个值实际上是一个浮点数字字符串,在插入整数字段时失败,如果是数字字符串,则舍入该值可解决此问题。
是数值的
检查可避免字符串字段转换为
0

解决方案:

$json = '{"stringField":"string","floatString":"42.0","intString":"42"}';
$columns = $values = '';
foreach (json_decode($json, true) as $key => $value) {
    if ($value != NULL) {
        $columns .= $key . ', ';        
        $values .= is_numeric($value) ?  round($value) . "," : "'" . $value . "', ";
    }
}
$query = ('INSERT INTO table ('.rtrim($columns, ', ').') VALUES ('.trim($values, ', ').');');

在这种特殊情况下需要null条件以避免空字符串值。如果它符合您的需要,请接受我的答案作为有效答案在这种情况下,我需要类型转换比较
=
捕获空字符串(以及
NULL
未定义的值)<代码>“”!==NULL
计算结果为true。您可以替换
!==带有
的空
$值
,它将捕获
NULL
,空字符串
(!$value)
将不会捕获
($value)
也属于
false
($value)
将不会捕获
($value!==NULL)
是一个严格的比较,因此它也不会捕获
($value!=NULL)
将进行转换并捕获所有需要的案例。Stgres将接受
42
'42'
作为
插入语句中的数字字段,因此您可以无条件地添加引号。该网站倾向于将问题和答案分开,因此,与其在“问题”字段中添加解决方案,不如单击其中一个答案上的“接受”勾号,或者。@NickBarnes您是对的,这就是我如此困惑的原因。结果是导致错误的是一个浮点数字字符串。解决方案张贴在下面。