PHP意外结束


PHP unexpected end

假设一个有效的登录名被POST,那么我的代码在setcookie函数之前立即结束时会出现一些问题。这是我的密码。

<?php
echo 'v1.3.4';
require_once '../ssi/mysql.php';
if(isset($_POST['action'])){
$username = $_POST['username'];
$password = md5($_POST['password']);
$check = mysqli_query($con, "SELECT * FROM admins WHERE username = '$username' AND password = '$password' LIMIT 1");
$checknm = mysqli_num_rows($check);
if($checknm == 1){
    while($info = mysqli_fetch_array($check)){
        $keypair = $info['keypair'];
        setcookie("f2admin", $keypair, time()+3600);
        header('Location: index.php');
        exit;
    }
}else{
    $err = "Invalid Username or Password. Please try again.";
}
}
?>

在使用header 之前,您需要删除/注释echo的任何内容

if($checknm == 1){
    while($info = mysqli_fetch_array($check)){
        $keypair = $info['keypair'];
        //echo 'Keypair: '.$keypair;
        setcookie("f2admin", $keypair, time()+3600);
        header('Location: index.php');
        echo 'YES ';
        exit;
        echo 'NO ';
    }
}

好吧,我注意到了一些事情。

  1. header()设置在echo 'YES';之上,这意味着页面将在输出内容(回显)之前重定向。

  2. exit;设置在echo 'NO';之上,这意味着页面将在到达echo 'No';之前退出。

  3. header()上方有一个回声集,导致header()重定向不起作用。

顺便说一句,如果你试图停止while循环,函数应该是break;,而不是exit;


更新

我让它在我当地的环境中正常工作。我发现了一些东西。

1) 表单中没有设置任何操作(不确定是否需要)。

2) $err永远不会被回显(因此是空白页),但是代码本身确实有效。

3) mysqli_fetch_array循环是多余的,因为您强制mysql将结果限制为1。

$info = mysqli_fetch_array($check);
$keypair = $info['keypair'];
setcookie("f2admin", $keypair, time()+3600);
header('Location: index.php');
exit;

在使用header执行任何操作之前,您的代码都不能输出任何内容。输出必须在标头信息之后。