在mySQL查询返回的字符串上使用json_encode时出错

时间:2016-09-14 03:28:36

标签: javascript php json

我正在尝试使用json_encode传递一个数组,该数组是mySQL PDO查询从php到javascript的结果。

但是,如果其中一个字段包含空格,或者,如果我尝试在字符串上使用数据库函数(仅选择第一个非空格部分),则该对象似乎不存在,并且我的代码无法编译

以下是已执行的代码:

<?php
  $sql = "SELECT id, substring_index(firstNames, ' ', 1) as firstName, lastName, gender, idPersonFather, idPersonMother
  FROM a_person";

  $result = $db->query($sql);
  while ($row = $result->fetch(PDO::FETCH_ASSOC)){ 

  $personArray[$row['id']] = Array(     'firstName' => $row['firstName']
                                    , 'lastName' => $row['lastName']
                                    , 'gender' => $row['gender']
                                    , 'idFather' => $row['idPersonFather']
                                    , 'idMother' => $row['idPersonMother']);
}
?>

<html>
...
<script type="text/javascript" src="js/includes/grid_classes.js">

  var personArray=<?php echo json_encode($personArray); ?>//get php aray
  var someNextStuff
  ...etc

这将导致错误     Uncaught SyntaxError: Unexpected token var 因为行var someNextStuff出现意外,显然该对象被翻译成空字符串?

此外,以下选择会导致同样的问题:

$sql = "SELECT id, firstNames, lastName, gender, idPersonFather, idPersonMother
FROM a_person";

firstNames包含像#Anna; Maria Cecilia&#39;和NULL这样的值。

SQL查询直接在数据库上工作(在phpmyadmin中)。

但是,如果我从select和数组中省略firstNames字段,代码运行正常。

导致这种情况的原因是什么?

感谢您的帮助..

编辑:

我现在发现了

SELECT id, substring_index(coalesce('Maria anna blah','?'), ' ', 1) as firstName, <rest of fields>

有效,但

SELECT id, substring_index(coalesce(firstNames,'?'), ' ', 1) as firstName, <rest of fields>

没有。

所以它必须是那个领域的东西,我猜......

2 个答案:

答案 0 :(得分:1)

如果您查看json_last_error_msg的输出(或只是json_last_error,如果您使用的是旧的PHP版本,那么在这种情况下,您将只获得一个需要与常量匹配的整数) ,您将收到以下错误之一:

  

控制字符错误,可能编码错误

  

格式错误的UTF-8字符,可能编码错误

当您尝试将UTF-8数据存储在未使用UTF-8编码的数据库中时,您发现的两个奇怪的字符(Ã和unprintable)会发生这种情况。

您可以尝试通过在可能包含unicode字符的每个数据上调用utf8_decode来解决此问题。

但是,解决此问题的最佳方法是确保您的数据库使用的是UTF-8。

答案 1 :(得分:0)

好吧,我觉得那个领域的其中一行确实是假值! (感谢Jakumi)

耐心地从有序选择向阵列添加更多行,直到失败,并且在添加带有firstnames Ãline的记录时会发生这种情况。 复制粘贴我刚刚发现,在... 0089之后有一个不可读的字符......无论是什么...... HEX c289 然而,仅仅在Ã字符之后移除值是不够的,似乎我的字符集可能太有限了。但是我怀疑这是脏数据,因此它将返回源而不是我扩展字符集..