繁体   English   中英

PHP中的变量不能在SQL中解析但在echo中可以

[英]variable in PHP not parsing in SQL but ok in echo

我正在尝试为用户创建一个页面,以便用户在需要时更改密码,到目前为止,还没有任何问题。

我已经设置了$ Username变量,并在SQL语句中将其与$ oldpw变量一起调用。

当我回显查询时,用户名始终丢失。 如果我反转了密码和用户名,则仍然缺少用户名。 如果我自己回显该变量,则该变量在那里。

关于密码安全性:
我意识到密码并没有得到完全的保护,但是由于密码是在内部系统上运行的,因此不需要这样做,因为该系统首先具有所有必需的加密功能。

以下是带有U:Admin和P:Admin的测试帐户的代码和结果

<?php
include('SQLFunctions.php');
include('session.php');
session_start();
$link = f_sqlConnect();
$oldpw = ($_POST['oldpw']);
$newpw = ($_POST['newpw']);

if(!isset( $_POST['oldpw']))
{
    $message = 'Please enter a your old password';
}
elseif (strlen( $_POST['newpw']) > 20 || strlen($_POST['newpw']) < 4)
{
    $message = 'incorrect length for new password';
}
elseif (ctype_alnum($_POST['newpw']) != true)
{
    $message = "New password must be alpha numeric";
}
elseif ($_POST['newpw'] <> $_POST['conpw'])
{
    $message = "Your new passwords do not match";
}
elseif(!empty($_POST)) {
    $UserID = $_POST['q'];
    $oldpwd = filter_var($_POST['oldpwd'], FILTER_SANITIZE_STRING);
    $newpwd = filter_var($_POST['newpwd'], FILTER_SANITIZE_STRING);

try {
    $Username = $_SESSION['Username'];
    $oldpw = Sha1($oldpw);
    $newps = Sha1($newpw);

    // check whether username exists and check that $oldpass is correct
    $query = "SELECT Password FROM Users WHERE Password='".$oldpw."' AND     Username='".$Username."'";

    $result = mysqli_query($link, $query);
    if(!$result){

        $message = "<p class='message'>Error: Your username and or password are incorrect.</p>" ;
    }else{

        // Test with mysqli_num_rows()
        if (mysqli_num_rows($result) > 0) {

            $query = "
                    UPDATE 
                        Users 
                    SET 
                        Password = '$newpw'
                        ,Updated_by = '$Username'
                        ,LastUpdated = NOW()
                    WHERE 
                        Username = '$Username'";

          mysqli_query($link, $query) or
                die("Insert failed. " . mysqli_error($link));

          $message = "<p class='message'>Your password has been changed</p>";

          mysqli_free_result($result);
        }
        else {
           // Username or password is incorrect
            $message = "<p class='message'>Error: Your username and password do not match.</p>" ;
        } 
    }
} catch(Exception $e) { $message = "Unable to process request";
}
}
?>
<html>
<head>
    <title>
        SVBX - Update Password
    </title>
    <link rel="stylesheet" href="styles.css" type="text/css"/>
</head>
    <body>
        <?php include('filestart.php') ?>
        <p><?php echo $message;
             echo "<br>Query: ".$query;
             echo "<br>Username :" .$Username;
             echo "<br>UserID :" .$UserID;?></p>
        <?php include('fileend.php') ?>
    </body>
</html>

因此,当我运行此命令时,我得到以下回显:

Error: Your username and password do not match.
Query: SELECT Password FROM Users WHERE 
Password='4e7afebcfbae000b22c7c85e5560f89a2a0280b4' AND Username=''
Username :Admin
UserID :18

我只是看不到问题是什么,感谢有人指出对我来说很明显。

谢谢你们。

但是,存在与会话相关的问题。 您已经包含了session.php ,其中可能包含一些与会话相关的任务。 同样,您已经在下一行开始了会话。

我认为$Username$_SESSION接收到空值。 但是在打印用户名之前,您已经包含了filestart.php 但是,变量$Username已在该文件中初始化。

因此,我设法使该脚本正常工作,但无法解决为什么我丢失$_SESSION信息的问题。

我修改了以前的页面表单,知道会话信息在起作用,并使用$_POST将用户名发送到此页面。

一切正常,可以更改密码。

围绕解决方案而不仅仅是解决方案。 谢谢大家的帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM