在PHP中获取意外的文件结尾错误

在PHP中获取意外的文件结尾错误,php,mysql,database,printing,Php,Mysql,Database,Printing,我正在学习PHP,目前正在尝试使用PHP打印MYSQL表的内容。我一直得到以下错误 解析错误:语法错误,第53行C:\xampp\htdocs\login2.php中的文件意外结束 第53行是标记 这是我的密码: <html> <head> </head> <body> <?php $userName = $_POST["userName"]; $password = $_POST["passwd"]; $firstName =

我正在学习PHP,目前正在尝试使用PHP打印MYSQL表的内容。我一直得到以下错误

解析错误:语法错误,第53行C:\xampp\htdocs\login2.php中的文件意外结束

第53行是
标记

这是我的密码:

    <html>
<head>
</head>
<body>


<?php

$userName = $_POST["userName"];
$password = $_POST["passwd"];
$firstName = $_POST["firstName"];
$lastName = $_POST["lastName"];

$db_host = "localhost";
$db_username = "root";
$db_name = "labdb";

$con=@mysqli_connect("localhost","root","","labdb");

if(mysqli_connect_errno())
    {
    echo "Failed MySQL connect" . mysqli_connect_error();   
    }


$sql="INSERT INTO user (username, password, firstName, lastName)
VALUES
('$_POST[userName]','$_POST[passwd]','$_POST[firstName]','$_POST[lastName]')";

if (!mysqli_query($con,$sql))
  {
  die('Error: ' . mysql_error());
  }
echo "1 record added";

$query="SELECT * FROM user";

$result=mysql_query($query);

while($row = mysql_fetch_array($result)){
  echo $row['userID'] . " " .$row['username'] . " " . $row['password'] . " " . 
       $row['firstName'] . " " . $row['lastName'];
  echo "<BR/>";


mysqli_close($con);

?>

</body>
</html>


除了缺少
}
的初始语法错误之外,这段代码中还有一大堆错误

  • 您正在定义一组变量,
    $userName
    $db\u host
    等,但以后在代码中不使用它们

  • 确保HTML代码始终以doctype开头。将
    添加到
    标记上方,作为代码的第一行

  • INSERT
    查询的代码有几个单独的错误:

    »
    $\u POST[passwd]
    :使用数组键时,必须引用键名。如果您不这样做,PHP会处理,但会抛出警告消息,并且在某些情况下可能会出错。如果在这样的字符串中使用数组键,还需要将其用大括号括起来以使其有效。正确的语法如下所示:

    $stringVar = "..... `{$_POST["passwd"]}`....";
    
    »但是不要在这里使用这种语法,因为还有更多:您也不应该在SQL查询字符串中直接使用
    $\u POST
    变量,并且必须对添加到查询字符串中的任何变量进行转义。否则将导致您的代码被黑客攻击

    这里有太多的内容需要详细介绍(我没有时间写完整的教程),但请在谷歌上搜索“SQL注入攻击”之类的内容以及如何避免它们。您可以使用
    mysqli\u real\u escape\u string()
    对字符串进行转义,也可以使用“准备好的语句”。我推荐后者,但正如我所说的谷歌

  • 另一个带有密码的项目:永远不要在数据库中以纯文本形式存储密码。始终使用高质量的哈希算法来隐藏密码,以防黑客攻击。这也是一个非常大的主题,我在这里无法详细描述,但对用户的安全至关重要

  • 在程序进行到一半时,您可以从使用
    mysqli
    函数切换到
    mysql
    函数。请注意,这两组函数互不兼容。您使用
    mysqli
    打开了数据库,这意味着
    mysql\u query
    不会看到这一点,并且会抱怨数据库没有打开

    确保在整个代码中始终使用相同的DB函数集。
    mysql
    函数已经过时,因此我建议始终坚持使用
    mysqli

  • 您的
    while
    循环末尾没有结束的
    }

    这就是导致PHP抱怨的实际错误的原因,但是如果您只是修复了这个问题,您仍然会遇到其他问题,而PHP可能不会真正抱怨所有这些问题;其中一些会导致您的代码运行正常,但出现错误

  • [编辑]
    顺便说一句,既然你说你只是在学习PHP,请不要为这些错误感到难过;这些都是初学者可能会犯的错误

    但是,我建议你一定要使用高质量的教程网站来学习。有很多网站都有PHP代码示例,但其中很大一部分都有质量差的示例和不好的建议。大部分原因只是因为它们已经严重过时了

    在哪些网站上学习你的研究。以下是几点建议:

    • 如果一个站点建议使用
      mysql\u xxx()
      函数,那么它们已经过时了。最新的站点应该讨论数据库访问的
      mysqli
      PDO
    • 如果一个网站建议在不使用密码的情况下保存密码,那么你应该忽略他们所说的一切。安全很重要
    • 如果一个站点建议使用
      md5()
      函数散列密码,那么它们就过时了。MD5已经过时了。寻找推荐新的
      password\u hash()和
      password\u verify()函数的网站
    • 寻找在PHP社区中受到尊重并保持最新的站点。试着从
    • 如果你用一本书来学习,同样的道理也适用:确保它是最新的。如果它是在几年前出版的,那么它可能不是
    只需在循环时关闭}。
    将您的while替换为
    while($row=mysql\u fetch\u数组($result)){
    echo$row['userID']。.$row['username']。.$row['password']。“”。
    $row['firstName']。“”.$row['lastName'];
    回声“
    ”; }

    希望它能帮助你:)

    你没有像在while循环之后那样关闭while循环。你的代码中充满了SQL注入、明文密码以及
    mysql\uu
    mysqli\u
    的随机混合。请修复所有这些。这么多的错误,这么少的时间。我已经给出了一个答案,涵盖了我在空闲的几分钟内发现的所有内容,但我怀疑还有更多我可以说的。您可能想在第4节中添加“不要使用MD5,忽略所有告诉您使用MD5的站点”:-)
    Just close while loop with }.
    
    Replace your while with
    while($row = mysql_fetch_array($result)){
      echo $row['userID'] . " " .$row['username'] . " " . $row['password'] . " " . 
           $row['firstName'] . " " . $row['lastName'];
      echo "<BR/>";
    }