我的if/else语句不适用于我的自定义php登录脚本
不知何故,我的条件句根本不起作用。单击登录表单上设置为“post”并将操作定义为以下登录脚本的按钮后,我只会被定向到脚本,而不会被重定向到条件语句中定义的脚本。我的代码有什么问题我的if/else语句不适用于我的自定义php登录脚本,php,Php,不知何故,我的条件句根本不起作用。单击登录表单上设置为“post”并将操作定义为以下登录脚本的按钮后,我只会被定向到脚本,而不会被重定向到条件语句中定义的脚本。我的代码有什么问题 session_start(); $servername = "localhost"; $username = "root"; $password = ""; $database = "project"; $connection = mysqli_connect($servername, $username, $p
session_start();
$servername = "localhost";
$username = "root";
$password = "";
$database = "project";
$connection = mysqli_connect($servername, $username, $password, $database) or exit(header("location:maintenance.php"));
function login_check() {
global $connection;
$name = $_POST['name'];
$password = $_POST['password'];
$prepared = mysqli_stmt_init($connection);
$request = mysqli_stmt_prepare($prepared, "SELECT id FROM members WHERE name = ? AND password = ?");
mysqli_stmt_bind_param($prepared, "ss", $name, $password);
$result= mysqli_stmt_bind_result($request);
$rows_counter = mysqli_num_rows($result);
mysqli_stmt_close($prepared);
if ($rows_counter > 0) {
$_SESSION['member'] = $name;
header("location:../../success.php");
}
else {
header("location:../../relogin.php");
}
}
总是,总是,总是把
exit()
放在标题之后
重定向调用。即使在这种情况下,它也可能解决您的问题
header("location:../../success.php");
exit();
定义函数
login\u check()
后,还应调用它(如果条件正确):
作为旁注,最好在重定向之前明确地关闭连接
编辑
正如KhomeHoly所说,仅在必要时调用函数…如果定义了函数,则需要调用函数。不这样做就像在新房子里盖一个房间,却忘记了门。它就在那里,但没有人可以使用或访问它 因此,您需要执行以下操作:
// your script as it is right now
if (isset($_POST['name']) && isset($_POST['password'])) {
login_check(); // actually call the function
}
使用isset()
检查某些$\u POST
参数是否已设置,但未验证。您至少应该对数据进行基本验证,看看它们是否正确
根据您的要求,类似的方法会起作用
if (isset($_POST['name']) && strlen($_POST['name') >= 4 && isset($_POST['password']) && strlen($_POST['password']) >= 4) {
login_check(); // actually call the function
}
上面的代码将检查这些参数是否设置了,并检查名称和密码是否至少有4个字符长。(我个人不接受少于4个字符的用户名,密码至少应为8)
当然,这遗漏了一个正确的错误报告和所有这些东西,但我认为这应该给你一个基于你的问题的基本想法。以下是我对你的代码的输入和方法 首先,在编写解决方案之前,逐步进行代码故障排除始终是一种良好的做法 在开始构建一个完整的登录系统之前,输入if语句或使用输入等编写prepare语句 把你的答案分成小块,然后把拼图拼在一起 你的问题集中在if语句上,大多数帮助和回答也集中在if语句上,这很好,但问题不在那里 我删除了if语句和很多内容,只是想看看是否有东西返回,我没有 您
$result=mysqli\u stmt\u bind\u result($request)代码>遗漏参数,当该参数修复后,下一行也遗漏了其他参数。我已经停止调试了
我已经重写了你的代码,它可以工作了,我所做的我已经重新定义了变量的命名,这样他们就能非常清楚地理解什么是name
,称它为username
,数据库username
称它为dbUser
或dbUsername
等等
如果您想检查代码是否返回某些内容,请使用var\u dump($someVariable)
最后一件事,在制作post表单之前,您可以在数据库中创建一个虚拟用户名和密码,并将其直接注入代码中,例如,只是为了查看是否所有内容都正常工作,然后移动到表单:
$username = "user1";
$password = "1234";
我所做的解决方案只是演示如何做,而不一定代表最佳逻辑,但这取决于您找到正确的逻辑,这一切都取决于您的策略
以下是我的建议:
<?php
session_start();
$dbHost = "localhost";
$dbUser = "root";
$dbPass = "";
$dbName = "product";
$connection = new mysqli($dbHost, $dbUser, $dbPass, $dbName);
// Check connection
if ($connection->connect_error)
{
header("location:maintenance.php");
exit();
// or for debugging, activate following line
//die("Connection failed: " . $connection->connect_error);
}
$username = $_POST['username'];
$password = $_POST['password'];
//if username and password empty stop login
if (!$username || !$password)
{
//do something, die is only example
die ("Not all the fields were filled in");
} else
{
login_check($username, $password);
}
function login_check($username, $password)
{
global $connection;
//sql statements is corrected, change field name to username
$sql = "SELECT * FROM `members` WHERE `username` = ? AND `password` = ?";
$stmt = $connection->prepare($sql);
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$output = $stmt->get_result();
$row = $output->fetch_array(MYSQLI_NUM);
$stmt->close();
//print what comes out in $row
//print_r($row);
//check if $row has data
if ($row)
{
echo "success do something";
$_SESSION['member'] = $username;
} else
{
echo "fail do something";
}
}
数据库也已设置。我想它可能无法访问我的查询。不知道为什么,我甚至无法回显$rows\u计数器以进行调试。当您提交for时,login\u check(),因为我的表单的操作定义为我的login\u check.php文件,所以如果要回显$rows\u counter
,请在if语句之前放置以下行:回显$rows\u counter代码>die()
@Asperger it应该
并不意味着它应该
。按照phpchap写的做,如果你得到了一些echo`d,那么你的函数就会被调用,否则它就不会被调用。解释一下为什么这是必要的,对每个回答这个问题的人都会有帮助。我仍然只会被重定向到我在这里发布的脚本(login.php),但实际的函数似乎不起作用,或者至少if语句是非活动的,因为我的查询可能有问题。好提示,我会记住的!您不应该每次登陆这个.php页面时都调用这个函数。只有当函数所需的某些参数已设置且有效时,您才应该调用该函数。Marten,如果我现在调用该函数,那么它将在我触发窗体按钮之前运行。@Asperger:编辑将起作用:仅当设置了name
和password
时才调用它。您好Marten,如果我点击表单按钮,我不会自动调用该函数吗?action=“php/core/login.php”还是我有错误的想法?@Asperger:表单
标记中的action
参数指定将调用哪个脚本,而不是脚本中的哪个函数。我甚至可以稍后执行一些正则表达式来添加更好的验证,对吗?我遇到的问题是if语句不起作用,但我确实会被重定向到else头。是不是我事先准备好的声明错了?我遵循了php文档,了解了过程方法中准备好的语句是如何工作的,除非我遗漏了一些东西。当然,验证来自用户的所有内容是非常重要的。很好,您使用的是预先准备好的声明,它们降低了安全漏洞的风险。我的IDE告诉我函数mysqli\u stmt\u bind\u result()
缺少一个参数,您应该查看一下itI,我会尽可能遵循最佳实践。我对php领域相当陌生,但在我开始编写酷的东西之前,我想要正确的基础知识。一旦我知道了所有的程序性内容,我会将所有内容转换为OOPIMHO,mysqli\u real\u escape\u string
就不需要了,因为您准备了
<?php
session_start();
$dbHost = "localhost";
$dbUser = "root";
$dbPass = "";
$dbName = "product";
$connection = new mysqli($dbHost, $dbUser, $dbPass, $dbName);
// Check connection
if ($connection->connect_error)
{
header("location:maintenance.php");
exit();
// or for debugging, activate following line
//die("Connection failed: " . $connection->connect_error);
}
$username = $_POST['username'];
$password = $_POST['password'];
//if username and password empty stop login
if (!$username || !$password)
{
//do something, die is only example
die ("Not all the fields were filled in");
} else
{
login_check($username, $password);
}
function login_check($username, $password)
{
global $connection;
//sql statements is corrected, change field name to username
$sql = "SELECT * FROM `members` WHERE `username` = ? AND `password` = ?";
$stmt = $connection->prepare($sql);
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$output = $stmt->get_result();
$row = $output->fetch_array(MYSQLI_NUM);
$stmt->close();
//print what comes out in $row
//print_r($row);
//check if $row has data
if ($row)
{
echo "success do something";
$_SESSION['member'] = $username;
} else
{
echo "fail do something";
}
}