【问题标题】:Is it possible to automatically generate PHP function names from an array of values?是否可以从值数组自动生成 PHP 函数名称?
【发布时间】:2011-07-31 21:42:54
【问题描述】:

我最近学习了数组系统来缩短我在 Javascript 上的代码。

        var fields = ['username', 'password', 'password_confirm', 'type', 'firstname', 'lastname', 'bdate_month', 'bdate_day', 'bdate_year', 'email', 'country', 'state', 'city', 'payment_email'];
        var length = fields.length;
        for (var i=0; i<length; i++) {
        if ($('#' + fields[i]).val() == "") {
        $('#' + fields[i] + '_error').show();
        $('#' + fields[i] + '_error').fadeOut(4000, function() {});
        $('#' + fields[i]).focus();
        return false;
        }
        }

这是我生成的代码,用于创建一系列条件来验证提交表单的内容。

现在我想在 PHP 中使用同样的原理来生成一系列函数,这些函数将从 MySQL 数据库中查询登录用户的数据。

我是 PHP 新手,我知道以下代码可能只是一堆废话。但也许你可以了解我在这里要完成的工作。

include("connect.php");

$fields = ('id', 'username', 'password', 'password_confirm', 'type', 'firstname', 'lastname', 'bdate_month', 'bdate_day', 'bdate_year', 'email', 'country', 'state', 'city', 'payment_email');
$username = mysql_real_escape_string($_SESSION['username']);

for ($i=0; $i<15; $i++) {
function $fields($i)() {
    $username = mysql_real_escape_string($_SESSION['username']);
    $sql="SELECT * FROM users WHERE username='$username'";
    $resultado=mysql_query("$sql");
    $row=mysql_fetch_array($resultado);
    if($row!=NULL)
    {
        echo ($row['$fields($i)']);
    } else {

        echo (" No ".$fields($i)." inserted!");
    }
}
}

============================================ 编辑:

我想出了一个更简单更简单的方法。

function in_user($key) { 
$username = mysql_real_escape_string($_SESSION['username']);
$sql="SELECT * FROM users WHERE username='$username'"; 
$resultado=mysql_query("$sql"); 
$row=mysql_fetch_array($resultado); 
if($row!=NULL){ 
echo ($row[$key]); 
} else { 
echo ("No {$key}!"); 
} 
}

由于我只需要更改要咨询的字段,我认为带参数的函数会更容易和更简单。

&lt;?php in_user('email');?&gt; 会输出stored.email@database.com

【问题讨论】:

  • 请注意,php 有 foreach(),您可能会发现它更简单 ==> foreach($fields as $one_field) { ... }
  • script.php?username=';drop+table+users -- xkcd.com/327
  • @Byron:不错的尝试,但mysql_query 不支持多个查询。 (是的,它仍然是一个主要的安全漏洞)

标签: php arrays function auto-generate


【解决方案1】:

在 PHP 中,您不能创建名称基于变量的函数。

另外,在这个例子中你不会有太多收获,我认为使用起来更清晰:

function user_get_field($fieldname)

现在,如果您需要多个字段,这将导致执行多个查询,因此最好检索所有内容并将其缓存。

嘿,您甚至可以在会话中存储与用户相关的所有内容,并在他更改自己的设置时进行更新。每个会话只有一个查询。

【讨论】:

  • 感谢您的意见!我猜不可能基于变量创建函数名称。但至于您的最后评论......我将如何将所有详细信息存储在用户会话中?那会使导航变慢吗?或者它甚至会影响它吗? (想象一个有数千用户同时在线的系统。这可行吗?)
  • 是的,没关系。每个用户在自己的会话中都有自己的设置。如果您经常使用该数据(可能您会这样做),那么它肯定比每次从 SQL 中检索它要快。如果您还将会话存储在数据库中,那就不值得了。
  • 其实,如果函数是匿名的,你可以使用变量来触发函数。示例 ==> codepad.viper-7.com/3KkN4Y - 另见:php.net/manual/en/functions.anonymous.php
  • 好吧,最后,我创建了一个 javascript 脚本,直到用纯文本编写函数。然后将它们复制/粘贴到我的函数文件中。哈哈。
  • @Peter:不,那是不同的事情。那是一个存储函数的变量。您可以执行名称存储在变量中的函数,甚至不需要匿名函数。
【解决方案2】:

好吧,我不确定整体方法,但只是为了好玩....您可以使用variable variables 触发anonymous functions,如下所示:

<?php
$fields = array('id', 'username' ...
foreach($fields as $index => $one_field) {
    $$one_field = function() use ($one_field, $index) { ... };
}

注意use 的使用,因此我可以访问在函数中创建每个$$one_field 时当前的$one_field 和$index 实例...创建一个真正的闭包。

现在您可以访问这些功能之一,例如$username()

Here's a quick illustrative example.

【讨论】:

    【解决方案3】:

    您到底想完成什么?比如最终结果应该怎么做?您是否只是想检查是否填写了一行中的字段?对我来说,看起来你的生活比你需要的更复杂。

    编辑:

    我会这样做。把它放在你的connect.php中:

    $user = array();
    $username = mysql_real_escape_string($_SESSION['username']);
    $query = "SELECT * FROM users WHERE username='{$username}'";
    $rs = mysql_query($query);
    $row = mysql_fetch_array($rs);
    
    foreach($row as $key => $value) {
        $user[$key] = $value;
    }
    

    这样,您应该能够通过 $user['id'] 或 $user['password'] 访问任何用户字段,前提是包含 connect.php。

    我希望这会有所帮助。

    编辑 2:

    更简单:

    $username = mysql_real_escape_string($_SESSION['username']);
    $query = "SELECT * FROM users WHERE username='{$username}'";
    $rs = mysql_query($query);
    $user = mysql_fetch_array($rs);
    

    【讨论】:

    • 呵呵,我大概就是这样吧!我想要得到的是一种生成函数的简单方法,它允许我查询和打印特定用户的所有详细信息。因此,如果我需要在某处打印他们的姓名或电子邮件或其他任何内容,我只需调用该字段的函数即可。
    • 我认为这是一个非常有趣的选项。但我不能让它工作。我把它放在我的connect.php的include下面,然后将它称为&lt;?php echo $user['email']; ?&gt;,我得到这个错误:Notice: Undefined index: email in C:\localhost\htdocs\icam\admin\dashboard_admin.php on line 1
    【解决方案4】:
    function fields($i) {
        $username = mysql_real_escape_string($_SESSION['username']);
        $sql="SELECT * FROM users WHERE username='$username'";
        $resultado=mysql_query($sql);
        $row=mysql_num_rows($resultado);
        if($row != 0) {
            echo ($row['$fields($i)']);
        } else {
            echo (" No ".$fields($i)." inserted!");
        }
    }
    for ($i=0; $i<15; $i++) {
        fields($i);
    }  
    

    那个函数一定是out了,$fields是一个数组,我希望它能工作。

    【讨论】:

    • 嘿,谢谢!但不幸的是,这种结构也不起作用。正如 yi_H 所说,函数的名称不能基于变量。
    【解决方案5】:

    我知道它很旧,但仍然可以使用...

    function test_one(){
    print "one";
    }
    function test_two(){
    print "two";
    }
    $var = "test_two";
    $var();
    

    【讨论】:

      【解决方案6】:

      您可以只使用 php 的 fwrite,然后像往常一样将函数写入文件。即fwrite($handle,'&lt;?php function '.$function_name.' { //function contents here } ?&gt;');我不会推荐这个,但它是可行的。

      【讨论】:

      • 试图更好地阐明我的意思。您可以直接输出定义函数所需的文本,并动态添加您存储的函数名称。
      • 谢谢@Dschultz。为什么不推荐使用 fwrite 方法?
      • 一般情况下,除非您确切知道要提取的内容,否则我不建议将函数从数据库动态写入文件。
      • 这称为自动代码生成。它给出了 OP 问题的答案,问题是:OP 有错误的问题 :)
      猜你喜欢
      • 1970-01-01
      • 2018-12-04
      • 1970-01-01
      • 2013-09-19
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 2011-04-12
      相关资源
      最近更新 更多