我有一个名为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文件中以保持整洁来实现这一目标?
答案 0 :(得分:4)
为什么我不能在echoed select元素中调用该方法?
因为方法体引用了$conn
,它应该是一个全局变量而不是方法体内的范围。您可以使用
function getnames()
{
global $conn;
// the rest as before
}
现在,虽然这会使问题消失,但你在这里提出的建议并不是一个很好的方法。有几个问题:
getnames
使用全局变量(“隐形参数”) - 请注意,如果这个问题得到纠正,你就没理由提出这个问题!<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>';