当涉及到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
扩展函数而不是mysqli
。mysql
扩展已弃用。无论哪种方式,您的代码在使用mysql
和mysqli
时都不一致。有关等效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。