用PHP

时间:2016-04-08 15:23:12

标签: php mysql arrays validation

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

  • 如何从SQL查询中获取多维数组 将它转换为简单的东西,只需要将值转换为简单的东西 此类信息:array(1,2,3,4,5,6,7,8,9)

如何从PHP中的SQL查询创建一个简单的1维数据库?

这比我的理解更多,而不是实时代码。我一直在玩php和MySQL,我的大脑想出了我认为是一个合乎逻辑的想法。我打算把它打破,因为我在脑子里,所以你明白我来自哪里。

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

逻辑推理:

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

现在我意识到这不是最安全或最好的路线,但我想理解为什么我的推理不起作用。我希望这个验证的原因是员工列表是动态的,而一个老员工不能只在用户输入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()。所以我试了一下。当然,除非您在动态下拉列表中选择第一个条目,否则此功能非常有用。如果选择该选项,它将引导您返回索引页面以再次登录。除此之外,任何其他员工都登录,网址必须保持原样,或者将您引导离开系统。

我希望我的数组很简单,就像这样:     $usercheck = array(1,2,3,4,5,6,7,8,9);

这样可以很容易地检查用户ID的值。 但是,我发现数组比我的脚本实际创建的要复杂得多。它看起来像这样: Array from MySQL Database 我看了看,看了看如何将这个数组存储为简单的东西,只存储了emp_id的值,仅此而已。我不需要密钥,我不需要任何额外的东西,除了我的emp_id存储为一个非常简单的数组,用于验证从前一个表单传递的用户ID。

我知道这可能是一个愚蠢的简单,我错过了,只是没有抓住,但我退了一步,想了想,并尝试了许多其他方法,并不能按预期工作。那么我的逻辑在这里出了什么问题?我得到的代码是错误的,因为它不起作用,但为什么这比最初看起来更困难,因为在我的脑海里做一个看似简单的事情就是返回一个只有值的数组而没有其他的东西。

在对此有任何不满之前并告诉我有更好的方法来做到这一点,这个代码很糟糕,它不安全,等我知道这一点。这都是假设的,我在开发服务器上运行代码,只是在我的午餐时弄乱它,试图看看我错过了什么。

P.S。这适用于那些想要了解我如何创建动态下拉列表的人:

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

2 个答案:

答案 0 :(得分:1)

试试这个:

在你的例子中,你的数组只保存一个值,因为你没有为它编制索引,如果你创建一个计数器,你可以索引你的数组,就像在这个例子中一样。

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

答案 1 :(得分: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!";