Php 更新数据库中用户值的脚本不工作–;会话有问题吗?

Php 更新数据库中用户值的脚本不工作–;会话有问题吗?,php,mysql,database,session,Php,Mysql,Database,Session,对于PHP,我几乎是一个完全的初学者,并且在更新数据库中当前用户值的脚本中遇到了一些问题——当脚本启动时,它根本不会按照预期更新数据库中的值 一些背景信息: 数据库名称:“用户” 表“用户”中包含用户ID、用户名、密码、电子邮件地址、报价等列 我正在工作的网站允许用户完成许多优惠,然后在完成后获得奖励。“报价”列的默认值为“1”。登录后,根据“提供”列中的值重定向用户。(因此,在第一次登录时,用户被重定向到example.com/offer1,在提供1完成后,此值被更新,因此在下一次登录时,用户

对于PHP,我几乎是一个完全的初学者,并且在更新数据库中当前用户值的脚本中遇到了一些问题——当脚本启动时,它根本不会按照预期更新数据库中的值

一些背景信息:

数据库名称:“用户”

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

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

这是在报价完成后(在本例中是在报价3完成后)播放的脚本–目的是连接到数据库,然后更新该用户的“报价”,以便在下次登录时将其定向到正确的报价–从而存储其进度:

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

仅供参考这里是我的登录脚本-这在重定向用户登录到他们的报价栏中的值时正确工作(我的问题可能与会话启动不正确有关?)


登录
试试这个:

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.";
}
将从用户名中转义危险字符。可以使用将单元格的值增加一个量(在本例中为1)

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

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

关于您的第二个
mysqli\u查询
声明:

mysqli_query($con,"UPDATE users SET offer=3".$plus."where user_id = $id" );
代码中的任何其他地方都没有$id。您还需要在
where
前面留一个空格,否则如果$plus==13,语句将显示
SET offer=313where user\u id…

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

如果offer==31,那么在检查代码之后,新的offer==332


编辑:我刚刚注意到了其他一些东西。我认为您误解了
++
操作符。在操作数之后使用时,称为增量后运算符。以前使用时,称为预增量运算符。原因是,对于增量后运算符,操作数的值(在您的示例中为$select['offer'])在递增之前分配给$plus。在您的代码上下文中,这意味着您从未实际增加报价值。

我认为问题在于这行:

mysqli_query($con,"UPDATE users SET offer=3".$plus."where user_id = $id" );
$id从哪里来?在上面的一行中,您使用了用户名。

您的SQL是
“UPDATE users SET offer=3”。$plus。“其中user\u id=$id”
。在PHP中,
$plus
变量等于,例如“54”将变为“updateusers SET offer=354where user_id=$id”。因此,
where
前面缺少一个空格


如果不是这样,请学习使用mysqli错误日志:

非常感谢您的回答和所有其他提示来整理代码。有一个在你的好心提供的脚本去,它只是一个白色的页面,并提供在数据库未更新的价值。你知道会出什么问题吗/是否可能未设置会话['Username']
。我怎么做呢?已获取会话_start();在base.php文件中,但仅此而已,所以我不确定。我还需要php会话_start()吗?再次感谢你的帮助!可以是?确认一下。会话结束后运行
var\u dump($\u会话)
。您应该在index.php页面中使用
$\u SESSION['Username']=$Username
行设置它。使用mysql错误函数检查mysql错误。检查PHP错误,将其放在代码的开头:
ini\u集('display\u errors',1);ini设置(“显示启动错误”,1);错误报告(-1)明白了!:)管理使用ini\u集(“显示错误”,1);ini设置(“显示启动错误”,1);错误报告(-1);发现我在密码的第一个字母中使用了错误的大小写。感觉好傻!谢谢你的帮助,非常感谢,你的剧本做得很好!
<?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());
?>
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_query($con,"UPDATE users SET offer=3".$plus."where user_id = $id" );
mysqli_query($con,"UPDATE users SET offer=3".$plus."where user_id = $id" );