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><!(?i:DOCTYPE)|<(?i:html)|<\?(?i:php)</string>
并将其替换为:
firstLineMatch
<string><!(?i:DOCTYPE)|<(?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.php
和 header_logged_out.php
),然后让您的 header_nav.php
只是 include('header_logged_in.php')
如果用户已登录,或者 include('header_logged_out.php')
如果他们没有。
一些其他注意事项:
永远不要从 $_POST
中获取某些东西并将其直接放入 SQL 查询中 - 你 trim 它,但这根本不安全。安全的方法是使用准备好的语句。查看 PHP The Right Way 了解如何执行此操作(示例使用 PDO,这是我更熟悉的,但如果您愿意,mysqli 也可以)。
如果 $username
或 $pass
为空,则永远不会设置 $check
,因此您会得到 PHP 严格错误提示你 $check
未申报。您可以在 if ($check == 0)…
行之前添加 $check = 0
来解决这个问题。此外,使用 true
和 false
代替 1 和 0,并使用 ===
代替 ==
- 虽然在这种情况下这是一个品味问题,如果你在其他地方也这样做然后它最终会咬你。
它被注释掉了,但后面的一行 header(“Location: “.$_POST['url']) 这也有点糟糕 - 任何人都可以将任何 URL 放入其中并将您的用户重定向到他们的站点。最好自己构建 URL 或使用有效 URL 的数组并指向数组中的正确键或其他东西。
你启动了session,但你没有在里面放任何东西(比如……用户是否登录,他们的用户名是什么)。
我知道这可能是一个答案很明显的问题,但对于 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><!(?i:DOCTYPE)|<(?i:html)|<\?(?i:php)</string>
并将其替换为:
firstLineMatch
<string><!(?i:DOCTYPE)|<(?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.php
和 header_logged_out.php
),然后让您的 header_nav.php
只是 include('header_logged_in.php')
如果用户已登录,或者 include('header_logged_out.php')
如果他们没有。
一些其他注意事项:
永远不要从
$_POST
中获取某些东西并将其直接放入 SQL 查询中 - 你 trim 它,但这根本不安全。安全的方法是使用准备好的语句。查看 PHP The Right Way 了解如何执行此操作(示例使用 PDO,这是我更熟悉的,但如果您愿意,mysqli 也可以)。如果
$username
或$pass
为空,则永远不会设置$check
,因此您会得到 PHP 严格错误提示你$check
未申报。您可以在if ($check == 0)…
行之前添加$check = 0
来解决这个问题。此外,使用true
和false
代替 1 和 0,并使用===
代替==
- 虽然在这种情况下这是一个品味问题,如果你在其他地方也这样做然后它最终会咬你。它被注释掉了,但后面的一行 header(“Location: “.$_POST['url']) 这也有点糟糕 - 任何人都可以将任何 URL 放入其中并将您的用户重定向到他们的站点。最好自己构建 URL 或使用有效 URL 的数组并指向数组中的正确键或其他东西。
你启动了session,但你没有在里面放任何东西(比如……用户是否登录,他们的用户名是什么)。