从函数调用时,Include语句有不同的行为吗?

时间:2011-12-31 09:48:48

标签: php

我得到了这个特殊代码的奇怪结果。让我以简短的方式解释我的自我,因为这是一个很长的代码。基本上这个洞就是这样的:

在我的脚本开头,我调用了我的类fg_membersite和一些常量:

require_once("registration/include/membersite_config.php");

之后,我检查一些POST变量,如果代码检测到错误,立即调用函数the_error()(位于同一个脚本上)。如果没有错误,则不会调用该函数并执行。

检查的一个例子:

$result=mysql_query("SELECT id FROM ".table_links." WHERE url = '".$fgmembersite->SanitizeForSQL($_POST['j_title'])."';");
if (mysql_num_rows($result)>0) {
the_error('The url '. siteurl .'/'. $_POST['j_title'].' is currently in use, please use another one.');
}

在进行一系列POST和SQL检查后,当我保存到数据库并打印结果消息时,有最后一部分:

$fgmembersite->DBLogin();
mysql_query("INSERT INTO " . table_links . " (id, usr_code, visits, url, datetime, type, description, secu_type, password, phone, address, email, photo, id_number) VALUES (NULL, '".$_SESSION['user_code']."', '0', '".$fgmembersite->SanitizeForSQL($_POST['j_title'])."', NOW(), '0', '".$fgmembersite->SanitizeForSQL($_POST['j_desc'])."', '".$secutype."', '".$mod_pass."', '".$phone_check."', '".$address_check."', '".$email_check."', '".$photo_check."', '".$id_check."');");
echo '<!DOCTYPE html>
<html lang="en">
<head>';
include("parts/head.php");
echo '</head>
<body>
<div id="footerfix">';
include("parts/header.php");
echo '<div class="container">
      <center><br><br><br><img src="css/img/ok.png"/></center>
      <div class="hero-unit">
        <center>
        <h2>Your track URL <a href="'. siteurl . '/' . $_POST['j_title'].'">'.siteurl . '/' . $_POST['j_title'].'</a> have been created.</h2>';
        if ($secutype==0){echo '<p>This url is public. Click <a href="profile.php">here</a> to return to your dashboard.</p>';}
        if ($secutype==1){echo '<p>This is a password protected url. Click <a href="profile.php">here</a> to return to your dashboard.</p>';}
        if ($secutype==2){echo '<p style="font-size:16px">The visitors of this URL will need an special QR code. We offer you two options:</p>
        <p>1. Download the <a href="http://chart.googleapis.com/chart?chs=70x70&cht=qr&chf=bg,s,FFFFFF00&chl='.$mod_pass.'">QR code image</a> and add it to your personal design <br>2. Or Download a ready to print business card model</p><br><p>Click <a href="profile.php">here</a> to return to your dashboard.</p>';}
        echo '</center>
      </div>
    </div>';
    include("parts/footer.php");
    echo '
    </div>
  </body>
</html>';
}

请考虑所有包含的文件,例如head.phpheader.php在加入fg_membersite之前需要加载the_error。到目前为止代码工作正常,但是如果函数head.php被调用,我会收到几个错误,告诉我header.phpthe_error没有找到加载的类。这是function the_error($error) { echo '<!DOCTYPE html> <html lang="en"> <head>'; include("parts/head.php"); echo '</head> <body> <div id="footerfix">'; include("parts/header.php"); echo '<div class="container"><center><br><br><br><img src="css/img/notok.png"/></center><div class="hero-unit"><center><h2>Error</h2>'; echo '<p>'.$error.'</p>'; echo '</center></div></div>'; include("parts/footer.php"); echo '</div></body></html>'; exit; }

the_error()

如您所见,{{1}}几乎与我用于打印结果的代码相同。那么,当我在函数外部调用include时,为什么include工作正常?好像当我在函数外部的PHP脚本中使用include时,它只是将代码从外部文件复制到原始脚本(这是我需要的),当我在函数中使用include时,它首先运行远程脚本然后添加结果(由于在使用include的脚本上加载了类,因此无效)。

如果我是对的并且知道代码流程,您如何建议解决此问题?

2 个答案:

答案 0 :(得分:0)

我的猜测是the_error函数位于不同目录中的不同文件中,因此您使用的include语句正在查找相对于当前文件的包含(即带有_error函数的文件),而不是找到它们。

一个简单的解决方案可能是定义一个常量,例如INCLUDES_BASE_PATH,并使用它来绝对地引用所有包含。

答案 1 :(得分:0)

如果我正确处理您的问题,可能是您尝试从函数内的全局范围访问变量(类的实例)。由于这些包含的文件是从函数内部加载的,因此它们只能访问该范围。

你可以使用:

global $fgmembersite;

the_error()身体内的第一行;