在数据库中查找重复条目-PHP

时间:2018-10-18 07:13:18

标签: php sql

我想在执行任何其他查询之前检查数据库中是否存在相同的token。为此,我从数据库表中提取了所有行并将其存储在array中。

if (isset($_POST['token']) && !empty($_POST['token'])){
    $token_raw = $_POST['token'];
}

$sql_result = mysqli_query($connection, "SELECT * FROM used_tokens");
if ($sql_result != NULL) {
    while ($sql_result_rows = mysqli_fetch_assoc($sql_result)) {
        $used_tokens = [$sql_result_rows['used_tokens']];
        $date_used = [$sql_result_rows['date_used']];
    }
}
if ($token_raw === $used_tokens) { //I think something is wrong here...
    echo 'Incorrect Token Used.';
}
else {
    $submit_sql = "INSERT INTO used_tokens (used_tokens) VALUES ('$token_raw')";
    if ($connection->query($submit_sql) === TRUE) {
        echo "New record created successfully";
    } else {
        echo "Error: " . $submit_sql . "<br>" . $connection->error;
    }
    //$sqli = mysqli_query($connection, $conn);
}

我认为我通过检查array而误解了if ($token_raw === $used_tokens)部分。请为此提供最佳实践建议,也请向我提出建议。

1 个答案:

答案 0 :(得分:-1)

到目前为止 $token_raw-是令牌字符串 $used_tokens-是已使用令牌的数组

如果您想知道此令牌是否曾经使用过,则必须使用in_array()函数。

if (in_array($token_raw, $used_tokens)) ...

但是,这个想法通常不好。 您不应该选择所有令牌将它们存储在查询中。 因为,如果数据集会变大-这会导致操作缓慢并占用大量内存。

您应该通过添加条件WHERE来编辑SQL查询。

示例:

$sql = '`SELECT * FROM `used_tokens` WHERE `used_tokens` = "%s"';
mysqli_query(
    $connection,
    sprintf(
        $sql,
        mysqli_real_escape_string(
            $connection,
            $token_raw
        )
    )
)

;