2015-04-23 106 views
0

我知道这可能是一个明显的答案,但我为PHP新手它不是这样!Php代码符号在执行后转义(Sublime编辑器)

我正在用HTML编写一个带有Sublime内部文件的php代码,并且执行了代码更改后的文件。 <>是用其逃逸字符编写的。帮助..请点击。

<?php 
$username= trim($_POST['username']); 
$pass= trim($_POST['pass']); 
$userExist= trim($_POST['userExist']); 
$passExist= trim($_POST['passExist']); 

// print_r($username); 
// print_r($pass); 

$conn= mysqli_connect('localhost','neli','','yogies'); 

// if(!$conn){ 
// echo "No database"; 
// exit; 
// }else { 
// // echo "Done"; 
// // } 

if(isset($username) && isset($pass)){ 
    $usernameCheck = mysqli_query($conn, 'SELECT username FROM users WHERE username="'.$username.'"'); 
    // print_r('SELECT username FROM users WHERE username="'.$username.'"'); 
    if($usernameCheck && $usernameCheck->num_rows){ 
     $check= 1; 
    } else { 
     $check=0; 
    } 
} 

if($check==0){ 

    $userToEnter =$username;  
    $userToEnter = mysqli_real_escape_string($conn, $userToEnter); 

    $passToEnter = $pass; 
    $passToEnter = mysqli_real_escape_string($conn, $passToEnter); 

    $sql = 'INSERT INTO users (username,password) VALUES ("'.$userToEnter.'","'.$passToEnter.'")'; 
    // print_r($sql); 

    if(mysqli_query($conn, $sql)){ 

     session_start(); 


     // print_r('here'); 
     // print_r($_POST['url']); 


     $doc = new DOMDocument(); 
     // html5 problems with tags 
     // libxml_use_internal_errors(true); 
     $doc->loadHTMLFile('header_nav.php'); 
     // html5 problems with tags 
     // libxml_clear_errors(); 

     $doc->getElementById('sign')->setAttribute('display','none'); 
     $doc->getElementById('logout')->setAttribute('display','block'); 
     $doc->saveHTMLFile('header_nav.php'); 

     // header('Location: '.$_POST['url']); 

    } 

}else{ 
    print_r('Nope'); 
} 

?> 



<!DOCTYPE html> 
<html class="wallpaper"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<link rel="stylesheet" type="text/css" href="./styles/css.css"> 
<title><?php echo $pageTitile ?></title> 
</head> 
<body> 
    <header><div class="top"> 
     <a href="index.php" id="logo"><img src="./pictures/logo.png" height="80px" width="80px"></a> 
     <a href="#" id="sign" name="sign" display="none">Log in</a> 
     <a href="#" id="logout" name="logout" display="block">Log out</a> 

     <nav><ul><li><a href="#">Yoga Poses</a></li> 
      <li class="subList"> 
       <span id="levels">Yoga Levels <img id="arrow" src="./pictures/arrow.png"></span> 
       <ul class="dropdown"><li><a href="index.html">All levels</a></li> 
        <li><a href="#">Level 1</a></li> 
        <li><a href="#">Level 2</a></li> 
        <li><a href="#">Level 3</a></li> 
        <li><a href="#">Level 4</a></li> 
       </ul></li> 
       <li><a href="./recipes.php">Healthy and Delicious</a></li> 
      </ul></nav></div> 

      <div id="overlay"> 
       <div id="background"></div> 

       <form id="loginForm" name="login" method="POST" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 

        <!-- <input type="hidden" name="url" value="<?php echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; ?>"> --> 

        <fieldset id="bordered"><legend>Register:</legend> 
         <p>Username:<input type="text" name="username"></p> 
         <p>Password:<input type="password" name="pass"></p> 
         <p>Repeat pass:<input type="password" name="pass2"></p> 
        </fieldset><fieldset><legend>Log in:</legend> 
        <p>Username:<input type="text" name="userExist"></p> 
        <p>Password:<input type="password" name="passExist"></p> 
       </fieldset><div class="btns"> 
       <button id="btnSubmit" class="btn" type="button" value="Submit">Submit</button> 
       <button class="btn" type="button" value="Cancel">Cancel</button> 
      </div> 
     </form> 
    </div> 
</header> 
</body> 
</html> 
+1

请张贴代码。 –

+0

我有在单独的文件中发送带隐藏的输入字段的网址,但它是做同样的事情。所以试图把一切都放在一个文件中 - 同样的东西... –

+0

是你的文件扩展名.php吗?另外,不要使用'htmlspecialchars',那将隐蔽'<'到HTML实体:??''< –

回答

1

它看起来像这个脚本正在修改本身,并使用DOMDocument来做到这一点。 PHP脚本不是有效的HTML/XML,所以DOMDocument破坏了代码 - 这不是Sublime的错误:)

让代码做你期望的方法是将HTML标头放入单独的文件中(如header_nav.html ),改为操纵它,然后让脚本将其输出给用户而不是保存它。

但是,使用DOMDocument修改文件可能会满足您的需求,并且该方法还存在其他问题。该文件被分配给每个人,因此只要有一个人登录,每个人都可以获得该header_nav。当你只需要改变内存中的代码并将其传递给该用户时,它也会写入磁盘。

一些更简单的是将有两个头HTML文件(如header_logged_in.phpheader_logged_out.php),然后让你的header_nav.php只是include('header_logged_in.php')如果用户登录,或include('header_logged_out.php')如果他们不。

其他一些注意事项:

  1. 永远不要从$_POST的东西,并把它直入一个SQL查询 - 你修剪它,但是这是没有安全可言。做到这一点的安全方式是使用预先准备的语句。看看PHP The Right Way如何做到这一点(这些例子使用PDO,这是我更熟悉,但如果你喜欢它,mysqli也可以)。

  2. 如果任$username$pass是空的,然后$check从未设置,所以你会得到一个PHP严格出错提示,告诉$check是未申报。你可以在if ($check == 0)…行之前加上$check = 0来解决这个问题。此外,使用truefalse而不是1和0,并===代替== - 尽管它的味道在这种情况下的问题,如果你这样做太别处那么它最终会咬你的。

  3. 它已被注释掉,但稍后的一行会有header(“Location:”。$ _ POST ['url']),这也不算什么 - 任何人都可以放入任何URL并将用户重定向到他们的网站。最好自己构建URL或者使用一组有效的URL并指向数组中的右键。

  4. 启动会话,但你不把任何东西在它(如...该用户是否登录,和他们的用户名是什么)。

0

请确保doc类型是.php而不是HTML。

单击语法高亮菜单并选择PHP,选择的语言是HTML,确保PHP被选中。

否则:

要编辑的喜好:

1) - 首选项==>浏览包...

2) - 转到HTML文件夹&打开 “HTML.tmLanguage”用文本编辑器

3) - 查找:

firstLineMatch

<string>&lt;!(?i:DOCTYPE)|&lt;(?i:html)|&lt;\?(?i:php)</string> 

,取而代之的是:

firstLineMatch

<string>&lt;!(?i:DOCTYPE)|&lt;(?i:html)</string> 

4) - 重新启动崇高的文本。

+0

那个。但仍然如此。 –