php应用程序验证登录

时间:2014-04-07 03:32:14

标签: 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&gt;查询(&#39; INSERT INTO日志值($ id,now(),$ codeFile)&#39;);

  4. 有没有办法将它组合成一个查询,如果成功则返回true?

2 个答案:

答案 0 :(得分:1)

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

例如:SELECT id,fname,lname from table

然而,我建议你这样做:

而不是:

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

做的:

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

例如,添加mysqli_real_escape_string()以增加安全性(在下面的脚注下更多)

旁注:我的印象是,如果查询不符合条件,您希望将用户重定向到submit.php,如果符合要求,则执行{{1} }。

如果是这样,我修改了方法。另外,使用INSERT不正确。

正确的方法是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.";
}

<强>脚注:

您目前的代码向SQL injection开放。使用prepared statementsPDO


<强>密码

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

使用以下其中一项:

其他链接:

答案 1 :(得分:0)

您可以使用mysqli-&gt;受影响的行:

http://us1.php.net/manual/en/mysqli.affected-rows.php

你可以在你的查询中使用LIMIT只返回一个结果,虽然如果你回来一个登录查询是不好的做法,反正应该只有一个。

为什么你的代码不起作用,很难说,它取决于你的数据库返回的内容。 您需要调试$ count并查看实际出现的内容,然后从那里开始工作。

Finalyl,据我所知,不可能在同一行上运行两个查询,你需要两个表的两个插件。(表日志和表值)