JSON不能编码为json或UTF-8?

时间:2017-02-09 20:12:30

标签: php jquery json ajax utf-8

我有些担心JSON没有作为JSON返回。我没有错误,只是没有数据。浏览器在响应中显示数据。

我知道它没有作为JSON返回,因为在AJAX部分设置dataType会导致它什么也不显示。如果我删除了dataType语句,它将显示数据。

我在连接字符串中,在查询中,作为标题,以及在AJAX部分中使用编码都无济于事。我的数据库是UTF-8,general_ci。

AJAX:

$.ajax({

            contentType: 'application/json; charset=UTF-8',
            data: {'career' : $career},
            dataType: 'json',
            url: 'functions.php',
            success: function(data) {

                $("careerdata").html(data);

            },

PHP:

if (isset($_GET['career'])) {

    require_once 'config.php';

    $query = $dbconnect->prepare("select * from jobs where Category = :category");
    $query->bindParam(':category', $category);
    $category = $_GET['career'];
    $query->execute();

    $result = $query->fetchAll(PDO::FETCH_ASSOC);

    echo json_encode($result);

    $dbconnect = null;

    return;

} else {

    echo 'No career data found.'; 

};

连接文件:

try {

$dbconnect = new PDO("mysql:host=$host;dbname=$database", $user, $pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));

$dbconnect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

}

catch(PDOException $e) {

echo "Connection failed: " . $e->getMessage();

};

如果需要更多信息,请告知我们。

工作页面为https://www.shardsmith.com/career.php,实际查询为https://www.shardsmith.com/functions.php(但由于GET变量,它无法独立工作)。

2 个答案:

答案 0 :(得分:0)

似乎MySQL(php)客户端确实假设另一个客户端编码而不是UTF-8。您可以使用

请求正确的编码
$dbhconnect->exec("SET NAMES utf8");

直接连接到数据库后。

或者,您可以在连接配置中使用PDO :: MYSQL_ATTR_INIT_COMMAND(请参阅http://php.net/manual/de/ref.pdo-mysql.php):

$dbconnect = new PDO("mysql:host=$host;dbname=$database", $user, 
   $pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));

请注意未经检查的前端参数:这是SQL注入的一扇门。要么使用这样的预备语句:

$query = $dbconnect->prepare("select * from jobs where Category = :cat");
$query->execute(array(':cat' => $_GET['career']));

或首先转义输入参数:

$cat = $dbhconn->quote($_GET['career']);
$res = dbhconnect->query("select * form jobs where Category = {$cat}")->fetchAll();

答案 1 :(得分:0)

我最终自己搞清楚了。 json本身很好。在某些时候,我完全忘记了通过键值对的每个循环,以便实际显示它们。例如:

$.each(data, function(key,value) {

    var $itemid = value.ItemID;
    var $db = value.DB;
    var $job = value.Job;
    var $recipe = value.Recipe;
    var $level_range = value.Level_Range;
    var $level = value.Level;
    var $grade = value.Grade;
    var $rarity = value.Rarity;
    var $complete = value.Complete;

    $("careerdata table").append("<tr class=\"recipe\" id=\""+$recipe+"\">"

        +"<td>"+$level+$grade+"</td>"

        +"<td class=\"icon\"><a href=\"http://na.finalfantasyxiv.com/lodestone/playguide/db/"+$db+"/"+$itemid+"/\" class=\"eorzeadb_link\"><img style=\"background: url(\'/images/items/"+$job+"/"+$itemid+".png\') 0 1px/42px 42px;\" src=\"/images/items/reflection.png\" /></a></td>"

        +"<td class=\""+$rarity+"\">"+$recipe+"</td>"

        +"<td><input class=\"complete\" type=\"checkbox\" value=\""+$complete+"\"></td>"

    +"</tr>");

});