Php 执行后转义的代码符号(Sublime 编辑器)

Php code symbols escaped after execution (Sublime editor)

我知道这可能是一个答案很明显的问题,但对于 php-新手来说,这不是!

我正在用 Sublime 和 html 一起在一个文件中编写 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>

确保文档类型是 .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) - 重启 Sublime Text。

看起来这个脚本正在修改自身,并使用 DOMDocument 来完成。 PHP 脚本无效 HTML/XML,所以 DOMDocument 破坏了代码——这不是 Sublime 的错 :)

让代码按照您期望的方式执行的方法是将 header HTML 放入单独的文件(如 header_nav.html),然后对其进行操作,然后制作您的脚本将其输出给用户而不是保存它。

但是使用 DOMDocument 修改文件可能超出了您的需要,并且该方法还存在其他问题。该文件会提供给每个人,因此只要一个人登录,每个人都会得到 header_nav。当您真正需要更改内存中的代码并将其传递给该用户时,它也会写入磁盘。

更简单的方法是拥有两个 header html 文件(例如 header_logged_in.phpheader_logged_out.php),然后让您的 header_nav.php 只是 include('header_logged_in.php') 如果用户已登录,或者 include('header_logged_out.php') 如果他们没有。

一些其他注意事项:

  1. 永远不要从 $_POST 中获取某些东西并将其直接放入 SQL 查询中 - 你 trim 它,但这根本不安全。安全的方法是使用准备好的语句。查看 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. 你启动了session,但你没有在里面放任何东西(比如……用户是否登录,他们的用户名是什么)。