2012-11-02 95 views
0

我試圖授予用戶一個徽章,如果他們的分數是10,000。表中有一個名爲badge1的字段,其默認值設置爲已鎖定和點行。我正在運行並且如果語句如果用戶點數是10,000,則更新badge1行從鎖定到解鎖。我的代碼似乎是正確的,但它既不更新該字段也不顯示任何錯誤。IF和ELSE語句不起作用

<?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 ""; 
} 

?> 

UPDATE:

我設法得到它的工作。但是問題是我有點新老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

爲什麼你使用'mysql_ *'和PDO?多麼混亂......只是使用PDO。此外,您現在的代碼現在可能面臨SQL注入攻擊。 – Brad

+0

你確定他們的積分恰好是10000嗎? – KevinDTimm

+0

「如果語句不更新表」---標題沒有意義。 – zerkms

回答

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(); 
} 

?> 

有用的資源:

+1

我真的很感謝你對這個幫助!出於某種原因,它不斷記錄用戶在我放置的頁面上......真的很奇怪。我用舊的sql代碼更新了我的上面的描述,它的功能正常,但遺憾的是它是mysql而不是PDO。再次,我真的很感謝你的幫助:) –

+2

@AoiHana我已經添加了'session_start();',這可能是 – Ariaan

+1

@AoiHana,我添加了一些有用的鏈接到一些文檔,這更多地解釋了內部工作。 – Ariaan

1

更好的檢查是否> = 10000,還沒有被授予。這也可以在SQL中完成,因此您不需要PHP中的邏輯。

UPDATE login_users SET badge1=unlocked WHERE points >= 10000 and badget1 <> unlocked 
1

嘗試,而不是這個if($Points == 10000)if($Points == "10000")

mysql_query()發送一個唯一的查詢(多個查詢不支持),以當前活動的數據庫與指定link_identifier關聯的服務器上。

+0

兩者相同(在這種情況下)。不是答案 – zerkms

+0

編輯我的回答 – olyanren

+0

現在是更糟糕的 – zerkms

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

問題由$point值實際上不等於10000,但NULL引起的。

所以我建議在這種情況下總是使用var_dump()來獲得變量的實際值。

1

一個提示:檢查PDO文檔,然後再編寫php代碼!您可以在同一時間使用PDO和mysql命令進行相同的工作!爲什麼???