在PHP中从MySQL查询创建简单数组


Create simple array from MySQL query in PHP

对于那些不想阅读非常详细和具体的信息的人来说,最简单的基本问题是:

  • 如何从SQL查询中获取多维数组把它转换成简单明了的东西诸如以下信息:array(1,2,3,4,5,6,7,8,9)

如何从PHP中的SQL查询创建一个简单的一维数组,比如员工id?

这更多的是为了我的理解,而不是为了实时代码。我一直在玩php和MySQL,我的大脑想出了一个我觉得合乎逻辑的想法来尝试。我会在脑子里把它分解,这样你就能明白我是从哪里来的。

目标:允许员工登录网站的私人部分

逻辑推理:

  • 1.)创建连接到数据库的脚本(完成)
  • 2.)检查外部I.P.是否与业务I.P.匹配或不同?假设静态I.P.(完成)
  • 3.)如果I.P.匹配,则继续动态创建一个员工姓名下拉列表以供选择,并将"emp_id"存储为值然后通过GET(完成)
  • 4.)如果I.P.不匹配,请出示登录表格。验证后,将$ip设置为等于业务I.P.,然后进入下拉列表(完成)
  • 5.)一旦选择了姓名,就进入员工区域的主页面。(完成)
  • 6.)验证员工是否真实存在,并确保URL未被篡改(问题)

现在我意识到这不是最安全或最好的路线,但我想明白为什么我的推理不起作用。我希望验证这一点的原因是,员工列表是动态的,老员工不能只在url的user="emp_id"部分键入id就可以访问。如果使用硬编码数组来存储emp_id而不是从数据库中获取emp_id,则可能会发生这种情况。因此,为了验证该员工的存在,我选择了当时在逻辑上有意义的做法。

我走的路线:

<?php
include('inc/dbConnect.php');
//Store user id aka emp_id to variable from URL 
$user = $_GET['user'];
$key = $_GET['key'];
//Grab data from database, create array, and step through storing emp_id values to said array.
$result = mysqli_query($dbconnect, 'SELECT emp_id FROM employee');
$data = mysqli_fetch_array($result);
$usercheck = array();
while($data = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
    $usercheck[] =  $data['emp_id'];
    //Debugging only to see what array looks like
    print_r($usercheck);
    }
//Validate that employee id exists in generated array from database. If not boot them off immediately.
if(!in_array($user, $usercheck) || $key != 'Not Important'){
    echo "<meta http-equiv='"refresh'" content='"0;url=index.php'">";
} else {
    // I did this so even if someone where to input wrong data, it wouldn't flash the html to them, or allow them to stop the page from loading as it flashed to see data etc. Plus I hate having to echo out html for a page bleh.
    include('html content file here');
    }
?>

正如你所看到的,我正在从上一个表单传递的URL中获取用户id和密钥。在这一点上,密钥并不重要。我专注于用户id的动态元素。

因此,我从MySQL数据库的emp_id创建了一个数组,并希望使用该数组来检查$user中存储的变量。在网上研究后,许多人建议使用in_array()。所以我尝试了一下。现在,这当然很好,除非你选择了动态下拉列表中的第一个条目。如果您选择了该选项,它将引导您返回索引页面以再次登录。除此之外,任何其他员工登录时,url必须保持原样,否则会将您引导出系统。

我希望我的数组简单,如下所示:$usercheck = array(1,2,3,4,5,6,7,8,9);

这将使检查用户id的值变得非常容易。然而,当我的脚本实际创建时,我发现数组要比这个复杂得多。它看起来是这样的:MySQL数据库中的数组我看了又看,又看了如何将这个数组存储为简单的东西,只存储emp_id的值,仅此而已。我不需要密钥,我不需要任何额外的东西,除了我的emp_id存储为一个非常简单的数组,用于验证从上一个表单传递的用户id。

我意识到,这可能是一件愚蠢而简单的事情,我错过了,只是没有抓住,但我后退了一步,思考了一下,尝试了许多其他方法,但无法使其按预期工作。那么,我的逻辑有什么问题呢?我知道我的代码是错误的,因为它不起作用,但为什么这比最初看起来更困难,因为在我看来,只返回一个值数组而不返回其他值是一件看似简单的事情。

在任何人讨厌这件事并告诉我有更好的方法来做这件事之前,这个代码很糟糕,它不安全,等等,我知道这一点。这都是假设,我在这里的开发服务器上运行代码,只是在午餐时把它弄乱,试图看看我缺少了什么。

附言:这是给那些想看看我是如何创建动态下拉列表的人的:

echo '<form class="form-horizontal" action="main.php" method="GET">';
            echo '<div class="form-group">';
            echo '<label for="user" class="control-label col-xs-4 col-md-3">Username</label>';
            echo '<div class="col-xs-8 col-md-3">';
            echo '<select name="user" class="form-control">';
            echo '<option value="1">Select Name</option>';
            $result = mysqli_query($dbconnect, 'SELECT emp_id, emp_name FROM employee ORDER BY emp_name');
            if($result) { 
                while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
                    echo '<option value="' . $row['emp_id'] . '">' . $row['emp_name'] . '</option>';
                    } 
                } else {
                    mysqli_connect_error();
                }
            echo '</select>';
            echo '</div>';
            echo '</div>';
            echo '<label for="submit" class="control-label col-xs-4 col-md-3"></label>';
            echo '<div class="col-xs-8 col-md-3">';
            echo '<input type="submit" value="Log In" style="margin-bottom: 100px;"/>';
            echo '</div>';
            echo'</form>';

如果我正确理解你的问题,你需要一个所有用户ID的数组。

如果您担心循环中的作用域,实际上不需要这样做,因为数组已经是数据的枚举。

// TODO: Complete the query
$data = $conn->query("SELECT [...]");

你的数据应该是这样的:

$data = Array (
    0 => 1,
    1 => 2,
    2 => 3
)

因为它是在这种格式内构建的

但您可以这样做,这将是一个更好的登录结构:

class Employee
{
    private $Eid;
    private $Key;
    public function __construct($key,$eid)
    {
        $this->Eid = $eid;
        $this->Key = $key;
        self::login();
    }
    public function login()
    {
        // TODO: Strip your html out of your derived inputs
        require_once 'database.php';
        foreach ( $db->query("SELECT * FROM tbl WHERE emp_id = '$this->Eid'" as $row );
        {
            // TODO: Add a authenticate column (ie: 3 is admin)
            if ( $row['admin'] == 3 )? "success" : "fail"; // change to what you like
        }
    }
}

它可以像这样使用:

if(isset($_GET['key']) && isset($_GET['eid']))? (new Employee($_GET['key'], $_GET['eid']))->Login() : "No Key or Eid given!";

试试这个:

在您的例子中,您的数组只保存了一个值,因为您没有对它进行索引,如果您创建了一个计数器,您可以对数组进行索引,就像本例中一样。

$count = 0;
while($data = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
    $usercheck[$count] =  $data['emp_id'];
    //Debugging only to see what array looks like
    print_r($usercheck);
     $count ++;
}