从同一个文件中调用PHP函数

时间:2014-02-03 22:59:55

标签: php

我有一个名为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>';
        }
}

为什么我不能在echoed select元素中调用该方法?

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

另外,如何通过将该方法放在另一个php文件中以保持整洁来实现这一目标?

4 个答案:

答案 0 :(得分:4)

  

为什么我不能在echoed select元素中调用该方法?

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

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

现在,虽然这会使问题消失,但你在这里提出的建议并不是一个很好的方法。有几个问题:

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

以上所有都是所选方法的严重缺陷,并且它们都不会出现在精心构建的应用程序中。我建议不要让问题消失,你可以通过重构代码来解决这些问题,并且问题会在路上解决。

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

答案 1 :(得分:4)

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

global $conn;

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

所以您的代码位于页面顶部

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