0

如果用户的积分为 10,000,我正在尝试奖励用户徽章。表中有一个名为 badge1 的字段,其默认值设置为locked和一个点行。我正在运行if 语句,如果用户点数为 10,000,则将 badge1 行从锁定更新为解锁。我的代码看起来是正确的,但它既没有更新字段也没有显示任何错误。

<?php
$db = new PDO('mysql:host=hostname;dbname=databasename;charset=UTF-8', 'username', 'password');
$username = $_SESSION['username'];
$q = "SELECT Points FROM login_users WHERE username ='$username'");
$r = mysql_query($q);
$row = mysql_fetch_assoc($r);
$Points = $row['Points'];


if($Points == "10000") {
   $awardBadge = $db->exec("UPDATE login_users SET badge1=unlocked WHERE username=?");
$Points->execute(array($username))
} else {
    print "";
}

?> 

更新:

我设法让它工作..但是问题是我对将旧 sql 转换为 PDO 有点新,所以这不是很安全,但这就是有效的:

<?php
$connect = mysql_connect("host","username","password");
mysql_select_db("databasename");
$username = $_SESSION['jigowatt']['username'];
$q = "SELECT Points FROM login_users WHERE username = ('$username')";
$r = mysql_query($q);
$row = mysql_fetch_assoc($r);
$Points = $row['Points'];

?> 

// Place somewhere
<?php
if($Points >= "10000") {
    $result = mysql_query("UPDATE login_users SET maneki='unlocked' WHERE username='$username'");
} else {
    print "Badge has not been unlocked";

}
?>
4

6 回答 6

2

"10000" string应该是一个10000 int

而且,您可能也想在这里做出选择。您正在使用 2 种类型的 mysql-database 连接设置。老式的mysql_function()方式和新的幻想PDO method

我认为使用 PDO 版本更安全,因为较新的 PHP 版本将不再支持旧方法......那个......而且它看起来很脏;P

试试这个:

<?php

session_start();

$dbSession = new PDO('mysql:host=***;dbname=***', '***', '***');

$selectQuery = $dbSession->prepare('
  SELECT `User`.`Points`
  FROM `login_users` AS `User`
  WHERE `User`.`username` = :username
');
$selectQuery->bindParam(':username', $_SESSION['username'], PDO::PARAM_STR);

$user = $selectQuery->fetch(PDO::FETCH_ASSOC);

if ( !empty($user) && $user['Points'] == 10000 ) {
  $updateQuery = $dbSession->prepare('
    UPDATE `login_users`
    SET `badge1` = \'unlocked\'
    WHERE `username` = :username');
  $updateQuery->bindParam(':username', $_SESSION['username'], PDO::PARAM_STR);
  $updateQuery->execute();
}

?> 

有用的资源:

于 2012-11-02T23:16:18.357 回答
1

最好检查是否 >= 10000 且尚未授予。那你也可以在 SQL 中完成,所以你不需要 PHP 中的逻辑。

UPDATE login_users SET badge1=unlocked WHERE points >= 10000 and badget1 <> unlocked
于 2012-11-02T22:34:03.943 回答
1

试试这个if($Points == 10000)而不是if($Points == "10000")

mysql_query()向与指定链接标识符关联的服务器上当前活动的数据库发送唯一查询(不支持多个查询)。

于 2012-11-02T22:34:27.080 回答
1
if($Points==10000){
    $awardBadge = $db->prepare("UPDATE login_users SET badge1=unlocked WHERE username=?");
    $awardBadge->execute(array($username));
}
于 2012-11-02T22:51:36.743 回答
1

这个问题是由$point实际上不等于的值引起的10000,但是是NULL

所以我建议var_dump()在这种情况下总是使用来获取变量的实际值。

于 2012-11-02T23:06:59.063 回答
1

一个提示:在编写 php 代码之前检查 PDO 文档!您在同一时间使用 PDO 和 mysql 命令来完成相同的工作!??为什么???

于 2012-11-02T23:15:07.780 回答