Similar to this unsolved question
我的PHP输出需要启用JSON_NUMERIC_CHECK
,但是我的数据库中有一个字符串 nick 列,需要最初作为字符串返回。该列中的值可以包含数字,并且没有长度限制。代码示例:
$response["players"] = array();
...
$stmt = $connection->prepare('SELECT id, nick FROM players WHERE NOT id = ? ORDER BY nick');
$stmt->bind_param('i', $_POST["id"]);
$stmt->execute();
$result = $stmt->bind_result($id, $nick);
while ($stmt->fetch()) {
$players = array();
$players["id"] = $id;
$players["nick"] = $nick;
array_push($response["players"], $players);
}
...
echo json_encode($response, JSON_NUMERIC_CHECK);
例如,昵称“007”将作为“7”返回,我需要将其作为原始“007”。删除“JSON_NUMERIC_CHECK”有帮助,但它会破坏其余代码。像下面引用的 Strval()函数没有帮助。
$result = $stmt->bind_result($id, strval($nick));
$players["nick"] = strval($nick);
答案 0 :(得分:1)
在PHP中,很遗憾没有明确的变量类型,这使得您的问题不那么容易解决。
我带来了2个解决方案。
1)如果您喜欢OOP,请创建一个Serializable, Arrayable
类作为字符串的容器,并使用返回正确编码值的方法。
2)首先使用JSON_NUMERIC_CHECK
进行编码,以确保您的数据符合您的预期,然后对已验证的数据进行解码,手动将字符串设置为其原始值,然后再次编码,但这次不使用JSON_NUMERIC_CHECK
。
$str = $response['nick'];
$response = json_decode(json_encode( $response, JSON_NUMERIC_CHECK ) );
$response->nick = $str;
$response = json_encode( $response );
答案 1 :(得分:0)
至少可以说数字管理很奇怪... 简直太恐怖了!
然后在PHPTESTER上:
$CUSTOMER['id'] = 123;
$CUSTOMER['tel'] = '06 06 06 06 06';
// unbug for zero top of tel number -> json_encode
$CUSTOMER['tel'] = "".$CUSTOMER['tel']."";
echo json_encode($CUSTOMER, JSON_NUMERIC_CHECK);
输出:{“ id”:123,“ tel”:“ 06 06 06 06 06”}
在我的主机上(相同的代码):输出:{“ id”:123,“ tel”:“ 6 06 06 06 06”}} //零被删除了!
我找到了一个不太可能的解决方案: 我在变量周围加了一个空格...
$CUSTOMER['tel'] = " ".$CUSTOMER['tel']." "; // wrap with spaces
输出(在我的主机上):{“ id”:123,“ tel”:“ 06 06 06 06 06”}
在PHP 5.5版中
这是一个解决方案,无论如何,我想征求您的意见。