如何在不执行循环的情况下将数组插入mysql

时间:2019-07-20 10:26:07

标签: php mysql arrays pdo insert

我现在遇到一个问题,我想通过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);

它可以工作,但是只能插入一个数组。解决方案可能很简单,我忽略了一些事情。

2 个答案:

答案 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);
}