sistema de crachá e as condições de armazenamento como variáveis?
-
22-08-2019 - |
Pergunta
Eu estou tentando escrever um pedaço de código que verifica a usuários estatísticas, seja que os seus pontos, posição ou num_friends e por sua vez prêmios lhes um distintivo semelhante ao utilizado no SO. O sistema é definido de modo quando uma tarefa (votar-se, comentário, etc.) é completado por um usuário, seu user_id é gravado e em fila para serem avaliadas em intervalos de 5 minutos de um trabalho cron. É esta a maneira mais eficiente de fazer isso? Vi outro post sobre emblemas, mas não tenho certeza se este é o método que foi escolhida como a forma preferida.
Outra questão que tenho é sobre realmente verificar estas variáveis ??(pontos, grau, num_friends) contra o usuário. Eu tenho um número de emblemas e quer permitir que os administradores para adicionar seu próprio onde eles selecionar uma variável, o operador (==,> =, etc.) e o valor é ajustado para. Como posso avaliar que em uma instrução condicional IF? Eu tentei usar o switch para os operadores, mas não é possível obter as variáveis ??a serem avaliadas corretamente, como:
function checkbadges($userid,$points,$rank,$friends){
global $database;
$q = $database->db_query("SELECT * FROM badges");
while($bq = $database->db_fetch_assoc($q)) {
switch($bq[badge_sign]) {
case "1":
if($bq[badge_var] == $bq[badge_value])
givebadge($userid, $bq[badge_id]);
break;
case "2":
if($bq[badge_var] >= $bq[badge_value]))
givebadge($userid, $bq[badge_id]);
break;
case "3":
if($bq[badge_var] <= $bq[badge_value]))
givebadge($userid, $bq[badge_id]);
break;
case "4":
if($bq[badge_var] != $bq[badge_value]))
givebadge($userid, $bq[badge_id]);
break;
}
}
}
Eu acho que eu tenho que usar eval (), mas eu não sei como, qualquer ajuda seria apreciada!
Solução
Se $bq['badge_var']
é uma string que é um nome de variável válido no escopo atual, você pode simplesmente fazer isso:
$value = ${ $bq['badge_var'] };
Pode ser mais seguro e mais fácil de estender se você passar um array para checkbadges()
vez:
function checkbadges($userid,$userdata){
global $database;
$q = $database->db_query("SELECT * FROM badges");
while($bq = $database->db_fetch_assoc($q)) {
$currentValue = $userdata[ $db['badge_var'] ];
$requiredValue = $db['badge_value'];
$issueBadge = false;
switch($bq['badge_sign']) {
case "1":
$issueBadge = ( $currentValue == $requiredValue );
break;
case "2":
$issueBadge = ( $currentValue >= $requiredValue );
break;
case "3":
$issueBadge = ( $currentValue <= $requiredValue );
break;
case "4":
$issueBadge = ( $currentValue != $requiredValue );
break;
}
if ($issueBadge) {
givebadge($userid, $bq['badge_id']);
}
}
}
onde $userdata
é algo como isto:
array( 'points' => 1 , 'friends' => 10, 'rank' => 10 );
Você pode então estender as variáveis ??disponíveis sem modificar a função
Outras dicas
Qual é o valor esperado eo valor observado da variável que não estão recebendo o valor correto para?
Além disso, a sua melhor prática para usar:
$arr['key']
em vez de
$arr[key]
como PHP irá avaliá-lo primeiro como uma constante que é uma prática ruim, veja PHP Referência: Arrays