从数据库 WHERE 中选择某个字段包含其中一个值


Selecting from database WHERE somefield contains one of the value

我有一个直截了当的脚本,如果访问代码正确,它会返回用户数据。

$sql = "SELECT * FROM users WHERE access_codes = '$CODE' ";
$rs = $mysqli->query($sql);
$rows = mysqli_num_rows($rs);
if ($rows == 1) {
    //CODE IS FOUND, RETURN USERNAME AND PASSWORD
    $row = mysqli_fetch_array($rs);
    $username = $row['username'];
    $password = $row['password'];
    mysqli_close($mysqli); // Closing Connection
    header("Location: http://GOTONEXTPAGE.COM");
    die();
} else {
    //CODE IS NOT FOUND
    mysqli_close($mysqli); // Closing Connection
    exit;
}

如果access_codes仅包含 1 个值,则它可以正常工作。

但我想实现的是,access_codes可以包含多个代码,用空格 ex: 123456 654321 0101020304 分隔。

如果找到这些代码中的任何一个,我仍然可以检索用户数据。

我可以用查询来做到这一点,或者我需要用 php 来解决吗?

问候米

最好规范

化架构。制作一个访问代码表,其中每个userIDaccess_code组合都有一行。然后,您可以在此表和users表之间使用JOIN来获取具有特定访问代码的用户。

如果无法重新设计,可以使用正则表达式:

$sql = "SELECT * FROM users WHERE access_code RLIKE CONCAT('[[:<:]]', ?, '[[:>:]]')";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('s', $CODE);
$stmt->execute();

[[:<:]][[:>:]] 匹配单词边界,因此仅当代码是列中的整个单词时,才会匹配。

$codes = "123456 654321 0101020304";
$expCodes = explode(" ", $codes);
$code = implode("', '", $expCodes);
$sql = "SELECT * FROM users WHERE access_codes IN ('{$code}') ";
// do your query