【问题标题】:JSON not encoding as json or UTF-8?JSON 不编码为 json 或 UTF-8?
【发布时间】:2017-06-28 00:15:52
【问题描述】:

我对 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 变量,它不能独立工作)。

【问题讨论】:

  • Soo.... 第一个明显的问题是“您是否检查了 PHP 文件中 $result 中的内容”,因为如果它是空的,那么 json_encode($result); 将同样是空的。当然,在这种情况下,stackoverflow.com/questions/279170/utf-8-all-the-way-through 是您需要阅读的内容。
  • 它不是空的,它打印得很好。问题是 AJAX 调用得到的响应。无论如何,我最终自己弄清楚了。

标签: php jquery json ajax utf-8


【解决方案1】:

似乎 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();

【讨论】:

  • 这是我尝试过的事情之一,然后又尝试了一次,但这些选项都不起作用。
  • 您的 SQL 是否有可能产生错误?您是否尝试在查询后立即转储 PDO 错误信息? (例如 var_dump($dbconnect->errorInfo());)
  • 还有:你为什么使用准备好的语句,而不是使用单个准备好的参数?如果您尝试 $dbhconnect->query(...)->fetchAll() 会怎样?
  • 我所有的阅读都说准备好的语句更安全。话虽如此,我将其更改为 $result = $dbconnect->query("select * from jobs where Category = '" . $_GET['career'] . "'")->fetchAll(PDO::FETCH_ASSOC); json_encode($result);现在我得到一个解析器错误。会再修补它一些..
  • 我认为有一个误解 - 请在此处阅读 PHP 中的准备语句:php.net/manual/en/pdo.prepared-statements.php 准备语句需要使用一些替换/占位符变量而不是“真实的”纯字符串值。 - 在上面的原始文本中查看我的编辑。
【解决方案2】:

我最终自己弄清楚了。 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>");

});

【讨论】:

  • 实用提示:您可以先使用 jquery 为您构建整个表格,然后在需要的地方注入您的值:var row = $("&lt;tr class='recipe'&gt;&lt;td&gt;&lt;/td&gt;&lt;td class='icon'&gt;.........&lt;/tr&gt;); row.id = $recipe; var cols = $("td"); $(cols[0]).text($level + $grade); $(cols[1]....... 等。虽然更好的解决方案是使用一个小模板,然后只填充在(那里有很多 jquery 模板解决方案)
猜你喜欢
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
相关资源
最近更新 更多