2011-12-31 6 views
0

私はこの特定のコードで奇妙な結果を得ています。長いコードなので、私は自分の短所を説明しましょう。基本的に穴の事は次のように動作します。関数から呼び出されたときのステートメントを含む動作が異なりますか?

私のスクリプトの冒頭では、私は私のクラスfg_membersiteといくつかの定数を呼び出す:その後

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

コードはすぐに何かを間違って検出した場合、私は、いくつかのPOST変数を確認します関数the_error()(同じスクリプトにあります)を呼び出します。エラーがなければ、関数への呼び出しはなく、実行は終了します。

チェックの例:

$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>'; 
} 

がでください:私は、データベースに保存し、結果メッセージを印刷するとき、POSTおよびSQLの一連の後

$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.'); 
} 

は、最終的な部分がありますチェックhead.phpheader.phpのようなインクルードされたすべてのファイルを含める前にfg_membersiteがロードされている必要があることを考慮してください。今までのコードは正常に動作しますが、関数the_errorが呼び出された場合は、head.phpheader.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()は、私は結果を印刷するために使用し、ほぼ同じコードです。だから、私が関数の外でそれらを呼び出すと、インクルードがうまくいくのはなぜですか?関数の外でPHPスクリプトにインクルードを使用すると、外部ファイルから元のスクリプト(必要なもの)にコードがコピーされ、関数内でインクルードを使用すると、まずリモートスクリプトが実行され、次に結果を追加します(これは、クラスがインクルードを使用するスクリプトにロードされるため機能しません)。

私が正しいとコードフローを知っているなら、この問題を解決するにはどうすればよいですか?

+0

FWIWでは、HTMLとPHPを分けてください。 –

答えて

0

問題を正しく解決できない場合は、関数内のグローバルスコープから変数(クラスのインスタンス)にアクセスしようとしている可能性があります。これらのインクルードされたファイルは関数内からロードされるため、そのスコープにしかアクセスできません。

あなただけ使用することができます。

global $fgmembersite; 

を最初の行でthe_error()本体の内部;

0

私の推測では、the_error関数は別のディレクトリにある別のファイルにあるため、使用するインクルードステートメントは現在のファイル(つまりthe_error関数を持つファイル)に対するインクルードを探しています。

単純な解決策は、INCLUDES_BASE_PATHなどの定数を定義し、すべての包含を絶対に参照することです。

+0

ありがとう、しかし、私が前に言ったようなthe_error関数は、印刷コードと同じファイルにあります。 – DomingoSL

+0

申し訳ありませんが、それを逃した。実際のエラーは何ですか? – liquorvicar

関連する問題