【问题标题】:Create simple array from MySQL query in PHP在 PHP 中从 MySQL 查询创建简单数组
【发布时间】:2016-04-08 15:23:11
【问题描述】:

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

  • 如何从 SQL 查询中获取多维数组和 将其转换为仅具有价值的精简和简单的东西 诸如此类的信息:array(1,2,3,4,5,6,7,8,9)

如何从 PHP 中的 SQL 查询创建一个简单的一维数组,其中包含员工 ID?

这更多是为了我的理解,而不是实时代码。我一直在玩 php 和 MySQL,我的大脑想出了一个我觉得尝试的合乎逻辑的想法。我将在脑海中分解这一点,以便您了解我来自哪里。

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

逻辑推理:

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

现在我意识到这不是最安全或最好的方法,但我想了解为什么我的推理不起作用。我希望对此进行验证的原因是,员工列表将是动态的,并且老员工不能只在 url 的 user="emp_id" 部分中输入 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 的值。 但是,当我的脚本实际创建该数组时,我发现该数组要复杂得多。它看起来像这样: Array from MySQL Database 我已经看了又看,看看如何让这个数组存储为简单的东西,只存储 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>';

【问题讨论】:

  • 你找到独奏了吗?
  • 还没有,我从办公桌前被拉开,还没有机会尝试面向对象的版本。是否有可行的程序版本?

标签: php mysql arrays validation


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    试试这个:

    在您的示例中,您的数组仅保存一个值,因为您没有对其进行索引,如果您创建一个计数器,您可以索引您的数组,就像在这个示例中一样。

    $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 号是多少。
    • 为什么 OP 应该“试试这个”? 好的答案将始终解释所做的事情以及为什么以这种方式完成,不仅是为了 OP,也是为了 SO 的未来访问者。跨度>
    猜你喜欢
    • 2011-03-25
    • 2015-11-24
    • 2014-01-04
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    相关资源
    最近更新 更多