【问题标题】:Script to update users value in data base not working – issue with sessions?更新数据库中用户价值的脚本不起作用 - 会话问题?
【发布时间】:2014-07-23 19:14:47
【问题描述】:

当谈到 PHP 时,我几乎是一个完整的初学者,并且我的脚本在更新数据库中的当前用户值时遇到了一些问题——当脚本触发时,它不会更新数据库中的值,因为完全是有意的。

一些背景信息:

数据库名称:“用户”

表“用户”,其中包含用户 ID、用户名、密码、电子邮件地址、报价等列。

我正在开发的网站允许用户完成一些优惠,然后在完成后获得奖励。报价列的默认值为“1”。登录后,用户将根据报价列中的值重定向。 (所以在第一次登录用户被重定向到 example.com/offer1 后,offer 1 完成后这个值被更新,所以下一个登录用户被重定向到 offer 2 - 本质上存储用户进度)这个登录过程工作正常,它只是更新我的问题的值。

这是在报价完成后播放的脚本(在这种情况下,在报价 3 完成之后)– 旨在连接到数据库,然后更新用户“报价”,这样当他们下次登录时,他们将被定向到正确的报价 - 从而存储他们的进度:

~这实际上可能不是脚本本身的问题,而是关于会话在登录时没有正确启动/继续 - 或者可能是脚本没有正确使用会话数据的问题?~

<?php
session_start();
$con = mysqli_connect("localhost","name","password","user");
$select = mysqli_fetch_assoc(mysqli_query($con,"SELECT offer FROM user      WHERE Username = '".$_SESSION['username']."'"));
$plus = $select['offer']++;
mysqli_query($con,"UPDATE users SET offer=3".$plus."where user_id = $id" );
header("location: http://example.com/offer4".$plus);
?>

mysqli_query($con,"UPDATE users SET offer=3".$plus."where user_id = $id" ); 根本不起作用,问题可能出在这里吗?

如果有帮助,这是我使用的以前的版本确实可以更新值,但对数据库中的所有用户这样做,而不仅仅是一位已登录的用户。假设 Jim 已完成此优惠,他的优惠值将更新为 3,但所有其他用户的优惠值也将设置为 3,而只有 Jim 的优惠值应该如此。

<?php
session_start();
$con = mysqli_connect("localhost","username","pass","user");
$select = mysqli_fetch_assoc(mysqli_query($con,"SELECT offer FROM users      WHERE Username = '".$_SESSION['username']."'"));
$plus = $select['offer']++;
mysqli_query($con,"UPDATE users SET offer=3".$plus);
header("location: http://example.com/offer4".$plus);
?>

我的登录脚本仅供参考——这可以在登录时将用户重定向到他们的 Offer 列中的值正确工作(我的问题可能与会话未正确启动有关吗?)

<?php include "base.php"; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
<title>Login</title>
<link rel="stylesheet" href="style.css" type="text/css" />
</head>  
<body>  
<div id="main">
<?php
if(!empty($_POST['username']) && !empty($_POST['password']))
{
     $username = mysql_real_escape_string($_POST['username']);
    $password = md5(mysql_real_escape_string($_POST['password']));

     $checklogin = mysql_query("SELECT * FROM users WHERE Username = '".$username."' AND Password = '".$password."'");

    if(mysql_num_rows($checklogin) == 1)
    {
         $row = mysql_fetch_array($checklogin);
        $email = $row['EmailAddress'];

        $_SESSION['Username'] = $username;
        $_SESSION['EmailAddress'] = $email;
        $_SESSION['LoggedIn'] = 1;

         echo "<h1>Success</h1>";
        echo "<p>We are now redirecting you to the member area.</p>";
        echo '<meta http-equiv="refresh" content="0;URL=\'http://example.com/offer'.$row['offer'].'\'" />'; 

    }
    else
    {
         echo "<h1>Error</h1>";
        echo "<p>Sorry, your account could not be found. Please <a href=\"index.php\">click here to try again</a>.</p>";
    }
}
else
{
    ?>

   <h1>Member Login</h1>

   <p>Thanks for visiting! Please either login below, or <a href="register.php">click here to register</a>.</p>

    <form method="post" action="index.php" name="loginform" id="loginform">
    <fieldset>
        <label for="username">Username:</label><input type="text" name="username" id="username" /><br />
        <label for="password">Password:</label><input type="password" name="password" id="password" /><br />
        <input type="submit" name="login" id="login" value="Login" />
    </fieldset>
    </form>

   <?php
}
?>
</div>
</body>
</html>

最后是base.php

<?php
session_start();

$dbhost = "localhost"; // this will ususally be 'localhost', but can sometimes differ
$dbname = "user"; // the name of the database that you are going to use for this project
$dbuser = "name"; // the username that you created, or were given, to access your database
$dbpass = "password"; // the password that you created, or were given, to access your database

mysql_connect($dbhost, $dbuser, $dbpass) or die("MySQL Error: " . mysql_error());
mysql_select_db($dbname) or die("MySQL Error: " . mysql_error());
?>

非常感谢您抽出宝贵的时间,祝您晚上愉快;非常感谢这里所有以前的回复都非常有帮助。

【问题讨论】:

    标签: php mysql database session


    【解决方案1】:

    试试这个:

    ini_set('display_errors',1);
    ini_set('display_startup_errors',1);
    error_reporting(-1);
    
    session_start();
    
    if(!empty($_SESSION['Username'])) {
        $con = mysqli_connect("localhost","username","pass","user");
    
        $username = mysqli_real_escape_string($con, $_SESSION['Username']);
    
        $result = mysqli_query($con, "UPDATE users SET Offer = Offer + 1 WHERE Username = '{$username}'");
    
        while ($row = mysqli_fetch_assoc($result)) {
            $offer = $row['Offer'];
        }
    
        header("Location: http://example.com/offer".$offer);
    } else {
        echo "You are not logged in.";
    }
    

    mysqli_real_escape_string 将从用户名中转义危险字符。您可以使用 UPDATE 将单元格的值增加一个数量(在本例中为 1)。

    另外需要注意的是:在带有HTML 的页面上的PHP 中,您使用的是mysql 扩展函数而不是mysqlimysql 扩展名已弃用。无论哪种方式,您的代码在使用mysqlmysqli 时都不一致。有关等效 mysqli 函数的列表,请查看 PHP manual

    您说您的数据库称为user,您的表称为users。在您的第一个查询语句中,您从名为user 的表中选择了offer,而不是users。您可以使用mysqli_error() 来显示您可能收到的错误。

    关于你的第二个mysqli_query 声明:

    mysqli_query($con,"UPDATE users SET offer=3".$plus."where user_id = $id" );
    

    您的代码中的其他任何地方都没有 $id。此外,where 之前还需要一个空格,否则如果 $plus == 13,则语句为 SET offer=313where user_id...

    根据您的代码 ($select['offer']++),您检索先前的 offer 值,将其递增 1,然后将数据库中的 offer 值设置为该递增值,并在开头添加 3。

    如果报价 == 31,那么在检查完您的代码后,新报价 == 332。

    编辑:我刚刚注意到的其他内容。我认为您误解了 ++ 运算符。在操作数之后使用时,称为后自增运算符。之前使用时,称为预增量运算符。这样做的原因是因为在后递增运算符的情况下,操作数的值(在您的情况下为 $select['offer'])在递增之前被分配给 $plus。这意味着,在您的代码上下文中,您永远不会真正增加报价价值。

    【讨论】:

    • 非常感谢您的回答以及整理代码的所有其他指针。试了一下您提供的脚本,它只是提供了一个白页,并在未更新的 DB 中提供了价值。你知道可能出了什么问题吗? ://
    • 有没有可能$_SESSION['Username']没有设置?
    • 是的,这可能是问题所在,不要以为我已经设置好了。我怎么能做到?得到 session_start();在 base.php 文件中,但就是这样,所以我不确定。我在其他地方还需要 php session_start() 吗?再次感谢您的帮助!
    • 可能吗?确认它。在 session_start() 之后运行 var_dump($_SESSION)。您应该在 index.php 页面中使用$_SESSION['Username'] = $username 行设置它。使用 mysql 错误函数检查 mysql 错误。通过将其放在代码的开头来检查 PHP 错误:ini_set('display_errors',1); ini_set('display_startup_errors',1); error_reporting(-1);
    • 知道了! :) 设法使用 ini_set('display_errors',1); ini_set('display_startup_errors',1);错误报告(-1);发现我在密码的第一个字母中使用了错误的大小写。觉得好傻!感谢您的所有帮助,非常感谢,您的脚本运行良好!
    【解决方案2】:

    我认为问题出在这一行:

    mysqli_query($con,"UPDATE users SET offer=3".$plus."where user_id = $id" );
    

    $id 来自哪里?在上面的行中,您使用了用户名。

    【讨论】:

      【解决方案3】:

      您的 SQL 是 "UPDATE users SET offer=3".$plus."where user_id = $id"。在 PHP 中,$plus 变量相等,例如“54”变成“UPDATE users SET offer=354where user_id = $id”。因此,where 之前缺少一个空格。

      如果不是这样,请学习使用 mysqli 错误记录:http://php.net//manual/ru/mysqli.error.php

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-26
        • 1970-01-01
        • 2013-01-28
        • 1970-01-01
        • 2012-02-27
        相关资源
        最近更新 更多