Php PDO破坏了我的JSON“
我正在使用PDO.encoded和JSON_encode在mysql文本字段中存储一个JSON数组 一旦我得到数据,如果我进行json_解码,结果是空的 PDO似乎正在用一种新的方式取代每一种 我已经多次一起使用PDO和JSON,但这是我第一次遇到这个问题,所以我不知道发生了什么 我使用的是PHP5.4.4 此外,JSON随AJAX一起发送,以供参考 如果你能帮忙,谢谢你 表中的JSON示例:Php PDO破坏了我的JSON“,php,json,pdo,Php,Json,Pdo,我正在使用PDO.encoded和JSON_encode在mysql文本字段中存储一个JSON数组 一旦我得到数据,如果我进行json_解码,结果是空的 PDO似乎正在用一种新的方式取代每一种 我已经多次一起使用PDO和JSON,但这是我第一次遇到这个问题,所以我不知道发生了什么 我使用的是PHP5.4.4 此外,JSON随AJAX一起发送,以供参考 如果你能帮忙,谢谢你 表中的JSON示例: {"type_voie":"BD","indice_repetition":"T","num_voie
{"type_voie":"BD","indice_repetition":"T","num_voie":"121","nom_voie":"NOM_RUE","infos_voie":"NOM_RUE2","distribution_speciale":"BP789","cp":"34000","ville":"MONTPELLIER","bureau_distributeur":""}
我在var_dump中真正看到的是:
{"type_voie":"BD","indice_repetition":"T","num_voie":"121","nom_voie":"NOM_RUE","infos_voie":"NOM_RUE2","distribution_speciale":"BP789","cp":"34000","ville":"MONTPELLIER","bureau_distributeur":""}
这将与准备好的查询一起插入
检索数据的代码:
$formDataSQL = '
SELECT * FROM '.$this->prefix.'
WHERE formalite_id = '.$this->proc_id.'
';
$formDataReq = self::$db->prepare($formDataSQL);
$formDataReq->execute();
$formData = $formDataReq->fetch(PDO::FETCH_ASSOC);
然后在JSON字段上:
$addrData = json_decode(str_replace('"', '"', $champ['value']), true); // WORKING BUT NOT MAINTAINABLE
$addrData = json_decode($champ['value'], true); // NOT WORKING => NULL + JSON ERROR = JSON_ERROR_SYNTAX
以下是我的插入代码的简化示例:
foreach($saveData['personne_physique'] as $field => $value){
if(is_array($value)) $value = json_encode($value);
$param = ':'.$field;
$fields .= $field.'='.$param.', ';
$values[$param] = $value;
}
$fields = trim($fields, ', ');
$persPhysSQL = "UPDATE personne_physique SET $fields WHERE personne_id = ".$this->id;
$persPhysReq = self::$db->prepare($persPhysSQL);
$persPhysReq->execute($values);
以下是我的连接方式:
$host = 'mysql:dbname='.BDD_NAME.';host='.BDD_HOST.';charset=utf8';
$user = BDD_USER;
$pass = BDD_PASS;
$db = new PDO($host, $user, $pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") );
这真的很奇怪:以下是基于您的数据示例的示例脚本:
<?php
try {
$Connection = new PDO('mysql:host=localhost;dbname=testing', USER, PASS);
$Connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
echo 'Unable to connect to database' . "\n";
}
$id = $argv[1];
try {
$data = $Connection->prepare('SELECT * FROM `stackoverflow_26399231` WHERE ID = :id');
$data->bindParam(':id', $id, PDO::PARAM_INT);
$data->execute();
while($row = $data->fetch(PDO::FETCH_OBJ)){
print_r($row);
print_r(json_decode($row->data));
}
$Connection = null;
}catch(PDOException $e){
echo 'Error executing query: ' . $e->getMessage() . "\n";
}
?>
在CLI中运行脚本时,您会得到以下结果:
stdClass Object (
[id] => 1
[data] => {"type_voie":"BD","indice_repetition":"T","num_voie":"121","nom_voie":"NOM_RUE","infos_voie":"NOM_RUE2","distribution_speciale":"BP789","cp":"34000","ville":"MONTPELLIER","bureau_distributeur":""}
)
stdClass Object (
[type_voie] => BD
[indice_repetition] => T
[num_voie] => 121
[nom_voie] => NOM_RUE
[infos_voie] => NOM_RUE2
[distribution_speciale] => BP789
[cp] => 34000
[ville] => MONTPELLIER
[bureau_distributeur] =>
)
我的剧本和你的有什么不同?我无法重现这个问题
更新:
我的更新脚本遵循您的示例:
try {
$Connection = new PDO('mysql:host=localhost;dbname=testing', USER, PASS);
$Connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
echo 'Unable to connect to database' . "\n";
}
$id = $argv[1];
$ary = array(
'foo' => 'bar',
'bar' => 'foo',
'a' => 'b',
'c' => 'd',
'e' => 'f'
);
try {
$fields = 'data=:data';
$values = array('data' => json_encode($ary));
$update = $Connection->prepare("UPDATE `stackoverflow_26399231` SET $fields WHERE ID = $id");
$update->execute($values);
$Connection = null;
}catch(PDOException $e){
echo 'Error executing query: ' . $e->getMessage() . "\n";
}
使用与上面相同的脚本接收,但将从PDO::FETCH_OBJ更改为PDO::FETCH_ASSOC,因为这就是您正在使用的,我得到以下输出:
Array
(
[id] => 1
[data] => {"foo":"bar","bar":"foo","a":"b","c":"d","e":"f"}
)
stdClass Object
(
[foo] => bar
[bar] => foo
[a] => b
[c] => d
[e] => f
)
因此,我仍然无法重现您遇到的问题。这两个脚本之间一定有不同之处。尝试对您的结果使用trim,然后使用json解码。或者使用HTMLSpecialEntity。不起作用。我确信问题来自“因为如果我替换它们,它会起作用。但我想修复此问题,而不是进行替换e。”每次。你能发布一些代码吗?是的,但这只是一个简单的json编码和PDO准备的查询,我不认为这会有帮助。请将你的代码发布到从数据库检索json的地方。我看不出有什么不同…我想插入时引号被替换了。这真的很奇怪…可能是因为准备好了数据ementI看不出有什么不同…可能是连接?请看编辑的帖子将我的连接更改为charset=utf8,并在启动PDO时添加了arrayPDO::MYSQL\u ATTR\u INIT\u命令=>SET NAMES utf8,但我仍然没有看到相同的问题。我放弃了,这真的令人沮丧。我将在任何地方使用自定义json\u解码函数。谢谢您是否尝试过使用我的示例脚本对数据库运行测试脚本?这有效吗?
Array
(
[id] => 1
[data] => {"foo":"bar","bar":"foo","a":"b","c":"d","e":"f"}
)
stdClass Object
(
[foo] => bar
[bar] => foo
[a] => b
[c] => d
[e] => f
)