代码之家  ›  专栏  ›  技术社区  ›  Léo Léopold Hertz 준영

在PHP中创建自己的函数

  •  -1
  • Léo Léopold Hertz 준영  · 技术社区  · 15 年前

    如何在PHP中创建自己的函数,以便根据中的数据将不同的文件绑定到它 $_GET ?

    我使用处理程序login.php,它只在您没有登录时显示登录表单。

    但是,如果用户 logged_in not_logged_in . 然而,我现在的赫纳德勒并没有那么灵活地做到这一点。

    我的处理程序\u login.php

    <?php
    // Check for the existing Cookie
    
    if (isset($_COOKIE['login']) ) {
        //1. read the first word in Cookie of the form 
            //"email@gmail.com,ca05106e445c15197f7213bc12648524
        //Then, store this word to $email 
        $cookie_tripped = explode(",", $_COOKIE['login']);   
        $email = $cookie_tripped[0];
        $result = pg_prepare($dbconn, "query1", 'SELECT passhash_md5 FROM users 
                             WHERE email = $1;');
        $result = pg_execute($dbconn, "query1", array($email));
    
        if(!$result) {
            exit;
        }
    
        // to take the passhash out of the cookie
        $passhash_md5_cookie = $cookie_tripped[1];
        if($result == $passhash_md5_cookie) {
            header("Location: ../index.php");
            die("logged in");
        }
        // put the login form visible                // Problem HERE: I want that my function changes this value in the parameter
        include 'forms/login.php';
    }
    
    ?>
    

    上述代码中的问题是它不可扩展。

    这个问题表明我需要两个功能: not_logged_in(include_file) logged_in(include_file) . 如果用户没有登录,前者应该在参数中包含该文件。否则,它将不返回任何新内容。

    如果用户已登录,则后者应再次将该文件包含在参数中。否则,它不应该做任何事情。

    我的伪代码尝试。

    未登录(参数)-功能

     // process all variables in the URL such as ?questions=777
     not_logged_in(forms/login.php)
     // this should return
     //     include 'forms/login.php'; if the user is not logged in
    

    已登录(参数)-功能

     // process all variables in the URL such as ?questions=777
     logged_in(handler/send_question.php)
     // this should return
     //     include 'handlers/send_question.php'; if the user is logged in
    
    3 回复  |  直到 15 年前
        1
  •  3
  •   Tyler Carter    15 年前
    function not_logged_in($file)
    {
        if(!isset($_COOKIE['login']))
        {
           include($file);
        }
    }
    function logged_in($file)
    {
        if(isset($_COOKIE['login']))
        {
           include($file);
        }
    }
    not_logged_in("login.php");
    logged_in("handler/send_question.php");
    

    这是假设如果设置了$\u cookie['login'],则它们将被登录。

    实际上,我认为这是一种有趣的方式,而不仅仅是做一个if语句:

    if(isset($_COOKIE['login']))
    {
        include("handler/send_question.php");
    }
    else
    {
        include("login.php");
    }
    

    但是,您的方法的问题是它是额外的代码,因为它必须评估两个函数。但是,如果您从未实际评估代码(因为只有一个函数将通过 $_COOKIE 测试)在其中一个功能中它可以工作。

    不能 将get参数传递给包含的文件,如下所示:

    include("test.php?somevar=var");
    

    包含的文件从被调用的页继承$\u get参数。

        2
  •  1
  •   Andrew Moore    15 年前

    您可以在以下事项中创建函数:

    function func_name($params) {
        // operations
    }
    

    因此,对于您的示例,您可以编写以下内容:

    function handle_login($if_logged, $if_not_logged) {
        if(isset($_COOKIE['login'])) {
            include($if_logged);
        } else {
            include($if_not_logged);
        }
    }
    

    请记住,因为您包含在函数内部,所以函数外部的变量对包含的文件将不可见。你得用 global 或者$globals超级全局访问它们。例如,您将无法读取变量 $cantSeeMe 在下面的示例中:

    $cantSeeMe = 'Ha! Ha! I am hidden!';
    
    function test() {
        var_dump($cantSeeMe);
    }
    
    test() // dumps null
    

    有关变量范围的详细信息,请访问:

    PHP: Variable Scope

        3
  •  0
  •   zombat    15 年前

    我认为你采取了错误的方法。如果用户登录,两个函数都应该处理所有变量;如果用户登录,两个函数都应该返回一个模板。 登录。所以,如果你写了两个函数来做这件事,听起来就像是在重复你自己。

    我会用一个函数,我们称之为 loginProcess() 什么都不传。然后它可以调用第二个函数 isLoggedIn() 并据此做出决定:

    function loginProcess()
    {
        $loggedIn = isLoggedIn();   //returns boolean true or false
        if ($isLoggedIn) {
             //process variables here
             //show logged in template here
        }
        else {
             //show not logged in template here
        }
    }
    

    如果需要单独的函数进行处理,则将其进一步拆分为:

    function loginProcess()
    {
        if (isLoggedIn()) processLoggedInUser();
        else processNotLoggedInUser();
    }
    

    这样做可以避免您必须维护处理相同变量的多个函数。