0
votes

J'ai posé des questions sur l'utilisation si pour mettre à jour la colonne SQL

J'essaie d'utiliser une instruction si pour mettre à jour une colonne de ma base de données. XXX

avec ce code, il met toujours à jour le "user_level" à 6.

Ce que je veux ici, c'est lorsque l'utilisateur obtient 2001 points de discussion ... Mise à jour vers le niveau 1 Et quand ils obtiennent 5000 points de discussion ... Mise à jour du niveau 2, etc.

Quelqu'un peut-il expliquer ce que je fais mal?


5 commentaires

Votre code n'a aucun sens. Ce sera toujours 5 (quand points == 70001) ou 6 (tous les autres points).


Où est $ data [chat_points] en provenance? Une autre requête, peut-être? Vous pouvez tout faire dans une requête SQL et supprimer le code conditionnel de votre PHP.


Pourquoi utilisez-vous alors non un signe égal? Si vous comparez des données utilisateur à un point, utilisez '==' signe.


Je suis désolé de mon manque d'expérience avec cela, je suis encore débutant pour cela, et $ Data [Kardpoints] est une autre colonne de ma base de données qui stocke les points d'utilisateur à l'intérieur.


Avez-vous dans votre tableau des données 'user_level' disponibles?


5 Réponses :


-1
votes

Votre code est cassé fort> car toutes les instructions seront exécutées, ce qui rend le niveau toujours 6.

Un moyen de résoudre ce problème sans changer le code trop consiste à utiliser si else { code> déclarations pour ne conserver qu'une seule déclaration de fonctionnement à la fois. P>

if($data[chat_points] != '2001'){
    $mysqli->query("UPDATE boom_users SET user_level = 1 WHERE user_id = '{$data['user_id']}'");
} else if($data[chat_points] != '5000'){
    $mysqli->query("UPDATE boom_users SET user_level = 2 WHERE user_id = '{$data['user_id']}'");
} else if($data[chat_points] != '15001'){
    $mysqli->query("UPDATE boom_users SET user_level = 3 WHERE user_id = '{$data['user_id']}'");
} else if($data[chat_points] != '35001'){
    $mysqli->query("UPDATE boom_users SET user_level = 4 WHERE user_id = '{$data['user_id']}'");
} else if($data[chat_points] != '45001'){
    $mysqli->query("UPDATE boom_users SET user_level = 5 WHERE user_id = '{$data['user_id']}'");
} else if($data[chat_points] != '70001'){
    $mysqli->query("UPDATE boom_users SET user_level = 6 WHERE user_id = '{$data['user_id']}'");
}


2 commentaires

Le code OPS a été brisé (toujours niveau 5 ou 6 ), vous êtes cassé aussi (toujours niveau 1 ou 2 ).


Prenez note d'avoir un code fonctionnel (comme mentionné ci-dessous), vous devez remplacer le ! = sur == . Ce code est le le plus rapide



-1
votes

Votre code n'a aucun sens. Ce sera toujours 5 (lorsque des points == 70001) ou 6 (tous les autres points).

Je m'attends à ce que la condition soit inférieure à ", donc xxx


Ou mieux, plus court, plus rapide ... xxx


11 commentaires

L'objectif de l'affiche était de ne faire fonctionner que le code d'exécuter un certain nombre de fois pour minimiser le nombre de requêtes totales de la base de données. Dans vos deux exemples de code, votre code fera une requête chaque fois, quel que soit le user_level . Cela signifie qu'il a performance médiocre .


@SHN: Où est écrit qu'il a besoin de minimiser le nombre de requêtes SQL? Je viens de voir qu'il y ait un chat_points score (nous ne savons pas si incrémenté par 1) et l'OP doit assurer certains user_level à son score. Rien du nombre de requêtes, etc.


Une solution ne minimisant pas le nombre de requêtes provoquerait plusieurs milliers de requêtes redondantes à effectuer , donc à ce stade, toute solution ne minimisant pas le nombre total de requêtes est irresponsable.


@SHN: Vous êtes probablement le lecteur d'esprit, je ne lis pas cela dans la question ... mais bonne chance, Downvoter Guy ;-)


Je viens de dire que toute solution introduit des milliers de requêtes indésirables dans une mise en œuvre apparemment amateur n'est pas recommandée. :)


Je ne sais pas comment je peux dire "merci", mais vraiment tu m'as tellement aidé avec ce code. Le dernier a fonctionné bien avec moi et c'est vraiment mieux, plus court et plus rapide que le premier, vraiment merci.


Juste FYI, l'élégance de cette solution est agréable, mais la performance de cette méthode est littéralement des milliers de fois que quelque chose de plus similaire à votre implémentation initiale.


@SHN: Où est écrit chat_points est incrémenté par 1? Si ce serait incrémenté, par exemple. par 3 (ou comme sur SO, parfois par +10, parfois +25, parfois -1, -2), conditions avec == ou ! = peut être toujours faux (L'utilisateur peut avoir 100 000 points, mais manque les jalons). Le OP a marqué cette réponse comme l'acceptée, donc il répond probablement à la question. Howhh. Désolé, il est gaspillé de mon temps pour discuter ici avec vous.


@ Av.Blacky: Ça va, pas de spécial "merci" besoin de :-) Content de vous aider.


Désolé @papther, mais j'ai une question, que si je veux montrer à l'utilisateur combien de points il a encore besoin d'obtenir le niveau suivant, comment je peux le faire?


@ Av.Blacky: Mise à jour de ma réponse



-1
votes

C'est ce que je devrais faire:

//compare if user approached the 2001 limit but not exceed 5000 limit 
if($data[chat_points] >= '2001' && $data[chat_points] < '5000'){
    $mysqli->query("UPDATE boom_users SET user_level = 1 WHERE user_id = '{$data['user_id']}'");
}


2 commentaires

Notez que pour optimiser les performances, la requête doit être exécutée uniquement le nombre de fois que le niveau doit être modifié.


Je suis d'accord avec vous, mais le seul moyen de minimiser les appels consiste à disposer du niveau utilisateur actuel Var disponible. De cette façon, nous venons de transmettre ce Var en état et vérifions si le niveau utilisateur a toujours le même niveau afin de ne pas apporter aucun appel, surwizez s'il est inférieur au niveau de point existant, nous appelons un appel à dB



0
votes

Si je ne vous ai pas mal compris, vous interrogez alors que diriez-vous de cette façon? XXX


2 commentaires

Ce code fait la même chose, cela appelle à DB à chaque fois qu'il a une matrimonie non vide.


@ Sergheleonenco a été édité, qu'en est-il maintenant :)



0
votes

Nous devons obtenir le niveau d'utilisateur actuel. Juste un appel

$sql = "SELECT user_level FROM boom_users WHERE user_id = '{$data['user_id']}'");    
//get the current user level
$level = $mysqli->query($sql)->fetch_object()->user_level;

//compare if user approached the 2001 limit but not exceed 5000 limit 
if($data[chat_points] >= '2001' && $data[chat_points] < '5000' && $level != 1){
    $mysqli->query("UPDATE boom_users SET user_level = 1 WHERE user_id = '{$data['user_id']}'");
}


0 commentaires