Php 动态构造INSERT语句后类型转换失败?
我试图基于JSON键/值对动态创建一个INSERT语句,其中$key是字符串或整数数据类型的数据库字段,$value是整数或字符串。我以前在向Postgres中插入数字字符串时没有遇到过问题,但它失败了 例如: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 = '{"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您是对的,这就是我如此困惑的原因。结果是导致错误的是一个浮点数字字符串。解决方案张贴在下面。