从数据库中选择WHERE somefield包含其中一个值

时间:2015-01-31 09:30:14

标签: php mysql sql mysqli

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

$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可以包含多个代码,用空格分隔:123456 654321 0101020304。

如果找到 ANY 这些代码,我仍然可以检索用户数据。

我可以使用查询执行此操作,还是需要使用php?

此致 中号

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

$codes = "123456 654321 0101020304";
$expCodes = explode(" ", $codes);

$code = implode("', '", $expCodes);

$sql = "SELECT * FROM users WHERE access_codes IN ('{$code}') ";
// do your query