首页 > 解决方案 > 插入查询 mysql 抛出 PDO::exec() 恰好需要 1 个参数,给定 2 个

问题描述

我拼凑了一些从互联网上收集的代码:我正在尝试扫描目录以将文件名和索引插入 MariaDB 表。我的最后一个障碍似乎是这个 PDO 错误:PDO::exec() 需要 1 个参数,第 55 行给出了 2 个参数。我已经用“//错误抛出这里”标记了 line(55)。我的新手猜测是它不喜欢在 [] 中转义的参数??

如上所述,这里的新手......非常感谢任何见解/帮助。提前致谢。

<?php

    $host = 'localhost';
    $dbname = 'dirdb';
    $username = 'root';
    $password = '';

    // Create connection
try {
  $conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
  // set the PDO error mode to exception
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  echo "Connected successfully";
} catch(PDOException $e) {
  echo "Connection failed: " . $e->getMessage();
}   

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

$dir = './recipes';

$GLOBALS['I'] = 0; // root folder given index 0

function dirToArray( $dir , $parent) {
    $result = array();
    $cdir = scandir($dir);
    foreach ($cdir as $key => $value) {
        if (!in_array($value, array(".", "..")))  {
            if (is_dir($dir . DIRECTORY_SEPARATOR . $value)){

                $result[$value] = [++$GLOBALS['I']]; // add folder index
                $result[$value][] = $parent; // add parent folder index

                $result[$value][] = dirToArray($dir . DIRECTORY_SEPARATOR . $value, $GLOBALS['I']);
            } else {
                $result[] = $value;
            }
        }
    }
    return $result;
}

$res = dirToArray($dir, $GLOBALS['I']);


function dirToDb($res, $parentId = 0)
{global $conn;
    foreach ($res as $key => $value) {
        if (is_array($value))  {
            $conn->exec ("insert into sp_files (path, parentId) VALUES (?, ?)", [$key, $parentId]);  //error thrown here
            dirToDb($value, $conn->fetch("SELECT LAST_INSERT_ID()"));
        } else {
            $conn->exec ("insert into sp_files (path, parentId) VALUES (?, ?)", [$value, $parentId]);
        }
    }
}

//$res = dirToArray($dir);

dirToDb($res);

标签: phpmysqlpdosql-insert

解决方案


您不能使用$conn->exec()参数执行查询。你必须使用prepare()创建一个语句,然后执行准备好的语句。

也没有$conn->fetch()办法。fetch()PDOStatement类的方法,您可以将其与准备好的语句或查询结果一起使用。但是你不需要执行查询来获取LAST_INSERT_ID(),PDO 有一个insertId()方法。

function dirToDb($res, $parentId = 0) {
    global $conn;
    $stmt = $conn->prepare("insert into sp_files (path, parentId) VALUES (?, ?)");
    foreach ($res as $key => $value) {
        $stmt->execute([$key, $parentId]); 
        if (is_array($value))  {
            dirToDb($value, $stmt->insertId);
        }
    }
}

推荐阅读