【问题标题】:Why on Xampp header works but on online webhost doesnt work?为什么在 Xampp 标头上有效,但在在线虚拟主机上无效?
【发布时间】:2021-07-01 09:14:37
【问题描述】:

有什么错误吗? 这个 fikle 是用户注册后去的地方,但是当我在网上上传我的文件时,webhsot 不能正常工作,它会堆叠在页面上并向我显示一个白页,但是注册进入数据库,所以问题是为什么标题没有工作吗?

<?php 
    session_start();
    
    $fname = $_POST['fname'];
    $lname = $_POST['lname'];
    $username = $_POST['username'];
    $email = $_POST['email'];
    $p1= $_POST['password'];
    $password = password_hash($p1,PASSWORD_DEFAULT);
    $host = "localhost";
    $dbname = "id12725183_rentanythingusers";
    $dbuser = "id12725183_root";
    $dbport = 3306;
    $dbpass = "PRi~r99B)Dd1xdKM";

    $dsn = "mysql:host={$host};dbname={$dbname};port={$dbport}charset=utf8mb4";
    if(empty($fname)  ){
        header("location:User.php?error=Το όνομα είναι υποχρεωτικό!!#logariasmos");
    }else if(empty($lname)){
        header("location:User.php?error=Το επίθετο είναι υποχρεωτικό!!#logariasmos");
    }else if(empty($username)){
        header("location:User.php?error=Το username είναι υποχρεωτικό!!#logariasmos");
    }else if(empty($email)){
        header("location:User.php?error=Το email είναι υποχρεωτικό!!#logariasmos");
    }else if(password_verify("", $password)){
        header("location:User.php?error=Ο κωδικός είναι υποχρεωτικός!!#logariasmos");
    }else if( strlen($username)<6 ){
        header("location:User.php?error=Το username πρέπει να αποτελείτε απο τουλάχιστον 6 ψηφία!!#logariasmos");
    }else if( strlen($p1)<6){
        header("location:User.php?error=Το password πρέπει να αποτελείτε απο τουλάχιστον 6 ψηφία!!#logariasmos");
    }else{
        try{
            $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ];
            $pdo = new PDO($dsn, $dbuser, $dbpass, $options);
            $stmt = $pdo->prepare('INSERT INTO rentanythingregistered(fname, lname, username, email, password) VALUES(:fname, :lname, :username, :email, :password)');
            $stmt->execute(["fname"=>$fname, "lname"=>$lname, "username"=>$username, "email"=>$email, "password"=>$password]);
            $_SESSION['ifregistered']=1;
            header('location:User.php?message=Η εγγραφή σας ήταν επιτυχης, μπορείτε να συνδεθείτε στον λογαριασμό σας!');
        }catch(PDOException $e){
            if ($e->errorInfo[1] === 1062) {
                header("location:User.php?error=Το email ή το password, χρησιμοποιείτε ήδη!!#logariasmos");
            }
            else{
                header("location:User.php?error=Connection failed: . $e->getMessage()!#logariasmos");
            }
        }
    } 
?>  

【问题讨论】:

    标签: php html sql


    【解决方案1】:

    这不会回答你的问题,但我想给你一些关于你的代码的反馈。

    1. 而不是做

      $fname = $_POST['fname'];
      $lname = $_POST['lname'];
      $username = $_POST['username'];
      $password = $_POST['password'];
      

      只需使用extract($_POST):它只会创建名为 您作为参数传递的数组的索引read more here

    2. 如果此脚本用于注册,则无需使用 密码验证()。事实上你应该在用户尝试时使用它 登录。而且您使用不当,因为第一个 参数必须是非散列密码,第二个是散列 密码read more here

    3. 在 url 中添加空格不是一个好习惯。你应该使用 像破折号这样的字符来分隔网址中的单词,所以它会是 最好换这个

      header("location: /example_page.php?error=username cannot be empty")
      

      有了这个

      header("location: /example_page.php?error=username-cannot-be-empty")
      

    【讨论】:

    • 在这种情况下使用 extract(...) 会导致安全漏洞(例如,可以覆盖比我们想要的更多的变量)。
    • 我没有注意到文档中的警告信息,请问为什么会是安全漏洞?
    • 对不起,实际上将用户输入转换为变量并希望它们不会覆盖任何重要的东西总是一个安全漏洞。
    • 非常感谢我的朋友,我是初学者,你给了我非常有用的建议!
    【解决方案2】:

    如果我理解正确,那么除了重定向标头之外,一切正常。

    即使在您的本地也可以正常工作。

    问题可能出在路径和/或 URL 上,我的意思是,虽然“User.php”适合您的本地用户,但您不应该期望它在任何地方都能使用。

    1. 改用“/User.php”。
    2. 大多数服务器都区分大小写,确保User.php 与文件名完全相同。
    3. 如果没有其他方法,请尝试resolving-address 喜欢:
    function resolveUrl($suffix){
      return sprintf(
        "%s://%s%s/$suffix",
        isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http',
        $_SERVER['SERVER_NAME'],
        $_SERVER['REQUEST_URI']
      );
    }
    
    
    $userUrl = resolveUrl('User.php');
    

    并在其他任何地方使用 $userUrl 变量,例如:

    header("location:$userUrl?error=Το όνομα είναι υποχρεωτικό!!#logariasmos");
    

    【讨论】:

    • 我的朋友,我是 100% studpi,问题出在第一行。它是空的,我从第二行开始我的代码,这是问题!!!!
    • 很好,您可以修复它,但如果我的帖子中没有与解决它相关的内容,请说清楚(我会删除我的答案)。
    猜你喜欢
    • 1970-01-01
    • 2019-11-29
    • 2014-05-01
    • 2021-10-04
    • 2021-06-11
    • 2017-07-13
    • 2014-05-22
    • 2018-05-16
    • 2013-10-21
    相关资源
    最近更新 更多