【问题标题】:Why is my json data not being INSERTed into mySQL database?为什么我的 json 数据没有被插入到 mySQL 数据库中?
【发布时间】:2017-04-09 06:47:01
【问题描述】:

我创建了一个 PHP 处理程序来接收来自 POST 请求的 JSON 有效负载,然后将其插入到 phpMyAdmin 中的数据库中。我不确定为什么这不起作用。

JSON:

payload = {  
    "version":"1.0",
    "event":"video_recorded",
    "data":{
        "videoName":"vs1457013120534_862",
        "audioCodec":"NellyMoser ASAO",
        "videoCodec":"H.264",
        "type":"FLV",
        "orientation":"landscape",
        "id":"0",
        "dateTime":"2016-03-03 15:51:44",
        "timeZone":"Europe/Bucharest",
        "payload":"111.111.111.11",
        "httpReferer":"http://site_from_where_video_was_recorded.com"
    }
}

我从在线教程中获得的 PHP 代码。该教程是从 2017 年开始的,所以我假设一切都是最新的,但它仍然无法正常工作:

<?php

/* db variables */

$dbhost = 'localhost';
$dbname = 'name_db';
$dbuser = 'user_db';
$dbpass = 'pass_db';

/* grab the json */

$data = $_POST['payload'];

/* put json into php associative array */

$data_array = json_decode($data);

/* store in PHP variables */

$ip_address = $data_array['data']['payload'];
$vid_name = $data_array['data']['videoName'];
$date_time = $data_array['data']['dateTime'];
$time_zone = $data_array['data']['timeZone'];

/* connect to mysql db */

$con = mysql_connect($dbuser, $dbpass, $dbhost) or die('Could not connect: ' . mysql_error());

/* select the specific db */

mysql_select_db($dbname, $con);

/* insert the values into the db */

$sql = "INSERT INTO ip_and_videos(IpAddress, VideoName, DateTime, Timezone) VALUES('$ip_address','$vid_name','$date_time','$time_zone')";

if(!mysql_query($sql,$con))
{
    die('Error : ' . mysql_error());
}

?>

我将主键设置为 int 并使其自动递增。如果我理解正确,我不需要在该列中插入任何内容,因为它每次都会分配一个数字。还是在 INSERT 其他变量时还需要传递它?

【问题讨论】:

  • 停止使用 mysql 扩展。您的代码对 sql 注入开放。
  • 好的,我会调查的。知道为什么它不能按原样工作吗?
  • 没有。您不必通过,因为主键是自动递增的。用您的错误更新您的问题。并在代码的开头启动 error_reporting(E_ALL) 以便如果发生任何其他错误,我们也可以解决。
  • 老实说,我什至不知道如何解决这个问题,php 新手。错误会显示在 chrome 上的开发工具控制台中吗?
  • @ChaceMcguyer:请检查答案并让我们知道...还要注意您的查询,让它呼吸,因为您在它的部分之间缺少一些空格 -> ip_and_videos( 和 VALUES(

标签: php mysql json database webhooks


【解决方案1】:

这适用于数组部分,你会得到正确的答案。因此,您的代码还不错,但您应该检查所有错误(如 Bhavin 在评论中所述)。而且我很确定您有错字 -> $vid_name = $data_array['data']['videName']; 类似于 $vid_name = $data_array['data']['videoName'];因此,error_reporting 会很有帮助,然后检查查询是否有其他错误(准备好的语句^^)

<?php

error_reporting(E_ALL);
ini_set('display_errors', 1);

$payload = '{  
          "version":"1.0",
          "event":"video_recorded",
          "data": {
              "videoName":"vs1457013120534_862",
              "audioCodec":"NellyMoser ASAO",
              "videoCodec":"H.264",
              "type":"FLV",
              "orientation":"landscape",
              "id":"0",
              "dateTime":"2016-03-03 15:51:44",
              "timeZone":"Europe/Bucharest",
              "payload":"111.111.111.11",
                "httpReferer":"http://site_from_where_video_was_recorded.com"
          }
      }';

$data_array = json_decode($payload, true);

/* store in PHP variables */

$ip_address = $data_array['data']['payload'];
$vid_name = $data_array['data']['videoName'];
$date_time = $data_array['data']['dateTime'];
$time_zone = $data_array['data']['timeZone'];

echo"[ $ip_address / $vid_name / $date_time / $time_zone ]";

// EDIT : added query

include"config.inc.php";

// connect to DB
$mysqli = mysqli_connect("$host", "$user", "$mdp", "$db");

if (mysqli_connect_errno()) { echo "Error connecting : " . mysqli_connect_error($mysqli); }

$query = " INSERT INTO ip_and_videos (`IpAddress`, `VideoName`, `DateTime`, `Timezone`) VALUES (?,?,?,?) ";
$stmt = $mysqli->prepare($query);

print_r($stmt->error_list);

$stmt->bind_param("ssss", $ip_address, $vid_name, $date_time, $time_zone );

if (!$stmt->execute()) { echo $stmt->error; } else { echo"true"; }

?>

【讨论】:

  • @ChaceMcguyer:你试过了吗?运行它时我的代码是否有任何错误?如果是,它们是什么?编辑:只是代码,页面上没有其他内容,但请为 DB 提供参数
  • 我仍在努力解决这个问题。我下载了 Aptana 并设置了 ftp。现在,当我尝试运行代码时,它会一直打开 Firefox,甚至不会显示回显。
  • 当我转到我的处理程序的 url 时得到这个 `Column 'IpAddress' cannot be null`
  • mysql 错误告诉你你的 'IpAddress' 列需要插入一些数据 -> 行 echo"[ $ip_address / $vid_name / $date_time / $time_zone ]";显示所有 4 个 $vars ?有空吗? (注意:在我自己的在线数据库中运行这个脚本就像一个魅力)
  • 不,由于某种原因,我什至没有得到变量。我将 json 保存在有效负载变量和所有内容中。 hello[ / / / ]Array ( ) Column 'IpAddress' cannot be null
【解决方案2】:

不确定您是否有同样的问题,但这对我不起作用...

$vid_name = $data_array['data']['videName'];

我不得不使用

$vid_name = $data_array->data->videoName;

不能将 stdClass 用作数组。

【讨论】:

  • 你从哪里得到有效载荷?我应该使用 $data_array 吗?
  • 对不起,我在我的机器上开发的示例中使用了有效负载...我进行了编辑。
  • 嗯,当我查看数据库时,仍然会收到MySQL returned an empty result set (i.e. zero rows). (Query took 0.0002 seconds.)。 JSON 将发送给我的处理程序,所以这一定是问题
  • mysql_select_db 也被弃用了
【解决方案3】:

这样应该会更好

<?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

/* db variables */

$dbhost = 'localhost';
$dbname = 'name_db';
$dbuser = 'user_db';
$dbpass = 'pass_db';

/* grab the json */

$data = $_POST['payload'];

/* put json into php associative array */

$alldata = json_decode($data,true);
print_r($alldata);

/* connect to mysql db */

$con = mysql_connect($dbuser, $dbpass, $dbhost) or die('Could not connect: ' . mysql_error());

/* select the specific db */

mysql_select_db($dbname, $con);

/* insert the values into the db */
foreach($alldata as $data_array) {

$ip_address = $data_array['data']['payload'];
$vid_name = $data_array['data']['videoName'];
$date_time = $data_array['data']['dateTime'];
$time_zone = $data_array['data']['timeZone'];

$sql = "INSERT INTO ip_and_videos(IpAddress, VideoName, DateTime, Timezone) VALUES('".$ip_address."','".$vid_name."','".$date_time."','".$time_zone."')";
mysql_query($sql);
echo mysql_errno($con) . ": " . mysql_error($con) . "\n";
}

?>

希望对你有帮助

【讨论】:

  • 数据库中仍然没有任何内容
  • @ChaceMcguyer 了解发生了什么,我更新了代码,它应该会抛出一些错误
  • 所以我在下面的 OldPadawans 代码中收到“列 'IpAddress' 不能为空”错误。我试试这个。
  • @ChaceMcguyer 也应该将 videName 固定为 videoName
猜你喜欢
  • 1970-01-01
  • 2019-05-03
  • 2013-06-22
  • 2014-09-07
  • 2016-04-25
  • 1970-01-01
  • 2012-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多