我现在遇到一个问题,我想通过pdo向我的数据库插入一个带有准备好的语句的数组。我从这里开始找到了一些代码,但是目前它仅在$ files数组中插入一个文件,该文件将传递给该方法。
$amount = count($files);
for($i=0; $i<$amount; $i++){
$dbArr=[
'path' => (string) dirname( $files[$i] ),
'name' => (string) basename( $files[$i] ),
'size' => (int) filesize($files[$i]),
'mimeType' => (string) mime_content_type( $files[$i] ),
];
}
foreach($dbArr as $k => $v ) {
$prep[':'.$k] = $v;
}
new sql();
$q = sql::$db->prepare($str = "INSERT INTO filesSrc ( " . implode(', ',array_keys($dbArr)) . ") VALUES (" . implode(', ',array_keys($prep)) . ")");
$res = $q->execute($prep);
它可以工作,但是只能插入一个数组。解决方案可能很简单,我忽略了一些事情。
答案 0 :(得分:1)
$sql = 'SELECT name FROM items';
try {
$stmt = $pdo->query($sql);
for ($i=0; $i<3; $i++) {
$row = $stmt->fetch();
echo($row['name']);
}
$stmt = null;
}
catch (PDOException $e) {
print $e->getMessage();
}
答案 1 :(得分:1)
除非您要插入数千行,否则我将在事务中使用一条准备好的语句将它们逐个插入。
$q = sql::$db->prepare("
INSERT INTO filesSrc (path, name, size, mimeType)
VALUES (:path, :name, :size, :mimeType)
";
sql::$db->beginTransaction();
foreach ($files as $file) {
$q->execute([
'path' => (string) dirname($file),
'name' => (string) basename($file),
'size' => (int) filesize($file),
'mimeType' => (string) mime_content_type($file),
]);
}
sql::$db->commit();
如果您确实要执行批量插入(单个多行插入),那么我将使用?
作为占位符:
$values = [];
$params = [];
foreach ($files as $file) {
$values[] = '(?,?,?,?)';
$params[] = (string) dirname($file);
$params[] = (string) basename($file);
$params[] = (int) filesize($file);
$params[] = (string) mime_content_type($file);
}
$values = implode(',', $values);
$q = sql::$db->prepare("
INSERT INTO filesSrc (path, name, size, mimeType)
VALUES ($values)
";
$res = $q->execute($params);
要使用命名参数代替?
,请将for循环更改为:
foreach ($files as $k => $file) {
$values[] = "(:path_{$k}, :name_{$k}, :size_{$k}, :mimeType_{$k})";
$params['path_{$k}'] = (string) dirname($file);
$params['name_{$k}'] = (string) basename($file);
$params['size_{$k}'] = (int) filesize($file);
$params['mimeType_{$k}'] = (string) mime_content_type($file);
}