我得到了这个特殊代码的奇怪结果。让我以简短的方式解释我的自我,因为这是一个很长的代码。基本上这个洞就是这样的:
在我的脚本开头,我调用了我的类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.php
和header.php
在加入fg_membersite
之前需要加载the_error
。到目前为止代码工作正常,但是如果函数head.php
被调用,我会收到几个错误,告诉我header.php
和the_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的脚本上加载了类,因此无效)。
如果我是对的并且知道代码流程,您如何建议解决此问题?
答案 0 :(得分:0)
我的猜测是the_error函数位于不同目录中的不同文件中,因此您使用的include语句正在查找相对于当前文件的包含(即带有_error函数的文件),而不是找到它们。
一个简单的解决方案可能是定义一个常量,例如INCLUDES_BASE_PATH,并使用它来绝对地引用所有包含。
答案 1 :(得分:0)
如果我正确处理您的问题,可能是您尝试从函数内的全局范围访问变量(类的实例)。由于这些包含的文件是从函数内部加载的,因此它们只能访问该范围。
你可以使用:
global $fgmembersite;
在the_error()
身体内的第一行;