Php $\会议困难

Php $\会议困难,php,redirect,login,session,Php,Redirect,Login,Session,我正在创建一个登录脚本,该脚本将名为$userid的变量的值存储到$\u SESSION[“userid”]中,然后将用户重定向回主页(一个次要问题是如何将它们发送回原来的位置?) 但是,当我回到该页面时,我会回显会话id()和会话[“userid”]的值,并且只显示会话id。我突然想到,可能我的重定向页面需要在顶部,但如果这是真的,那么每次我在响应它的页面上结束时,我正在响应的会话id都会改变。以下是脚本: <?php session_start(); include_once(

我正在创建一个登录脚本,该脚本将名为
$userid
的变量的值存储到
$\u SESSION[“userid”]
中,然后将用户重定向回主页(一个次要问题是如何将它们发送回原来的位置?)

但是,当我回到该页面时,我会回显会话id()和会话[“userid”]的值,并且只显示会话id。我突然想到,可能我的重定向页面需要在顶部,但如果这是真的,那么每次我在响应它的页面上结束时,我正在响应的会话id都会改变。以下是脚本:

    <?php
session_start();
include_once("db_include.php5");
doDB();
//check for required fields from the form
if ((empty($_POST['username']) && empty($_POST['email'])) || empty($_POST['password'])) {
header("Location: loginform.php5");
exit;
}   else if($_POST["username"] && $_POST["password"]){

    //create and issue the query
    $sql = "SELECT id FROM aromaMaster WHERE username='".$_POST["username"]."' AND password=PASSWORD('".$_POST["password"]."')";
    $sql_res =mysqli_query($mysqli, $sql) or die(mysqli_error($mysqli));

    //get the number of rows in the result set; should be 1 if a match
    if(mysqli_num_rows($sql_res) != 0) {
      //if authorized, get the userid
      while($info = mysqli_fetch_array($sql_res)) {
        $userid = $_info["id"];
      }
      //set session variables
      $_SESSION['userid'] = $userid;

      mysqli_free_result($sql_res);
      //redirect to main page
      header("Location: loginredirect.php5");
      exit; }
    } else if($_POST["email"] && $_POST["password"]) {

          //create and issue the query
    $sql = "SELECT id FROM aromaMaster WHERE email='".$_POST["email"]."' AND password=PASSWORD('".$_POST["password"]."')";
    $sql_res =mysqli_query($mysqli, $sql) or die(mysqli_error($mysqli));

    //get the number of rows in the result set; should be 1 if a match
    if(mysqli_num_rows($sql_res) != 0) {

      //if authorized, get the userid
      while($info = mysqli_fetch_array($sql_res)) {
        $userid = $_info["id"];
      }
      //set session variables
      $_SESSION['userid'] = $userid;

      mysqli_free_result($sql_res);

      //redirect to main page
      header("Location: loginredirect.php5");
      exit;}
      } else {
      //redirect back to login form
      header("Location: loginform.php5");
      exit;
    }
    mysqli_close($mysqli);
?>

您需要调用
会话\u write\u close()
来存储会话数据更改


旁白:您可以使用
$SERVER[“HTTP REFERER”]
重定向回去,如果它是由浏览器填充的

您需要调用
会话写入关闭()
来存储会话数据更改


旁白:如果是由浏览器填充的,您可以使用
$SERVER[“HTTP REFERER”]
重定向回去

while($info = mysqli_fetch_array($sql_res)) {
    $userid = $_info["id"];
}
while($info = mysqli_fetch_array($sql_res)) {
    $userid = $info["id"];
}
应该在哪里执行此操作:

while($info = mysqli_fetch_array($sql_res)) {
    $userid = $_info["id"];
}
while($info = mysqli_fetch_array($sql_res)) {
    $userid = $info["id"];
}

您正在这样做:

while($info = mysqli_fetch_array($sql_res)) {
    $userid = $_info["id"];
}
while($info = mysqli_fetch_array($sql_res)) {
    $userid = $info["id"];
}
应该在哪里执行此操作:

while($info = mysqli_fetch_array($sql_res)) {
    $userid = $_info["id"];
}
while($info = mysqli_fetch_array($sql_res)) {
    $userid = $info["id"];
}
确保:

   <?php
   session_start();
确保:

   <?php
   session_start();


哦,顺便说一下,你在代码中两次输入了相同的错误,所以请确保在这两个点上都进行了更改!这两个循环不是都相同吗?不,请注意从$u info['id']到$info['id']的变化,我的答案是调试最终会发现的-但是是的,会话值设置错误,所以会话值回显错误。哈,我知道有两个相同:)它们是相同的,但是,如果用户输入了用户名和密码,则第一个有效;如果用户只输入了电子邮件地址和密码,则第二个有效。我本可以将其转化为一次条件,然后决定在其中进行查询,但这种方法更简单。谢谢,伙计们!哦,顺便说一下,您在代码中两次输入相同的错误,所以请确保在这两个点上都进行了更改!这两个循环不是都相同吗?不,请注意从$u info['id']到$info['id']的变化,我的答案是调试最终会发现的-但是是的,会话值设置错误,所以会话值回显错误。哈,我知道有两个相同:)它们是相同的,但是,如果用户输入了用户名和密码,则第一个有效;如果用户只输入了电子邮件地址和密码,则第二个有效。我本可以将其转化为一次条件,然后决定在其中进行查询,但这种方法更简单。谢谢,伙计们!谢谢,我会调查推荐人的事。不过,我不妨问一下,“如果由浏览器填写”是什么意思?应该为您调用session_write_close()。在某些(大多数?)浏览器中,您可以告诉浏览器不要发送referer头。例如,在firefox中,将network.http.sendRefererHeader值设置为0以禁用发送引用程序。啊,我明白了。所以,我只需要使用标题(“Location:”.$\u SERVER[“HTTPREFERER”]。”)?谢谢,我会调查推荐人的事。不过,我不妨问一下,“如果由浏览器填写”是什么意思?应该为您调用session_write_close()。在某些(大多数?)浏览器中,您可以告诉浏览器不要发送referer头。例如,在firefox中,将network.http.sendRefererHeader值设置为0以禁用发送引用程序。啊,我明白了。所以,我只需要使用标题(“Location:”.$\u SERVER[“HTTPREFERER”]。”)?应该注意的是,您所做的工作会使您面临SQL注入攻击。这不是你使用mysqli的方式。绑定参数,而不是使用字符串连接。看吧,嗯,我会仔细阅读的。问题是,在我的表单onkeyup中键入字段时,会运行一个脚本来清理输入,只允许0-9a-zA-z_-。@(取决于字段的用途,但这是它得到的最自由的字段)。所以,没有()-+"';:&|$, 任何人都可以做什么?该脚本在客户端上运行。它可以被禁用,也可以伪造请求。客户端验证只是一种方便。永远不要依赖于客户端验证。你必须经常检查服务器。啊,说得好。好的,在发送之前,我将通过另一个正则表达式运行字符串,然后使用mysqli_real_escape_string()进行清理,然后在读取它时,我必须使用htmlspecialchars进行清理,对吗?htmlspecialchars()或htmlentities(),如果将其发送回客户端。您可以使用mysql_real_escape_string(),但该步骤隐含在bind_param()方法调用中,imho是一种更好的模式。应该注意的是,您所做的操作会使您面临SQL注入攻击。这不是你使用mysqli的方式。绑定参数,而不是使用字符串连接。看吧,嗯,我会仔细阅读的。问题是,在我的表单onkeyup中键入字段时,会运行一个脚本来清理输入,只允许0-9a-zA-z_-。@(取决于字段的用途,但这是它得到的最自由的字段)。所以,没有()-+"';:&|$, 任何人都可以做什么?该脚本在客户端上运行。它可以被禁用,也可以伪造请求。客户端验证只是一种方便。永远不要依赖于客户端验证。你必须经常检查服务器。啊,说得好。好的,在发送之前,我将通过另一个正则表达式运行字符串,然后使用mysqli_real_escape_string()进行清理,然后在读取它时,我必须使用htmlspecialchars进行清理,对吗?htmlspecialchars()或htmlentities(),如果将其发送回客户端。您可以使用mysql_real_escape_string(),但该步骤隐含在bind_param()方法调用中,imho是一种更好的模式。