0

ポイントが 10,000 のユーザーにバッジを授与しようとしています。テーブルには Badge1 というフィールドがあり、デフォルト値はlockedに設定されており、ポイント行が設定されています。ユーザーのポイントが 10,000 の場合、badge1 行をロックされた状態からロック解除された状態に更新するというif ステートメントを実行しています。私のコードは正しいようですが、フィールドを更新したり、エラーを表示したりしていません。

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

また、ここでも選択することをお勧めします。mysql-データベース接続のセットアップには2つのタイプを使用しています。昔ながらのmysql_function()方法と新しい空想PDO method

新しいPHPバージョンは古いメソッドをサポートしなくなるので、PDOバージョンでの作業はより安全だと思います...それは...そしてそれはただ汚いように見えます; 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

ヒント:phpコードを作成する前に、PDOドキュメントを確認してください。同じジョブに対してPDOコマンドとmysqlコマンドを同時に使用します!?? どうして???

于 2012-11-02T23:15:07.780 に答える
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ます。10000NULL

var_dump()そのため、そのような場合に変数の実際の値を取得するために常に使用することを提案します。

于 2012-11-02T23:06:59.063 に答える
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()指定された link_identifier に関連付けられているサーバー上の現在アクティブなデータベースに、一意のクエリ (複数のクエリはサポートされていません) を送信します。

于 2012-11-02T22:34:27.080 に答える