用于更新数据库中用户值的脚本不起作用-会话问题


Script to update users value in data base not working – issue with sessions?

当涉及到PHP时,我几乎是一个完整的初学者,并且我的脚本在更新数据库中的当前用户值时遇到了一些问题-当脚本触发时,它根本没有按预期更新数据库中的值。

一些背景信息:

数据库名:" user "

包含用户ID、用户名、密码、电子邮件地址、报价的"users"表。

我正在工作的网站允许用户完成一些报价,然后在完成后获得奖励。offer列的默认值为"1"。登录后,用户根据报价列中的值被重定向。(所以在第一次登录用户被重定向到example.com/offer1,提供1完成后,这个值被更新,所以下一个登录用户被重定向到提供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已经完成了这个offer,他的offer值将被更新为3,但是所有其他用户的offer值都将被设置为3,而只有Jim的offer值应该是3。

<?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);
?>

仅供参考,这里是我的登录脚本-这可以正确地重定向用户登录到他们的报价列中的值(我的问题是否与会话不正确启动有关?)

<?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());
?>
非常感谢您的宝贵时间,祝您晚上愉快;非常感谢所有以前的回复在这里已经如此有帮助。

试试这个:

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手册。

你说你的数据库叫user,你的表叫users。在第一个查询语句中,您从名为user而不是users的表中选择了offer。您可以使用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。

如果offer == 31,那么遍历代码后,新的offer == 332。

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

我认为问题出在这一行:

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

$id是从哪里来的?在上面的行中,您使用了username.

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

如果不是这种情况,学习使用mysql错误日志:http://php.net//manual/ru/mysqli.error.php。