【问题标题】:NULL with MySQL, PHP, JSON and JavaScriptMySQL、PHP、JSON 和 JavaScript 为 NULL
【发布时间】:2015-12-31 18:22:43
【问题描述】:

我经常有一些 JavaScript 从服务器的数据库中接收数据并将其呈现在页面上。

$.getJSON( 'ajax.php',{id:$('bla').val()}, function(json) {
    $('#myClone').clone().removeAttr('id').text('json.a').appendTo(whatever)
});

ajax.php

$sql='SELECT a,b,c FROM t WHERE id=?';
$stmt = $conn->prepare($sql);
$data=array($_GET['id']);
$stmt->execute($data);
header('Content-Type: application/json;');
echo(json_encode($stmt->fetchAll(PDO::FETCH_ASSOC)));

当数据库包含给定列的 NULL 并且关联的 JSON 包含不带引号的 null 时出现问题,HTTP 传输的 JSON 字符串仍然带有 null 不带引号,但 JavaScript/jQuery 似乎可以转换它转换成字符串"null",页面上显示null,而不是所需的空字符串。

如何最好地纠正这个问题?应该做服务器端还是客户端?如果是服务器端,应该在数据库级别使用SELECT IFNULL(a,"") 之类的东西完成,还是 PHP 应用程序级别?

【问题讨论】:

  • “最佳”是情境性的。选择适合你的。
  • @JohnHascall 这就是我在问题中包含这种情况的原因。包含文本的元素被附加到另一个元素。
  • 这对我来说听起来像是一个客户端错误,所以我的第一次尝试是在客户端解决它。
  • @user1032531 情况通常更复杂。你有多少控制权?例如,当我控制 DB 模式时,我会寻求没有空值的设计。
  • @JohnHascall 我有完全的控制权。我通常只对 FK 列和其他特殊情况强制使用无空值。

标签: javascript php jquery mysql json


【解决方案1】:

在数据库级别执行此操作将是最好的。不在数据库级别执行此操作的唯一原因是,如果您可以预见到该特定数据库查询的其他用户或更高级别的用户需要区分空字符串“”和 null 的任何情况。

在 JavaScript 显示级别执行查询可能不是一个好主意,因为可能会忘记在特定输出位置添加此检查或代码,并且会在此处显示 null。此外,从数据库到显示的每个阶段都会传输额外的字节,并且最终用户的CPU正在处理请求,而不是您真正快速的MySQL,这会影响加载时间。

考虑一个有 100 万个条目的场景。您将在 MySQL(一种为效率优化的语言)中进行 100 万次检查,而不是从数据库到 PHP 的 100 万次“null”传输(额外的 200 万字节),从 PHP 到页面的 100 万次“null”传输(额外的 200 万字节),以及在客户端用 JavaScript(一种效率不高的语言)进行 100 万次检查。

【讨论】:

  • 让我仔细考虑一下。谢谢。
【解决方案2】:

使用条件表达式:

$.getJSON( 'ajax.php',{id:$('bla').val()}, function(json) {
    $('#myClone').clone().removeAttr('id').text(json.a === null ? '' : json.a).appendTo(whatever)
});

但我可能会选择您在问题中提到的服务器端解决方案。

【讨论】:

  • 谢谢 Barmar,我认为您通常建议在客户端执行此操作。我宁愿使用用户的资源而不是服务器的资源,所以在这方面同意它。不知道是否有办法最小化服务器脚本。猜猜可以使用一个函数...
  • 另一个考虑因素是有多少客户端使用此数据。如果您在服务器上“修复”它,所有客户端(当前和未来)都将“修复”。
  • 请问您为什么要使用服务器端解决方案?
  • 我通常喜欢在流程中尽早规范化数据。
猜你喜欢
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多