我的php脚本将(json)一些文本数据编码为null

时间:2013-11-17 03:34:13

标签: php json

所以我有一个php文件,它有一个函数,它返回一个编码到jason的数组,其中包含来自数据库的所有用户。如果由于任何原因我无法获得用户,则应将其编码为:

sucesso = 0;
erro = 1;
msg_erro = "error message..." 

嗯,除了msg_erro之外,一切都很好,因为即使出现错误,响应也会以null值发送,这是...

<?php    

    function getUsers() {    

        require_once 'connection.php';    
        mysql_select_db($con_database, $con) or die("erro mysql_select_db() -> users.php");     

        $users = array();    
        $resposta = array("sucesso" => 0, "erro" => 0);    

        $query = "SELECT * FROM utilizador WHERE cod_utilizador = 'x-3219'";    
        $result = mysql_query($query);    
        $rows = mysql_num_rows($result);    

        if($rows > 0) {    
            $resposta["sucesso"] = 1;    
            while($row = mysql_fetch_assoc($result)) {    
                $users[] = array("cod" => $row["cod_utilizador"], 
                                 "password" => $row["password"],
                                 "nome" => $row["nome"],
                                 "rank" => $row["tipo_utilizador"]);    
            }    
            $resposta["utilizadores"] = $users;    
        } else {    
            $resposta["erro"] = 1;    
            $resposta["msg_erro"] = "Não existem utilizadores na base de dados!";    
        }    

        return json_encode($resposta);    
    }    

    /*    
    $fp = fopen('resultados.json', 'w');    
    fwrite($fp, json_encode($resposta));    
    fclose($fp);    
    */    

?>    

所以,这会产生错误,而且确实如此,除了像我说的那样的消息:

Array ( [sucesso] => 0 [erro] => 1 [msg_erro] => )

为什么msg_erro被发送为空?

3 个答案:

答案 0 :(得分:0)

导致空字符串的常见罪魁祸首是给定的array包含非UTF-8字符串,而json_encode() 仅包含支持UTF-8编码。

您可以在错误消息中提供任意纯ASCII字符串,以查看它是否是编码问题。

    ....
    // error message block
    } else {    
        $resposta["erro"] = 1;    
        $resposta["msg_erro"] = "plain ASCII text";    
    }    

如果上述代码产生预期结果,则iconvmb_convert_encoding会有所帮助。

https://stackoverflow.com/a/16607515/760211中解释了将array转换为UTF-8。

答案 1 :(得分:0)

问题解决了,我刚刚定义了php文件的标题,然后数据传递时没有特殊的字符,所以我们不需要ut8_encode来自db的数据。

header('Content-Type: text/html; charset=utf-8');

答案 2 :(得分:-1)

可能是因为你阵列上的数据不是UTF-8。

我使用此功能修复:json_encode(recursiveUTF8($data));

function &recursiveUTF8(&$array) {
    foreach ($array as $key => &$value) {
        unset($new_key);
        if (!mb_check_encoding($key, 'UTF-8')) {
            $new_key = utf8_encode($key);
            if (is_array($value)) {
                unset($array[$key]);
                $array[$new_key] = &$value;
            } elseif (is_object($value)) {
                unset($array->$key);
                $array->$new_key = &$value;
            }
            $key = $new_key;
        }
        if (is_array($value) || is_object($value)) {
            String::recursiveUTF8($value);
        } elseif (!mb_check_encoding($value, 'UTF-8')) {
            $value = utf8_encode($value);
        }
    }
    return $array;
}