php应用程序验证登录

标签 php mysql

尝试了解如何在 php 中处理登录的表单。看起来很笨拙,希望有更好的方法。

假设用户登录是用户 ID 和密码。 如果他们在表单上输入信息,我就会跳转到下一页:

<?php
if (isset($_POST["id"])) {
   $con=mysqli_connect("localhost","user","pw","db");
   $codeFile = $_POST["filename"];
   $id = $_POST["id"];
   $fname = $_POST["fname"];
   $lname = $_POST["lname"];
   $res = mysqli_query($con, "SELECT COUNT(*) from users where id='$id' and fname='$fname' and lname='$lname'");
   $row = mysqli_fetch_array($res);
   $count = $row[1];
   if ($count == 1) {
     header("submit.php");
     die();
   }
   $res = $con->query('INSERT INTO log values ($id, now(), $codeFile)');
}
?>

理论上,如果由于存在匹配的用户而恰好返回一行,则上述代码应该仅跳转到submit.php。好像不行。

  1. 如何请求返回第一列?它没有名称,因为它不是命名列。

  2. 我不敢相信完成一个简单的查询需要多少条语句,PHP 中有没有更好的方法? Java servlet 有一些漂亮的快捷方式,例如带有受影响行数的整数返回代码等等。

  3. 如果这有效,我想做一个插入。当然最好是做一个组合语句并根据插入的行数(1或0)进行测试

    $res = $con->query('INSERT INTO 日志值 ($id, now(), $codeFile)');

是否有任何方法可以将其合并到单个查询中,如果成功则返回 true?

最佳答案

我建议您使用 SELECT * 或实际列本身,而不是 COUNT(*)

例如:从表中选择 id,fname,lname

但是,我建议你这样做:

而不是:

$row = mysqli_fetch_array($res); $count = $row[1];

做:

$count = mysqli_num_rows($res); if($count==1){...}

例如,添加 mysqli_real_escape_string() 以增强安全性(更多信息请参见下面的脚注)

旁注:我的印象是,如果查询不符合条件,您希望将用户重定向到 submit.php,如果满足条件,则执行以下操作插入

如果是这样,我修改了方法。另外,使用 header("submit.php"); 是不正确的。

正确的方法是 header("Location: http://www.example.com");

在传递代码之前还有一件事。

该行应在值周围使用引号,并使用双引号将其括起来:

$res = $con->query('INSERT INTO log values ($id, now(), $codeFile)');

如:

$res = $con->query("INSERT INTO log values ('$id', now(), '$codeFile')");

注意:尝试使用实际的列来插入,效果更好。

另外,$res 将不会执行,因为没有为其设置条件。删除 $res = 或添加

if($res){
echo "DB insertion was successful.";
}

代码:

<?php
if (isset($_POST["id"])) {
   $con=mysqli_connect("localhost","user","pw","db");
   $codeFile = mysqli_real_escape_string($con,$_POST["filename"]);
   $id = mysqli_real_escape_string($con,$_POST["id"]);
   $fname = mysqli_real_escape_string($con,$_POST["fname"]);
   $lname = mysqli_real_escape_string($con,$_POST["lname"]);

   $res = mysqli_query($con, "SELECT * from users WHERE fname='$fname' AND lname='$lname' AND id='$id'");

   $count = mysqli_num_rows($res);

   // if successful login, INSERT INTO...
   if ($count == 1) {

   // NOTE: Try and use actual columns to insert into, it's better.
     $res = $con->query("INSERT INTO log values ('$id', now(), '$codeFile')");

        if($res){
        echo "DB insertion was successful.";
        }
   }

   // if not successful, redirect.
   else {
     header("Location: submit.php");
     exit();
     }

} // end brace for (isset($_POST["id"]))
?>
<小时/>

脚注:

您当前的代码已开放给 SQL injection 。使用prepared statements ,或PDO

<小时/>

密码

我注意到您可能以纯文本形式存储密码。不建议这样做。

使用以下其中一项:

其他链接:

关于php应用程序验证登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22903142/

相关文章:

php - 我正在尝试使用更新查询从 PHP 更新 MySQL 中的一行,其中某些参数需要使用两次

php - 从选择框中选择一个选项时,需要使用 php 动态更改标签或标题的文本颜色?

php - Zend 数据库优先考虑Where 语句

php - 将 2 个 mysql 查询合并为 1

python - 如何使用 python 和 mysqldb 创建动态 sql 语句

php - 只选择那些在同一个表中有多个值的记录

php - 自定义 WordPress 画廊 html 布局

javascript - jQuery ajax 方法在使用匿名函数时不传递发布数据键

mysql - 将文本文件中的关键字与 MySql 字段进行匹配以查找出现次数

mysql - 如何在Spring Batch中进行多个查询(具体使用LAST_INSERT_ID())