【问题标题】:Cannot use a scalar value as an array while using PDO [duplicate]使用 PDO 时不能将标量值用作数组 [重复]
【发布时间】:2016-11-08 22:50:56
【问题描述】:

我正在尝试将 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 中将标量值用作数组

所有这些行都是 P​​HP 代码中的绑定参数语句。

这是我使用的代码(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

希望有人有解决方案。提前致谢。

【问题讨论】:

  • 我对 PDO 很陌生,所以我不明白他们的意思
  • 与其说“你必须访问这个 URL”,不如发布一个数据样本?
  • 已编辑。它有一个例子 niw

标签: php mysql arrays json pdo


【解决方案1】:

根据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'];

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

UPDATE 2 所以不是为你开发的。下次请尽量先做功课。但我猜here 就是你要找的东西:

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

【讨论】:

  • 它摆脱了错误,但现在我有一个新错误:注意:未定义索引:_id in
  • 所以现在您应该检查从 json 返回的数组数据。或者可能只是$row['hits']['hits']['fields']['_id']
  • _id 不在字段对象中。它为所有行显示它们
  • 提供完整的 json 示例。您发布的内容不完整,无法讨论。
  • 添加了 ghostbin 链接。 Json 太长了
猜你喜欢
  • 2011-12-02
  • 2019-12-17
  • 2014-07-11
  • 2014-02-26
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多