php - 插入查询 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);
解决方案
您不能使用$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);
}
}
}
推荐阅读
- c# - 表单最大化后如何修复控件位置
- linux - 如何从在 Linux 上运行的 .NET Core 应用程序对 Windows 域用户进行身份验证
- python - 如何成功编译 python 3.x
- sql - 在删除语句postgresql中使用partition by子句
- python - 如果满足条件,则获取列表列表的最大元素
- automated-tests - 仅在一次测试中禁用赛普拉斯中的网络安全
- wiremock - 我可以将 Spring Cloud Contract 定义为代理,并且只为端点子集制作存根吗?
- c++ - '--p' 如何在 for(p=&(*L).elem[(*L).length-1];p>=q;--p) 中工作?
- c++ - 我应该在 ECS 中使用静态类吗?
- python - 计算每个 bin 中的值数:Python