【发布时间】:2014-07-24 03:32:21
【问题描述】:
我正在为学校开展一个项目,主要是数据管理和演示。我有一段很长的代码需要复制并粘贴到项目的不同部分,所以我想我会把它变成一个函数。我可以将在函数外部工作的代码复制并粘贴到一个空函数中,它不会产生代码在函数外部产生的效果(但不会导致错误)。这是我第一次在php中使用函数,看起来很简单,但我无法让它工作。
这是有效的代码:
<?php
//function display_question($problem_id, $slide_num, $attempt, $admin_id, $result){
//}
include('header.php');
$result = "";
if(isset($_POST['problem_id'])){
if (!isset($_SESSION['slide']) || empty($_SESSION['slide'])){
$_SESSION['slide'] = 1;
}
$slide_num = $_SESSION['slide'];
$problem_id = $_POST['problem_id'];
$admin_id = $_SESSION['user_id'];
if (!isset($_SESSION['phase']) || empty($_SESSION['phase'])){
$_SESSION['phase'] = 1;
}
$phase = $_SESSION['phase'];
if($phase == 1){ //show problem attempt#1
$attempt = 1;
}elseif($phase == 2){ //graph attempt#1
}elseif($phase == 3){ //match Students into groups
}elseif($phase == 4){ //show problem attempt#2
$attempt = 2;
}elseif($phase == 5){ //graph attempt#2
}else{
$result = 'phase Error';
}
//display_question($problem_id, $slide_num, $attempt, $admin_id, $result);
$update = mysql_query("UPDATE users SET active=1, slide_id='$problem_id', attempt='$attempt' WHERE id='$admin_id'");
$query = mysql_query("SELECT * FROM problem WHERE id='$problem_id'");
if($update && $query){
$row = mysql_fetch_row($query);
$topic = $row[2];
$problem = $row[3];
$solution_a = $row[4];
$solution_b = $row[5];
$solution_c = $row[6];
$image = $row[7];
if(!empty($image)){
$result = 'Admin ID: '.$admin_id.'</br><div align="right">Slide '.$slide_num.'</div>
Attempt #: '.$attempt.'
<h1>'.$topic.'</h1>
<img src="'.$image.'" width="500"/>
<h2>'.$problem.'</h3>
<h3><ol type="A">
<li>'.$solution_a.'</li>
<li>'.$solution_b.'</li>
<li>'.$solution_c.'</li>
</ol></h3>';
}else{
$result = 'Admin ID: '.$admin_id.'</br><div align="right">Slide '.$slide_num.'</div>
Attempt #: '.$attempt.'</br>
<h1>'.$topic.'</h1>
<h2>'.$problem.'</h3>
<h3><ol type="A">
<li>'.$solution_a.'</li>
<li>'.$solution_b.'</li>
<li>'.$solution_c.'</li>
</ol></h3>';
}
}else{
$result = "Error";
}
$result .= ' </br>
<div id="outer"><div class="inner"><form action="slide.php" method="post">
<input type="number" value="'.$id.'" hidden="hidden" name="problem_id"/>
<input type="submit" value="Prev Slide" class="submit"/>
</form></div>
<div class="inner"><form action="slide.php" method="post">
<input type="number" value="'.$id.'" hidden="hidden" name="problem_id"/>
<input type="submit" value="Next Phase" class="submit"/>
</form></div>
<div class="inner"><form action="slide.php" method="post">
<input type="number" value="'.$id.'" hidden="hidden" name="problem_id"/>
<input type="submit" value="Next Slide" class="submit"/>
</form></div></div>';
} else {
$result = "problem_id not set";
}
?>
<!DOCTYPE HTML>
<html>
<title>Presentation</title>
<link rel="stylesheet" type="text/css" href="css/header.css">
<style type="text/css">
div.main{
width: 500px;
margin-top: 25px;
margin-left: auto;
margin-right: auto;
padding: 20px;
background-color: white;
border: 2px solid black;
border-radius: 5px;
}
#outer{
width:100%;
text-align: center;
}
div.inner{
display: inline-block;
}
form.problem> input{
font-size: 1.1em;
margin-top: 10px;
}
form.nav{
font-size: 1.1em;
margin-top: 10px;
display: inline;
}
input.submit{
width: 120px;
height: 40px;
color: white;
background-color: green;
border: none;
border-radius: 5px;
margin-top: 25px;
}
input.submit:hover{
background-color: #006600;
}
</style>
</head>
<body>
<div class="main">
<?php echo $result;?>
</div>
</body>
</html>
这是代码复制并粘贴到不起作用的函数中:
<?php
function display_question($problem_id, $slide_num, $attempt, $admin_id, $result){
$update = mysql_query("UPDATE users SET active=1, slide_id='$problem_id', attempt='$attempt' WHERE id='$admin_id'");
$query = mysql_query("SELECT * FROM problem WHERE id='$problem_id'");
if($update && $query){
$row = mysql_fetch_row($query);
$topic = $row[2];
$problem = $row[3];
$solution_a = $row[4];
$solution_b = $row[5];
$solution_c = $row[6];
$image = $row[7];
if(!empty($image)){
$result = 'Admin ID: '.$admin_id.'</br><div align="right">Slide '.$slide_num.'</div>
Attempt #: '.$attempt.'
<h1>'.$topic.'</h1>
<img src="'.$image.'" width="500"/>
<h2>'.$problem.'</h3>
<h3><ol type="A">
<li>'.$solution_a.'</li>
<li>'.$solution_b.'</li>
<li>'.$solution_c.'</li>
</ol></h3>';
}else{
$result = 'Admin ID: '.$admin_id.'</br><div align="right">Slide '.$slide_num.'</div>
Attempt #: '.$attempt.'</br>
<h1>'.$topic.'</h1>
<h2>'.$problem.'</h3>
<h3><ol type="A">
<li>'.$solution_a.'</li>
<li>'.$solution_b.'</li>
<li>'.$solution_c.'</li>
</ol></h3>';
}
}else{
$result = "Error";
}
}
include('header.php');
$result = "";
if(isset($_POST['problem_id'])){
if (!isset($_SESSION['slide']) || empty($_SESSION['slide'])){
$_SESSION['slide'] = 1;
}
$slide_num = $_SESSION['slide'];
$problem_id = $_POST['problem_id'];
$admin_id = $_SESSION['user_id'];
if (!isset($_SESSION['phase']) || empty($_SESSION['phase'])){
$_SESSION['phase'] = 1;
}
$phase = $_SESSION['phase'];
if($phase == 1){ //show problem attempt#1
$attempt = 1;
}elseif($phase == 2){ //graph attempt#1
}elseif($phase == 3){ //match Students into groups
}elseif($phase == 4){ //show problem attempt#2
$attempt = 2;
}elseif($phase == 5){ //graph attempt#2
}else{
$result = 'phase Error';
}
display_question($problem_id, $slide_num, $attempt, $admin_id, $result);
$result .= ' </br>
<div id="outer"><div class="inner"><form action="slide.php" method="post">
<input type="number" value="'.$id.'" hidden="hidden" name="problem_id"/>
<input type="submit" value="Prev Slide" class="submit"/>
</form></div>
<div class="inner"><form action="slide.php" method="post">
<input type="number" value="'.$id.'" hidden="hidden" name="problem_id"/>
<input type="submit" value="Next Phase" class="submit"/>
</form></div>
<div class="inner"><form action="slide.php" method="post">
<input type="number" value="'.$id.'" hidden="hidden" name="problem_id"/>
<input type="submit" value="Next Slide" class="submit"/>
</form></div></div>';
} else {
$result = "problem_id not set";
}
?>
<!DOCTYPE HTML>
<html>
<title>Presentation</title>
<link rel="stylesheet" type="text/css" href="css/header.css">
<style type="text/css">
div.main{
width: 500px;
margin-top: 25px;
margin-left: auto;
margin-right: auto;
padding: 20px;
background-color: white;
border: 2px solid black;
border-radius: 5px;
}
#outer{
width:100%;
text-align: center;
}
div.inner{
display: inline-block;
}
form.problem> input{
font-size: 1.1em;
margin-top: 10px;
}
form.nav{
font-size: 1.1em;
margin-top: 10px;
display: inline;
}
input.submit{
width: 120px;
height: 40px;
color: white;
background-color: green;
border: none;
border-radius: 5px;
margin-top: 25px;
}
input.submit:hover{
background-color: #006600;
}
</style>
</head>
<body>
<div class="main">
<?php echo $result;?>
</div>
</body>
</html>
变量 $result 没有打印任何内容,除了在它之后添加的内容。根据我的阅读,函数 args 默认通过 byval 传递,所以我认为这不是问题所在,我已经检查了所有变量的名称,以确保它们要么在函数中定义,要么通过我可以看到的传递给函数他们是。我不知道还要寻找什么。这可能很容易让我看起来很愚蠢,但我是 php 新手,所以请帮帮我。
【问题讨论】:
-
当某些东西放在一个函数中时突然不再工作,10 次中有 9 次,这是一个范围问题。
-
函数中的代码需要访问
header.php中的任何重要内容?在非功能代码中,header.php包含在与其余代码相同的范围内。功能代码不是这种情况。正如@Fred-ii- 所说,这可能是范围问题。 -
您的函数结束时看起来不像是
return $result或echo $result -
我已经更改了所有的 args 名称并更改了函数中的相应变量名称,并仔细检查了我没有在函数中定义的额外变量,一切都检查出来了。我不认为这是一个范围问题
-
肖恩是对的!从我正在查看的文档看来,php函数没有返回值,只有byval参数,但看起来解决方案是从参数中取出'$result',并将输出返回到'$result'。谢谢大家的帮助!
标签: php function definition defined