【问题标题】:Imploding in PHP an array from Json在 PHP 中内爆来自 Json 的数组
【发布时间】:2013-08-31 20:36:42
【问题描述】:

我有一个如下所示的 JSON:

{
"num_found": 407343,
"results": [
    {
        "speaker_state": "LA",
        "speaking": [
            "ABC",
            "DEF",
            "GHI"
        ],
        "speaker_party": "D",
    },

等等。我正在尝试将这些数据解析到 MySQL 数据库中。我修改了以下 php 代码:

<?php

$hostname_ndb = "localhost";
$database_ndb = "senate";
$username_ndb = "root";
$password_ndb = "root";
$ndb = mysql_pconnect($hostname_ndb, $username_ndb, $password_ndb) or trigger_error(mysql_error(),E_USER_ERROR); 
mysql_select_db($database_ndb);

$url = "http://xxx.yyy/text.json";
$json = file_get_contents($url);

$out = json_decode($json, true);

foreach($out["results"] as $results) { 
$speaker_state = $results['speaker_state']; 
$speaking2 = $results['speaking'];
$speaking = implode('', $speaking2);
$date = $results['date'];

mysql_query("INSERT INTO speeches (speaker_state, speaking, date ) VALUES('$speaker_state', '$speaking','$date')") or die (mysql_error()); 

}

?> 

数组中有一个数组,这似乎是问题所在。该脚本不起作用,数据未存储在数据库中。该脚本返回错误“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'speaking, date,' 附近使用正确的语法。

PHP 日志在 php 日志中显示一条通知:“PHP Notice: Array to string conversion in /Applications/MAMP/htdocs/json.php on line 46”。

var_dump($speaking2) 返回:

array(3) { [0]=> string(713) "XXX" [1]=> string(891) "ZZZ" [2]=> string(1189)

等等。 你会建议我如何调整这个脚本以使其工作?

【问题讨论】:

  • 1.是通知,不是错误 2. 显示var_dump($speaking2)
  • 我用更多信息更新了我的问题。
  • 离题,但请注意mysql_xx() 函数已弃用,不鼓励使用。您应该考虑切换到支持更好的数据库 API,例如 PDO 库。
  • echo 您的查询文本,看看其中有什么问题。例如,尝试在 phpmyadmin 中执行此查询。
  • 我不确定如何回显查询。新手在这里。

标签: php mysql arrays json


【解决方案1】:

您的 SQL 语法有错误;查看与您的 MySQL 服务器版本相对应的手册,了解在第 1 行使用“说话,日期”附近的正确语法。

出现此错误的原因是您使用date 作为字段名称。

date是SQL中的保留字,作为字段名或表名使用会报错。

理想情况下,您不应在数据库表或字段名称中使用 SQL 保留字,但如果这样做,您需要将名称包含在反引号中,以便 mySQL 接受它们。 (事实上​​,一般建议对所有字段名和表名都这样做;不是强制性的,但很好的做法)

所以你的查询应该是这样的:

INSERT INTO `speeches` (`speaker_state`, `speaking`, `date`) VALUES ('$speaker_state', '$speaking','$date')

我还要注意,您似乎并没有转义您的输入数据。您应该使用mysql_real_escape_string() 来转义您放入查询中的任何变量(即$speaker_state$speaking$date)。不这样做可能会导致错误,并且您的网站容易被黑客入侵。

(另请注意,mysql_xxx() 函数已被弃用;理想情况下,您应该使用一组不同的数据库函数,在这种情况下,将有不同的方法来转义变量,但就目前情况而言,您需要使用 @ 987654329@)

PHP 注意:/Applications/MAMP/htdocs/json.php 第 46 行中的数组到字符串转换

这与 mySQL 错误完全无关。它可能仍然是一个可能仍需要调查的问题,但这不是您所询问的 SQL 错误的原因。

如果不知道哪一行是第 46 行,我无法确定,但这里可能发生的是传入的 JSON 字符串为您放入 SQL 字符串的三个变量之一生成一个数组。您将它们视为字符串,但其中一个不是字符串。这可能会导致数据损坏,因此您应该调查一下。如果没有看到实际的 JSON 字符串,我无法说出更多信息,但您应该使用 print_r()var_dump() 来检查变量的内容。

希望对您有所帮助。

【讨论】:

  • 非常感谢您的回答。我添加了后括号。现在的错误是:“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以获取正确的语法以使用 near 的健康、高等教育的扩展访问、我们国家 vete 的担忧”第 1 行”,这是一段文本,是变量“speaking”的一部分。您确定“说话”是一个数组这一事实在 MySQL 查询中没有问题吗?
  • @user1029296。如果您在应该是 content 的范围内遇到 MySQL 错误,则进一步证明您没有正确转义内容。你应该这样做。 (mysql_real_escape_string 或(更好)mysqli_real_escape_string 是你的朋友。)
  • 下一个错误的原因是您没有遵循我关于转义输入变量的建议。文本包含引号字符,必须转义。
  • @TRiG - 转义函数的选择取决于他用于查询等的 DB 函数的选择。你不能混合和匹配。 (嗯,我想你可以,但这不是一个好主意)。理想情况下,他应该改用更好的数据库 API,但我觉得让他改用可能很困难。
  • 是的。同意。抱歉,我不是很清楚。我只是想重申您的建议,即从 mysql_* 函数转移到 mysqli_* 函数,但我的写作并不像应有的那样清晰。 @user1029296。 mysqli_* 一般而言更好,mysql_* 功能已弃用,很快将被删除。
猜你喜欢
  • 2019-07-26
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 2011-03-17
  • 2022-01-01
相关资源
最近更新 更多