PHP PDO MYSQL-将数组与查询进行比较并返回结果不在查询结果中的数组的最简单方法


PHP PDO MYSQL - Easiest way to compare array to query and return an array with results not in result of query?

在PHP中,我有一个名为$allFiles的简单数组,类似于:

Array
(
    [0] => test1.csv
    [1] => test2.csv
    [2] => test3.csv
)

在MySQL中,我有一个表,它的值如下:

| ID | PROCESSED |
| 0  | test2.csv |

$allFiles与表进行比较并返回包含以下内容的新数组$newFiles的最简单方法(使用PDO作为连接方法)是什么

Array
(
    [0] => test1.csv
    [1] => test3.csv
)

(这些是MySQL中表中没有表示的文件)

我浏览了手册,但似乎找不到任何与此相关的内容,不过我可能遗漏了一些内容。如有任何意见,我们将不胜感激,谢谢!

没有现成的函数可以做到这一点。大多数时候,你会发现你的问题没有现成的解决方案。您必须自己编写代码,这并不太难:查询数据库以获得所有文件名,用结果创建一个数组,然后获得您所拥有的数组和查询结果之间的差异
一个基本的例子是:

$stmt = $pdo->prepare('SELECT PROCESSED FROM db.table WHERE PROCESSED IN (?,?,?)');
$stmt->execute($allFiles);
$existing = array();
while($row = $stmt->fetch(PDO::FETCH_OBJ))
    $existing[] = $row->PROCESSED;//construct array containing existing values
$notFound = array_diff($allFiles, $existing);
var_dump($notFound);

通过使用$allFiles数组的长度,可以使查询更加动态,并相应地添加?占位符:

$allFiles = array_filter(array_unique($allFiles));//clean array
$placeholders = array_fill(0, count($allFiles), '?');
$stmt = $pdo->prepare(
    'SELECT PROCESSED FROM db.table WHERE PROCESSED IN ('.implode(',', $placeholders).')'
);
//alternative:
$stmt = $pdo->prepare(
    'SELECT PROCESSED FROM db.table WHERE PROCESSED IN ('.
    substr(
        str_repeat('?,',count($allFiles)),//repeat ?, as many times as there are values
        0,-1//remove trailing ","
    ).')'
);
$stmt->execute(array_values($allFiles));//better safe than sorry
//rest is the same as before

这允许您处理任意长度的数组。

PDO从表中返回一个值数组。您可以检查您的结果是否已经在数据库数组中。您可以检查数组键,如果结果已经在PDO数组中,请跳过此结果。如果结果不在PDO数组中,则使用该值构建一个或多个新数组。

注意:PDO为一条记录返回一个数字和文本键。当您检查密钥是否存在时,必须检查您的密钥是否为数字密钥。如果是numeric,跳过那个。

正如评论中的人所说,没有PDO函数可以直接做到这一点。您必须首先收集结果,将它们放在一个数组中,然后使用array_diff()

粗略示例:

$allFiles = ['test1.csv', 'test2.csv', 'test3.csv'];
$con = new PDO('mysql:host=localhost;dbname=DATABASE', 'username', 'password');
$query = $con->query('SELECT PROCESSED FROM table_name');
$db_results = [];
while($row = $query->fetch(PDO::FETCH_ASSOC)) {
    $db_results[] = $row['PROCESSED'];
}
$results = array_diff($allFiles, $db_results);