使用PDO

时间:2016-07-06 18:47:12

标签: php mysql arrays json pdo

我正在尝试将数据从JSON API输入到MySQL数据库中,但是我有一个错误。

这是错误。

  

警告:不能在第8行的C:\ xampp \ htdocs \ simplehtmldom \ example \ scraping \ example_scraping_imdb.php中使用标量值作为数组

     

警告:不能在第9行的C:\ xampp \ htdocs \ simplehtmldom \ example \ scraping \ example_scraping_imdb.php中使用标量值作为数组

     

警告:不能在第10行的C:\ xampp \ htdocs \ simplehtmldom \ example \ scraping \ example_scraping_imdb.php中使用标量值作为数组

     

警告:不能在第11行的C:\ xampp \ htdocs \ simplehtmldom \ example \ scraping \ example_scraping_imdb.php中使用标量值作为数组

     

警告:不能在第12行的C:\ xampp \ htdocs \ simplehtmldom \ example \ scraping \ example_scraping_imdb.php中使用标量值作为数组

     

警告:不能在第13行的C:\ xampp \ htdocs \ simplehtmldom \ example \ scraping \ example_scraping_imdb.php中使用标量值作为数组

     

警告:不能在第14行的C:\ xampp \ htdocs \ simplehtmldom \ example \ scraping \ example_scraping_imdb.php中使用标量值作为数组

     

警告:不能在第15行的C:\ xampp \ htdocs \ simplehtmldom \ example \ scraping \ example_scraping_imdb.php中使用标量值作为数组

这些行是PHP代码中的绑定参数语句。

这是我使用的代码(JSON对象是嵌套的):

<?php

$db = new PDO('mysql:host=localhost;dbname=wtd','root','');
$jsondata = file_get_contents('https://hugo.events/genre/pop/next/200/100');
$data = json_decode($jsondata, true);
$stmt = $db->prepare("insert into events values(?,?,?,?,?,?,?,?)");
foreach ($data as $row) {
    $stmt->bindParam(1, $row['hits']['hits']['_id']);
    $stmt->bindParam(2, $row['hits']['hits']['fields']['name']);
    $stmt->bindParam(3, $row['hits']['hits']['fields']['start']);
    $stmt->bindParam(4, $row['hits']['hits']['fields']['venue.location']);
    $stmt->bindParam(5, $row['hits']['hits']['fields']['description']);
    $stmt->bindParam(6, $row['hits']['hits']['fields']['header']);
    $stmt->bindParam(7, $row['hits']['hits']['fields']['logo']);
    $stmt->bindParam(8, $row['hits']['hits']['fields']['genres']);
    $stmt->execute();
}

编辑:JSON数据样本:

https://ghostbin.com/paste/437q7

希望有人解散。提前谢谢。

1 个答案:

答案 0 :(得分:2)

根据documentation

  

将PHP变量绑定到相应的命名或问号   占位符在用于准备的SQL语句中   声明。与PDOStatement :: bindValue()不同,变量绑定为   参考,只会在当时进行评估   调用PDOStatement :: execute()。

您需要创建自变量列表以将它们绑定到语句中:

foreach ($data as $row) {
    $v1 = $row['hits']['hits']['_id'];
    $v2 = $row['hits']['hits']['fields']['name'];
    $v3 = $row['hits']['hits']['fields']['start'];
    ...
    $stmt->bindParam(1, $v1);
    $stmt->bindParam(2, $v2);
    $stmt->bindParam(3, $v3);
    ...
    $stmt->execute();
}

或者您可以尝试使用bindValue代替:

foreach ($data as $row) {
    $stmt->bindValue(1, $row['hits']['hits']['_id']);
    $stmt->bindValue(2, $row['hits']['hits']['fields']['name']);
    $stmt->bindValue(3, $row['hits']['hits']['fields']['start']);
    ... 
    $stmt->execute();
}

更新在审核了json后,我提供的内容并不多。    我不知道您的期望是什么,但您可能无法对该数据进行foreach ($data as $row) {

您可以使用数据here

为了获得_id你应该致电:

$data[1]['hits']['hits'][1]['_id'];

要获得fields,您需要:

$data[1]['hits']['hits'][0]['fields'];

可能您使用的数据与此处发布的数据不同。

更新2 SO不是为您开发的。请下次再尝试做作业。但是我猜你正在寻找here

foreach ($data[1]['hits']['hits'] as $row) {
    $v1 = $row['_id'];
    $v2 = $row['fields']['name'][0];
    $v3 = $row['fields']['start'][0];
    ....
}