342 votes

WRONGTYPE Opération sur une clé contenant le mauvais type de valeur php

Lorsque j'essaie d'accéder à une clé par la méthode get, j'obtiens l'erreur suivante : "WRONGTYPE Operation against a key holding the wrong kind of value".

J'utilise le code suivant pour accéder à la valeur de la clé -

J'utilise ce code pour récupérer les données de redis

$values = "l_messages";
$value = $redis->HGETALL($values);
print($value);

952voto

Phoebe Li Points 995

Redis prend en charge 5 types de données. Vous devez savoir à quel type de valeur correspond une clé, car pour chaque type de données, la commande pour la récupérer est différente.

Voici les commandes permettant de récupérer la valeur d'une clé :

  • si la valeur est de type string -> GET <key>
  • si la valeur est de type hash -> HGETALL <key>
  • si la valeur est du type lists -> lrange <key> <start> <end>
  • si la valeur est du type sets -> smembers <key>
  • si la valeur est du type ensembles triés -> ZRANGEBYSCORE <key> <min> <max>

Utiliser le TYPE pour vérifier le type de valeur auquel correspond une clé :

  • type <key>

7 votes

Vous avez sauvé la situation :-)

1 votes

Ainsi, lorsque vous utilisez les méthodes qui écrivent/lisent directement des byte[], laquelle de ces méthodes est utilisée ?

0 votes

Très bonne fiche d'accompagnement, merci

27voto

Narayan Bhat Points 31

Cette erreur indique que vous essayez d'insérer une valeur erronée dans la clé, ce qui signifie qu'il existe déjà la même clé mais avec une structure de données différente.

Pour obtenir toutes les clés, faites ceci dans le client redis

keys *

Cela devrait permettre d'afficher toutes les clés Maintenant, pour obtenir le type de valeur que la clé stocke, faites

type <key>

Il indique donc la valeur que vous pouvez introduire dans la clé. Dans mon cas, le type était string (en utilisant set) et j'essayais d'utiliser la clé comme une liste.

13voto

advance512 Points 878

Cette erreur signifie que la valeur indexée par la clé "l_messages" n'est pas de type hash mais plutôt autre chose. Vous l'avez probablement défini à cette autre valeur plus tôt dans votre code. Essayez d'autres commandes de changement de valeur, en commençant par GET, pour voir laquelle fonctionne et vous saurez quel type est réellement présent.

11 votes

En fait, print($redis->TYPE($values)); vous le dira sans vous faire d'illusions ;)

1 votes

Super :) Je ne connaissais pas cette commande, je n'ai jamais eu à l'utiliser. Voici la documentation : redis.io/commandes/type

4voto

Gishas Points 87

J'ai rencontré ce problème en essayant de configurer quelque chose sur redis. Le problème est que j'ai précédemment utilisé la méthode "set" pour définir des données avec une certaine clé, comme

$redis->set('persons', $persons)

Plus tard, j'ai décidé de passer à la méthode "hSet", et j'ai essayé de la manière suivante

foreach($persons as $person){
    $redis->hSet('persons', $person->id, $person);
}

J'ai ensuite obtenu l'erreur susmentionnée. Ce que j'ai dû faire, c'est aller dans redis-cli et supprimer manuellement l'entrée "persons" avec

del persons

Il ne pouvait tout simplement pas écrire une structure de données différente sous la clé existante, j'ai donc dû supprimer l'entrée et hSet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X