繁体   English   中英

从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.)检查外部IP是否与业务IP匹配或不同? 假定为静态IP(完成)
  • 3.)如果IP匹配,则继续动态创建员工姓名下拉列表,以“ emp_id”作为值进行选择,然后使用GET(完成)传递
  • 4.)如果IP不匹配,请提供登录表格。 验证后,将$ ip设置为等于企业IP,然后继续下拉列表(完成)
  • 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之外,我不需要任何其他操作。

我知道这可能是愚蠢的简单事情,我想不起来,只是不了解,但是我退后一步,考虑了一下,尝试了许多其他方法,但无法按预期工作。 那么我这里的逻辑出了什么问题? 我发现我的代码是错误的,因为它不起作用,但是鉴于我的想法似乎很简单,因为它只返回值数组,而没有其他返回值,所以为什么这比最初看起来要困难得多。

在对此感到讨厌之前,告诉我有更好的方法可以执行此操作,这段代码很烂,它并不安全,等等,我知道这一点。 所有这些都是假设的,我在工作中的开发服务器上运行代码,只是在午餐时间弄乱了代码,试图查看我所缺少的内容。

PS这是给那些想看看我如何创建动态下拉菜单的人的:

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>';

尝试这个:

在您的示例中,数组仅保存一个值,因为您没有对它进行索引,因此,如果创建一个计数器,则可以对数组进行索引,如本示例中所示。

$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 ++;
}

如果我正确理解了您的问题,则需要包含所有用户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!";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM