Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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 PDO破坏了我的JSON“_Php_Json_Pdo - Fatal编程技术网

Php PDO破坏了我的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

我正在使用PDO.encoded和JSON_encode在mysql文本字段中存储一个JSON数组

一旦我得到数据,如果我进行json_解码,结果是空的

PDO似乎正在用一种新的方式取代每一种

我已经多次一起使用PDO和JSON,但这是我第一次遇到这个问题,所以我不知道发生了什么

我使用的是PHP5.4.4

此外,JSON随AJAX一起发送,以供参考

如果你能帮忙,谢谢你

表中的JSON示例:

{"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
)