PHP中的标头(';位置:';)未重定向
login.phpPHP中的标头(';位置:';)未重定向,php,header,location,Php,Header,Location,login.php <form class="form-signin" action="#" method="POST"> <span id="reauth-email" class="reauth-email"></span> <input type="text" name="usern" class="form-control" placeholder="Username">
<form class="form-signin" action="#" method="POST">
<span id="reauth-email" class="reauth-email"></span>
<input type="text" name="usern" class="form-control" placeholder="Username">
<input type="password" name="passw" class="form-control" placeholder="Password">
<div id="remember" class="checkbox">
<label>
<input type="checkbox" value="remember-me"> Remember me
</label>
</div>
<input onClick="myFunction()" class="btn btn-lg btn-primary btn-block btn-signin" type="submit" name="sub" value="Login">
</form>
记得我吗
PHP脚本
<?php
if(isset($_POST['sub']))
{
include('user.php');
$us = mysqli_real_escape_string($conn,$_POST['usern']);
$pw = mysqli_real_escape_string($conn,$_POST['passw']);
if(!empty($_POST['usern']) || !empty($_POST['passw']))
{
$query = "SELECT ID FROM myuser WHERE username = '$us' AND
password = SHA('$pw')";
$result = @mysqli_query($conn, $query);
$row = mysqli_fetch_array($result);
if($row)
{
header('Location: homepage.php');
exit;
}
else
{
echo '<script language="javascript">';
echo 'alert("Invalid Username/Password")';
echo '</script>';
}
}
else
{
echo '<script language="javascript">';
echo 'alert("Please enter Username/Password")';
echo '</script>';
mysqli_close($conn);
}
}
?>
不返回true
if($row !== false){
header("Location: homepage.php");
}
PHP 5.6及更高版本不支持带标题的重定向。
要解决此问题,请使用JavaScript重定向,如下代码
if($row){
echo '<script>window.location = "YOUR_URL";</script>';
}
if($row){
echo'window.location=“您的URL”;
}
尝试添加“http('s')(如果需要)://您的_domain/homepage.php尝试更改:
if($row) {
$row = mysqli_fetch_array($result);
if($row) {
致:
希望这能奏效
如果解决方案1不起作用,请尝试更改:
if($row) {
$row = mysqli_fetch_array($result);
if($row) {
致:
以及:
致:
)我终于解决了,伙计们!
我所做的就是抛弃mysqli,使用PDO。
这是我的新代码:
<?php
session_start();
$h = "localhost";
$u = "root";
$p = "";
$db = "user";
$msg = "";
try
{
$con = new PDO("mysql:host=$h; dbname=$db", $u, $p);
$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if(isset($_POST["sub"]))
{
if(empty($_POST["usern"]) || empty($_POST["passw"]))
{
$msg = "<label>Please enter username/password!</label>";
}
else
{
$sqlquery = "SELECT * FROM myuser WHERE username = :username AND password = :password";
$stat = $con->prepare($sqlquery);
$stat->execute(
array(
':username' => $_POST["usern"],
':password' => $_POST["passw"]
)
);
$countrow = $stat->rowCount();
if($countrow > 0)
{
$_SESSION["username"] = $_POST["usern"];
header("Location: homepage.php");
}
else
{
$msg = "<label>Invalid username/password</label>";
}
}
}
}
catch(PDOException $er)
{
$msg = $er->getMessage();
}
?>
将代码直接放在问题中。不要发布代码截图。好的,下次我不会这么做。对不起,我是新来的,这里有一个“编辑”“在你的问题下链接。您可以单击该按钮进行修改。请这次修复它,谢谢。请注意,SHA不是用于密码的安全哈希算法-它可以很容易地进行暴力搜索。mysqli\u fetch\u array
返回一个数组。如果($array)
且($array非空,则返回true
。瞧,谢谢,我不知道。:)无论如何,仍然有可能函数返回false。您是否试过将header()放在第一行以测试此函数是否有效?我会删除此答案,并将该注释放在问题下。@mpz,只是为了清楚起见。您的user.php是否包含任何回音?标题前不能有任何数据。@Nikitacunski user.php上没有回音,我尝试了上面的代码,它正在重定向到homepage.php,但现在“无效用户名/密码”的else不起作用!我将尝试修补此代码。。。我会让你知道它是否有效。这远不是真的-所有版本的PHP都支持HTTP头输出,包括Location
重定向。你能详细解释一下为什么你认为它不支持吗?是的,支持,但在这个版本中位置需要单独的模块,并且一些共享主机禁用了这个模块。我没听说过,Salar。据我所知,header()
是一个核心函数。它确实说,只有在使用支持标头的SAPI时,才能访问和输出标头-您发现什么配置不向客户端发送标头?你心目中有IIS/Windows吗?据我所知,共享PHP主机几乎总是在Linux上运行。伙计,这不是我的问题,我只是回答了“解决问题”,我的代码工作得很好:)JavaScript是一个比HTTP重定向更容易中断的解决方案。不走运!我的mysqli_fetch_数组即使更改为mysqli_num_rows,也不会返回TRUE。它不能返回布尔值。它返回您搜索的表中的行数组。解决方案#1通过检查“行数组”是否为空来返回布尔值。解决方案#2检查搜索表中的行数是否超过0。我的意思是,您提供的这两个解决方案不起作用,因为if-else语句没有返回true,我不知道为什么。。。无论如何,我只是使用PDO修复了它。我还找到了另一个修复方法,没有更改为PDO。只需将数据库密码类型更改为varchar(255),因为sha将加密您的密码,例如,您的123456789密码将为60到100个字符。(255用于将来的验证)这就是为什么我的获取数组不返回true,因为我的密码与sha加密的密码不匹配,因为我的数据库密码中只有varchar(40),这在散列密码时是不推荐的。