我的if/else语句不适用于我的自定义php登录脚本

我的if/else语句不适用于我的自定义php登录脚本,php,Php,不知何故,我的条件句根本不起作用。单击登录表单上设置为“post”并将操作定义为以下登录脚本的按钮后,我只会被定向到脚本,而不会被重定向到条件语句中定义的脚本。我的代码有什么问题 session_start(); $servername = "localhost"; $username = "root"; $password = ""; $database = "project"; $connection = mysqli_connect($servername, $username, $p

不知何故,我的条件句根本不起作用。单击登录表单上设置为“post”并将操作定义为以下登录脚本的按钮后,我只会被定向到脚本,而不会被重定向到条件语句中定义的脚本。我的代码有什么问题

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";
    }
}