【问题标题】:Why code works out of but not inside of an empty function?为什么代码在空函数中起作用,但在空函数内部不起作用?
【发布时间】: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 $resultecho $result
  • 我已经更改了所有的 args 名称并更改了函数中的相应变量名称,并仔细检查了我没有在函数中定义的额外变量,一切都检查出来了。我不认为这是一个范围问题
  • 肖恩是对的!从我正在查看的文档看来,php函数没有返回值,只有byval参数,但看起来解决方案是从参数中取出'$result',并将输出返回到'$result'。谢谢大家的帮助!

标签: php function definition defined


【解决方案1】:

您没有将结果作为参考传递。

你需要像这样定义你的函数:

function display_question($problem_id, $slide_num, $attempt, $admin_id, &$result)
                                                                        ^

【讨论】:

  • 或者,返回$result
【解决方案2】:

如果你希望函数修改它,你必须通过引用传递 $result。现在,您声明函数的方式 (function display_question($problem_id, $slide_num, $attempt, $admin_id, $result)) 对于所有参数都是按值传递的。试试这个:

function display_question($problem_id, $slide_num, $attempt, $admin_id, &$result)

还在这里阅读: http://php.net/manual/en/language.references.pass.php

【讨论】:

  • 哦,好的,我明白了。我对价值和参考感到困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多