【问题标题】:header() in php is not redirectingphp中的header()没有重定向
【发布时间】:2013-11-04 03:29:46
【问题描述】:

我有一个包含表单的登录页面。登录数据被发送到一个 php 脚本中,以检查用户是否存在于数据库中。如果成功,它应该重定向。

这是我的代码:

<?php

$host="localhost:8889"; // Host name
$username="root"; // Mysql username
$password="root"; // Mysql password
$db_name="TableName"; // Database name
$tbl_name="Users"; // Table name

// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");

// username and password sent from form
$myusername=$_POST['myusername'];
$mypassword=$_POST['mypassword'];

// To protect MySQL injection (more detail about MySQL injection)
$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);


$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'";
$result=mysql_query($sql);

// Mysql_num_row is counting table row
$count=mysql_num_rows($result);

// If result matched $myusername and $mypassword, table row must be 1 row

if($count==1){
// Register $myusername, $mypassword and redirect to file
  session_register("myusername");
  session_register("mypassword");
  header("location:../main.php");
  die();
}
else {
  echo "Wrong Username or Password";
}
?>

计数为 1,但不会发生重定向。

我已阅读this great answer 并检查了以下内容:

  1. 开始标签前没有空格,我也没有其他回显或打印。
  2. 我尝试在打开 php 标记后放置 ob_start,但它也不起作用。

我不明白 BOM 的内容。你能帮我解决这个问题吗?

我过去一直使用完全相同的代码并且它可以工作,现在我在 mamp 上并且 mac 不工作。

谢谢。

编辑:

我按照人们所说的做了,在修复了这些事情并启用了报告之后,问题是:

Call to undefined sesion_register.

所以,我改变了它,因为它没有定义也没有被弃用,现在可以工作了!谢谢大家!

【问题讨论】:

  • mysql_* 折旧,session_register 折旧...
  • header() 中使用相对路径通常不是一个好主意
  • 代码太旧了。尝试使用新的非弃用函数更新代码。
  • 将此代码添加到页面顶部以显示所有错误 error_reporting(E_ALL); ini_set('display_errors', '1');

标签: php header


【解决方案1】:

试试这个:

header("Location: http://localhost:8889/main.php");

Location 应该有一个大写的 L,尝试使用绝对 URI 总是好的。

编辑

阅读此link 后,最好检查一下您的php.ini 中是否启用了output_buffering。然后将ob_start()ob_end_flush() 分别放在文件的顶部和底部。

【讨论】:

  • 并在: 后面加一个空格。通常我会在header('Location: ...') 之后调用exit(),而不是die(),尽管它们的工作方式相同。
  • 虽然这个答案展示了很好的技术,但它不太可能真正解决 OP 的问题。 HTTP 标头不区分大小写,空格是可选的,所有浏览器都支持相对 URL,即使它不在规范中。
  • stackoverflow.com/questions/12033257/… 这似乎几乎是完全相同的副本,即使它是由其他人提出的。连代码都差不多。
【解决方案2】:

首先,您没有使用变量。您在引号中使用实际值。而不是:

mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");

应该是:

mysql_connect($host, $username, $password)or die("cannot connect");
mysql_select_db($db_name)or die("cannot select DB");

【讨论】:

  • 其实,只要你使用双引号,PHP 就会输入适当的值。在单引号中,它将输出文字字符串。
  • 好的,但这不是问题如果我在 if 条件中放置一个回显,它就会被打印出来。
【解决方案3】:

请在位置上大写“L”。如果这不起作用,请尝试以下操作;
您可以使用 headers_sent() 检查错误

// If no headers are sent, send one
if (!headers_sent()) {
    header('Location: ../main.php');
    exit;
}


或者你可以在 php 上尝试 javascript

<?php
echo "<script>window.location='../main.php'</script>";
?>

希望对你有帮助...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 2021-02-16
    相关资源
    最近更新 更多