【问题标题】:Searching Database column for certain numbers在数据库列中搜索某些数字
【发布时间】:2012-10-18 17:24:04
【问题描述】:

我需要一个查询来在数据库中搜索数据库同一列中列出的一组数字中的特定数字。

数据库Access 将包含两列

第一列:页面名称

第二栏:访问

并将设置类似:页面名称:Blog-Admin 访问:60,61,62,76,83,94

其中访问列中的数字是允许查看页面的等级。

在每个页面上,都会有一个查询,用于查找用户排名并将其存储在 $URank 变量中。

每个页面都在一个变量 ($PageName) 中命名,该变量将匹配 Access 数据库中的页面名称列

在此查询中,它需要在 Access 列中搜索该页面的用户排名(页面名称 = $PageName)

通过将其存储在数据库中,管理员可以随时修改谁可以访问哪些页面。

我只需要搜索数据库的查询,以确保用户等级有权访问该页面。

这可能很简单,不确定。

我习惯于查询诸如 mysql_query("select * from database where blahblah=viarable")...所以如果能以这种格式回答,那就太好了。即使它是 mysqli 等价物。

【问题讨论】:

  • 用户登录时是否任意分配排名?如果不是,我不会将用户的排名存储在会话变量中;存储他们的用户 ID(或它的一些抽象),然后从您的用户表中查找他们的排名。
  • 用户排名由管理员分配并存储在我们的用户数据库中。将用户排名排除在外没有问题...在这种情况下,我将首先搜索用户数据库以获取用户排名,然后运行查询以查明该用户排名是否在访问数据库中。我仍然需要访问数据库的查询来查看列是否包含用户排名
  • “数据库将有两列”是什么意思?是否有一个名为Access 有两列PageAccess?你的问题还不清楚。

标签: php mysql admin


【解决方案1】:

编辑:好的,听起来您正在做的是在 Access 列中存储允许排名的 string这是一个非常糟糕的主意。它很难管理,并且需要在 PHP 中进行大量额外的工作。你应该做的是使用 两个 表,结构如下:

create table Pages (
    id int primary key auto_increment,
    name varchar(200)
);

create table Page_access (
    page_id int,
    rank int
);

因此,您将在Pages 表中存储所有页面的列表(仅此而已)。然后,将所有可能的页面 ID 组合(来自Pages 表)和这些页面的可接受用户排名添加到Page_access 表中,因此Page_access 可能看起来像:

|page_id | rank |
|   1    |  60  |
|   1    |  61  |
|   1    |  62  |
|   2    |  70  |
|   2    |  71  |

... 等等。这意味着您的表中可能会出现数百行——没关系!这是一个规范化的表,如果您对列进行索引,性能不会受到影响。

或者,如果你知道你总是会接受一个范围内的排名,你可以像这样构建你的 Page_access 表:

create table Page_access (
    page_id int,
    min_rank int,
    max_rant int
);

然后只需使用 SQL 的between 检查用户的排名是否在页面的最小和最大排名之间。我希望这有助于组织您的表格,但我知道它仍然不能回答您最初的问题(如何编写 SQL 语句)。我建议您先确定一个良好的表结构,然后在您尝试编写实际查询后提出另一个更具体的问题。


原答案:

假设您使用的是mysqli

#connect to your database
$mysqli = new mysqli('localhost', $database_username, $database_password, 'Access');

#prepare and run the query
if($stmt = $mysqli->prepare('select URank from Access where URank = ?')) {
    $stmt->bind_param('i', $URank);
    $stmt->execute();
    $stmt->bind_result($exists);
    $stmt->fetch();

    if($exists) {
        #the URank was found in the table
    } else {
        #not found
    }
    $stmt->close();
}

类似的东西应该可以解决问题。我鼓励您在使用上面的示例之前阅读mysqliprepared statements。在编写数据库查询时,您确实需要了解自己在做什么。

【讨论】:

  • 你的 PDO 链接将指向一个 mysql 页面 =P
  • 这个问题是我不知道如何编写这样的代码。我阅读它没有问题,但修改它并不容易。有没有办法使用常规的 mysql 查询字符串来做到这一点?
  • 这似乎不是在搜索页面名称?对于每个页面,允许不同的用户访问。因此,每个页面都将包含我的查询,以查看是否允许访问该 URank。该数据库将包含 2 列,页面名称和访问权限。对于每个页面名称,某些等级可以访问它
  • 这是一个常规的mysql查询字符串。 mysql_ 函数已被弃用,因为它们不安全。它们已被mysqli_ 函数集所取代,如果使用得当,它们会更加安全。这就是为什么我说在对数据库进行任何操作之前,您需要先了解如何使用 mysqli 和准备好的语句。
  • 所有 mysqli 查询都使用箭头 ex: $stmt->bind_param('i', $URank);因为我从来不习惯。如果是这样,我需要重新开始研究。
猜你喜欢
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多