Php 检查数据库列中是否存在数组中的所有值

Php 检查数据库列中是否存在数组中的所有值,php,mysql,database,mysqli,Php,Mysql,Database,Mysqli,我有一系列电子邮件,我想通过我的数据库验证所有这些电子邮件是否有效。我想将无效电子邮件(如果有)添加到空数组中。我不太熟悉MySQL,所以我需要一些帮助来完成这项工作。这是我目前在PHP文件中的内容: <?php $conn = mysqli_connect($servername, $username, $password, $db); $conn->select_db($db); if($conn->connect_error) { die("Conn

我有一系列电子邮件,我想通过我的数据库验证所有这些电子邮件是否有效。我想将无效电子邮件(如果有)添加到空数组中。我不太熟悉MySQL,所以我需要一些帮助来完成这项工作。这是我目前在PHP文件中的内容:

<?php

$conn = mysqli_connect($servername, $username, $password, $db);
$conn->select_db($db);

if($conn->connect_error) {
    die("Connection failed " . $conn->connect_error);
}
echo "Connected successfully\n";

$tags = preg_split("/\,/", $_POST['tags']);
$invalidEmails = array();
$count = 0;

$result = $conn->query("SELECT mail FROM dej_colleagues");
for ($i = 0; $i < sizeof($tags); $i++) {
    $trim_brackets = trim($tags[$i], '[]');
    $trim_quotes = trim($trim_brackets, '"');
    
    while ($row = mysqli_fetch_array($result, MYSQL_ASSOC)) {
        if ($trim_quotes == $row["mail"]) {
            $count += 1;
        }
        else {
            array_push($invalidEmails, $tags[i]);
        }
    }
}
if (sizeof($tags) == $count) {
    echo "good";
}
?>


我的数据库连接成功,但即使我的标签数组中的电子邮件存在于数据库中,它也无法检测到它。此外,数据库列有100k个条目,因此如果您知道更有效的方法,请告诉我。

问题可能是,
mysqli\u fetch\u array
在结果中没有更多行时将返回null。这意味着($i=0;$i循环第二次运行时,将找不到任何行,因此
while
循环将不会再次运行

您需要将SQL结果输出到一个常规PHP数组中,这样您就可以重复地循环它们,而不会出现这个问题

例如:

$result = $conn->query("SELECT mail FROM dej_colleagues");
$rows = mysqli_fetch_all($result, MYSQL_ASSOC);

for ($i = 0; $i < sizeof($tags); $i++) {
    $trim_brackets = trim($tags[$i], '[]');
    $trim_quotes = trim($trim_brackets, '"');
    
    foreach ($rows as $row) {
        if ($trim_quotes == $row["mail"]) {
            $count += 1;
        }
        else {
            array_push($invalidEmails, $tags[i]);
        }
    }
}
$result=$conn->query(“选择来自dej_同事的邮件”);
$rows=mysqli\u fetch\u all($result,MYSQL\u ASSOC);
对于($i=0;$i
文件:



注意:可能有比这更有效的方法来搜索数据,但这超出了我的回答范围。

使用
WHERE IN
构建一个语句以获取匹配的邮件,然后比较生成的数组会更有效。 您可以使用
array_diff()
获取数组的差异

<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$conn = mysqli_connect($servername, $username, $password, $db);

echo "Connected successfully\n";

$tags = preg_split("/\,/", $_POST['tags']);
$invalidEmails = array();
$count = 0;

// modify your array how you want it
foreach ($tags as $i => $tag) {
    $trim_brackets = trim($tag, '[]');
    $trim_quotes = trim($trim_brackets, '"');
    $tags[$i] = $trim_quotes;
}

// build placeholders for WHERE IN
$in = str_repeat('?,', count($tags) - 1) . '?';
// prepare query
$stmt = $conn->prepare("SELECT mail FROM dej_colleagues WHERE mail IN ($in)");
// bind an array of values. First params is a type list.
$stmt->bind_param(str_repeat('s', count($tags)), ...$tags);
$stmt->execute();
$results = $stmt->get_result();
// fetch the matching mails into an array
$mails = [];
foreach ($results as $row) {
    $mails[] = $row['mail'];
}

// get the difference between the two arrays
$invalidEmails = array_diff($tags, $mails);

if (count($tags) === count($mails)) {
    echo "good";
}

var_dump($invalidEmails);

注意,当您获取100k条记录时,这将非常缓慢。根据具体情况,您可能会耗尽内存。如果我添加mysqli\u free\u result($result),最好只获取您需要的数据在我的for循环结束后,这会有助于释放一些内存吗?@viktor No,
mysqli_free_result
绝对没有用。请尝试我的优化解决方案,或者使用无缓冲查询,这是一场噩梦。@viktor好的,你的解决方案是这样的xD@Dharman当然,我在回答的最后一部分提到了这一点y试图指出逻辑错误。有没有其他方法让我解包而不是做…$tags?我的php版本不是5。6@viktor你一定是在开玩笑。你能升级到更合理的版本吗?运行这样一个旧版本是不负责任的。使用这样一个旧版本真的很难。你在伤害自己他的应该会有帮助,但请尽快升级。@viktor也尝试离开mysqli。改用PDO。这更容易,特别是考虑到您的PHP版本有多旧。从这里开始&