[英]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表中未表示的文件)
我已经看过手册,但似乎找不到与之完全相关的任何内容,尽管我可能错过了一些东西。 任何输入将不胜感激,谢谢!
PDO从表中返回一个值数组。 您可以检查结果是否已经在db数组中。 您可以检查阵列键,如果结果已经在PDO阵列中,请跳过此结果。 如果您的结果不在PDO数组中,请使用该值或多个值构建一个新数组。
注意:PDO返回一条记录的数字键和文本键。 当您检查密钥是否存在时,您必须检查密钥是否为数字密钥。 如果是数字,请跳过该数字。
就像评论中的人说的那样,没有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);
没有现成的功能可以执行此操作。 大多数时候,您会发现没有针对您的问题的现成解决方案。 您必须自己编写代码,这并不难:查询数据库以获取所有文件名,使用结果创建一个数组,然后获取所拥有的数组与查询结果之间的差异。
一个基本的例子是:
$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
这样就可以处理任何长度的数组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.