2012-11-02 4 views
0

J'essaie d'attribuer un badge à un utilisateur si ses points sont 10 000. Il existe un champ dans la table appelée badge1 avec une valeur par défaut définie sur verrouillé et une ligne de points. Je cours et si l'instruction que si les points d'utilisateurs sont 10.000 puis UPDATE la ligne badge1 de verrouillé à déverrouillé. Mon code semble correct mais il ne met pas à jour le champ et ne montre aucune erreur.L'instruction IF et ELSE ne fonctionne pas

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

?> 

MISE À JOUR:

j'ai réussi à le faire fonctionner .. mais le problème est que je suis un peu nouveau pour convertir ancien sql à PDO, donc ce n'est pas très sûr mais c'est ce qui fonctionne :

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

Pourquoi utilisez-vous 'mysql_ *' ET AOP? Quel gâchis ... il suffit d'utiliser PDO. En outre, votre code tel qu'il est en ce moment est probablement largement ouvert aux attaques par injection SQL. – Brad

+0

Etes-vous sûr que leurs points sont exactement 10000? – KevinDTimm

+0

"Si l'instruction ne met pas à jour la table" --- le titre n'a aucun sens. – zerkms

Répondre

2

"10000" string devrait être un 10000 int

Et aussi, vous voudrez peut-être faire un choix ici aussi. Vous utilisez 2 types de configuration d'une connexion à la base de données mysql. l'ancienne façon mysql_function() et le nouveau fantaisie PDO method.

Je pense que travailler avec la version PDO est plus sûr, puisque les nouvelles versions de PHP ne supporteront plus les vieilles méthodes ... Que ...et il semble juste sale; P

Essayez ceci:

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

?> 

ressources utiles:

+1

J'apprécie vraiment votre aide sur ce! Pour une raison quelconque, il continue à déconnecter l'utilisateur sur la page sur laquelle j'ai placé cela .. vraiment étrange. J'ai mis à jour ma description ci-dessus avec l'ancien code sql qui fonctionne correctement mais malheureusement c'est mysql et non PDO. Encore une fois, j'apprécie vraiment votre aide :) –

+2

@AoiHana J'ai ajouté 'session_start();', c'est probablement – Ariaan

+1

@ AoiHana et j'ai ajouté quelques liens utiles à une documentation, qui explique plus sur les rouages ​​internes. – Ariaan

1

Mieux vérifier si> = 10000 et pas encore attribué. Cela pourrait aussi être fait en SQL, donc vous n'avez pas besoin de cette logique en PHP.

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

Essayez cette if($Points == 10000) au lieu de if($Points == "10000")

mysql_query() envoie une requête unique, (plusieurs requêtes ne sont pas pris en charge) à la base de données active sur le serveur qui est associé au link_identifier.

+0

Les deux sont égaux (dans ce cas) Pas une réponse – zerkms

+0

Edité ma réponse – olyanren

+0

maintenant c'est encore pire – zerkms

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

Le problème est dû à $point valeur qui est en fait pas égal à 10000, mais est NULL.

Donc, je propose de toujours utiliser var_dump() pour obtenir la valeur réelle de la variable dans de tels cas.

1

un conseil: vérifiez les documents PDO avant d'écrire le code php! Vous utilisez les commandes PDO et mysql en même temps pour le même travail! Pourquoi???

Questions connexes