【问题标题】:How to insert an array in a MySQL table with PHP?如何使用 PHP 在 MySQL 表中插入数组?
【发布时间】:2023-03-10 13:40:01
【问题描述】:

我需要使用 PHP 将包含我的用户数据的 JSON 文件迁移到 MySQL 中的一个表中,我已经建立了一个连接,我创建了一个表的数据库,并将 JSON 解码为一个数组。我不能做的是将数组数据插入 MySQL 用户表中。

我的 JSON 如下所示:

{
    "nombre":"asudhau",
    "apellido":"uhsaudhau",
    "pass":"$2y$10$KAg3wt7bBjphgdCNJf4VXe.an8lOnlOvWVdVsh2Qsws0dbhWiDwkO",
    "mail":"usaudha@hotmail.com",
    "sexo":"F",
    "id":34,
    "nacimiento":"2016-10-06"
}
{
    "nombre":"abudasd",
    "apellido":"hasdua",
    "pass":"$2y$10$c781KdL3ERgDCnP6MR28xuf\/dnKjuVajklc0uSj2FnBrZSB1H88Si",
    "mail":"uhasiuda@hotmail.com",
    "sexo":"F",
    "id":35,
    "nacimiento":"1990-02-03"
}
{
    "nombre":"audihaiudh",
    "apellido":"uiahsdiuahdi",
    "pass":"$2y$10$Q7VjafKxt\/kuJS1BrslF0uSZPwHe7Hvp6olMxetgY31KcmMT9dIo2",
    "mail":"hiuahdiuah@hotmail.com",
    "sexo":"F",
    "id":36,
    "nacimiento":"1999-02-03"
}

我通过这种方式获得了每个用户的价值:

$conn = new PDO('mysql:host=localhost;dbname=dh_usuarios;charset=UTF8mb4', 'root', '');
   $jsondata = file_get_contents('../usuarios.json');
   $usuariosArray = explode(PHP_EOL, $jsondata);

    foreach ($usuariosArray as $usuario) {
      $jsondata = json_decode($usuario.PHP_EOL, true);
      $jsonarray[] = array($jsondata);
    }
      foreach ($jsonarray as $row) {

      $nombre = $row[0]['nombre'];
      $apellido = $row[0]['apellido'];
      $pass = $row[0]['pass'];
      $mail = $row[0]['mail'];
      $sexo = $row[0]['sexo'];
      $id = $row[0]['id'];
      $nacimiento = $row[0]['nacimiento'];
}

现在我想将此用户数据插入到我已经在 MySQL 中创建的表中,但我不知道该怎么做。

我试过了,但它只是不插入数据。

$stmt = $conn->prepare('
    INSERT INTO dh_usuarios(nombre, apellido, pass, mail, sexo, id, nacimiento)
    VALUES(:nombre, :apellido, :pass, :mail, :sexo, :id, :nacimiento);
   ');

  $stmt->execute([
    ':nombre' => $nombre,
    ':apellido' => $apellido,
    ':pass' => $pass,
    ':mail' => $mail,
    ':sexo' => $sexo,
    ':id' => $id,
    ':nacimiento' => $nacimiento,
  ]
);

帮帮我我该怎么办? (对不起我的英语不好,我来自阿根廷)

【问题讨论】:

  • 您是否检查了数据库中的错误?
  • 我似乎不是数据库的错误,我想我在某处犯了错误,但我无法弄清楚....
  • 试试var_dump($jsondata)看看你那里有没有东西。
  • 对,有数组
  • 好的。那就试试echo $jsonarray[0]['nombre']...如果没问题,再检查是否有PDO错误。在“执行”之后添加:if (!$stmt) { print_r($conn->errorInfo()); }else{ echo "stmt is ok."; }

标签: php mysql arrays json pdo


【解决方案1】:

有两种方法可以修复您的代码。

1) 修复 JSON 格式(推荐)

您的 JSON 文件无效,您有多个根元素。如果您可以更改它,那将是第一步:

[
    {...},
    {...},
    {...}
]

在您修复 JSON 文件的格式后,您可以简化您的 PHP 代码。以下部分:

$usuariosArray = explode(PHP_EOL, $jsondata);



foreach ($usuariosArray as $usuario) {
    $jsondata = json_decode($usuario.PHP_EOL, true);
         $jsonarray[] = array($jsondata);
    }
}

变成:

$jsonarray = json_decode($jsondata, true);

现在您可以循环遍历数组(请注意[0] 索引已被删除):

foreach ($jsonarray as $row) {
    $nombre = $row['nombre'];
    $apellido = $row['apellido'];
    $pass = $row['pass'];
    $mail = $row['mail'];
    $sexo = $row['sexo'];
    $id = $row['id'];
    $nacimiento = $row['nacimiento'];
}

2) 用正则表达式替换explode

如果您无法修复 JSON 文件的格式,则需要替换 explode(),因为它目前按每一行展开 JSON 文件(您使用行尾字符作为分隔符)。

使用preg_match_all,您可以使用complex (and not bulletproof) regex pattern从无效的JSON文件中检索每个对象:

$pattern = '
/
\{              # { character
    (?:         # non-capturing group
        [^{}]   # anything that is not a { or }
        |       # OR
        (?R)    # recurses the entire pattern
    )*          # previous group zero or more times
\}              # } character
/x
';

preg_match_all($pattern, $jsondata, $matches);

现在您可以遍历您的 $matches 并将它们解码为 JSON:

foreach ($matches[0] as $match) {
  $jsonarray[] = json_decode($match, true);
}

最后一步同上。

【讨论】:

  • 我按你说的改了所有东西,但还是没有把它插入到桌子上……
猜你喜欢
  • 1970-01-01
  • 2018-02-01
  • 2014-04-29
  • 2016-12-21
  • 2011-08-11
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多