尝试了解如何在 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。好像不行。
如何请求返回第一列?它没有名称,因为它不是命名列。
我不敢相信完成一个简单的查询需要多少条语句,PHP 中有没有更好的方法? Java servlet 有一些漂亮的快捷方式,例如带有受影响行数的整数返回代码等等。
如果这有效,我想做一个插入。当然最好是做一个组合语句并根据插入的行数(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/