【问题标题】:Calling PHP functions from within the same file从同一文件中调用 PHP 函数
【发布时间】:2014-02-03 22:59:55
【问题描述】:

我有一个名为 choose.php 的 php 文件,其中我回显了一些 HTML,即一个选择元素。

我正在使用 PDO 从 mysql 数据库中填充 select 元素。

我编写的代码完美运行,但是当我将它放入一个函数并尝试调用它时,我收到一个错误,告诉我不能再次声明所述方法。

代码如下:

echo        '<select>';

                $sql = "SELECT name FROM people";
                $res = $conn->prepare($sql );
                $res ->execute();

                while ( $row  = $res ->fetch() )
                {
                    echo '<option value = "' . $row['name '] . '">' . $row['name '] . '</option>';
                }

echo        '</select>';

换句话说,函数看起来像这样:

function getnames()
{
        $sql = "SELECT name FROM people";
        $res = $conn->prepare($sql );
        $res ->execute();

        while ( $row  = $res ->fetch() )
        {
          echo '<option value = "' . $row['name '] . '">' . $row['name '] . '</option>';
        }
}

为什么我不能在回显的选择元素中调用方法?

echo        '<select>';
                     getnames();
echo        '</select>';

另外,我将如何通过将方法放在另一个 php 文件中以保持整洁来完成此操作?

【问题讨论】:

  • 请粘贴准确的错误信息

标签: php


【解决方案1】:

为什么我不能在回显的选择元素中调用方法?

因为方法体引用了$conn,它应该是一个全局变量,不在方法体内部的范围内。您可以使用

验证这是问题所在(并“修复”它)
function getnames()
{
    global $conn;
    // the rest as before
}

现在,虽然这会让问题消失,但您在这里提出的建议并不是组织事情的好方法。有几个问题:

  • getnames 使用一个全局变量(“隐形参数”)——请注意,如果这个问题已经得到纠正,你就没有理由问这个问题了!
  • 该方法的名称具有误导性——它没有“获取”某些东西,它打印 HTML
  • 该方法不能用于除特定目的之外的任何其他用途 - 如果您想对名称执行其他操作(例如打印表格),则必须编写另一个方法。
  • 您正在将直接 HTML 输出(&lt;select&gt; 标记)与业务逻辑(查询数据库)交错。最好先完成所有业务逻辑(将所需的结果保存在变量中),然后一次性完成 HTML。

以上所有都是所选方法的严重缺陷,并且它们都不存在于构建良好的应用程序中。我建议,与其让问题消失,不如通过重构代码来解决这些问题,这样会更好,问题会在途中自行解决。

Code Review 将是一个优秀的地方,可以提出“我有这个代码和这个建议——我将如何正确实施它?”这样的问题。如果您需要额外的帮助。

【讨论】:

  • 但是请注意,使用全局变量通常不是一个合适的解决方案,而是问题所在......所以您可能想要更改您的数据流。为什么不给获取连接资源的函数添加一个参数呢?
  • @Jon 嗨乔恩这是确切的问题,我在页面顶部包含了 connection_class.php 文件,该文件设置了与数据库的连接,并假设它是全局的,因为。您将不得不原谅我,因为我现在才学习 PHP 一个多星期。再次感谢。还有约翰内斯H。我现在就试试这个建议
【解决方案2】:

您正在尝试访问在您的函数范围内不可用的 $conn 变量。 要访问函数内的$conn 变量,请使用全局变量,如下所示:

global $conn;

【讨论】:

  • 或者更好的是,让 $conn 成为 function: function getnames($conn) { 的传递变量使用全局变量是吊死自己(或未来的维护者)的最简单方法之一
【解决方案3】:

您如何加载定义了getnames 函数的文件?尝试使用 require_once 并确保它不被多次包含 - already defined 表示它已被定义并且正在再次调用文件,因此尝试再次定义它

【讨论】:

    【解决方案4】:

    如果您在页面上多次调用相同的代码,加载会变得非常繁重。我建议只在页面顶部运行它并将数据放入变量中,然后在您需要的每个位置回显该变量

    所以你的代码在页面顶部

    $sql = "SELECT name FROM people";
    $res = $conn->prepare($sql );
    $res ->execute();
    $outputData = '';
    while ( $row  = $res ->fetch() ){
      $outputData .= '<option value = "' . $row['name '] . '">' . $row['name '] . '</option>';
    }
    

    然后

    echo '<select>'.$outputData.'</select>';
    

    【讨论】:

      猜你喜欢
      • 2011-08-23
      • 1970-01-01
      • 2018-09-21
      • 2018-07-27
      • 2014-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      相关资源
      最近更新 更多