2009-12-04 4 views
1

J'écris une fonction amfphp qui devrait prendre l'entrée de chaîne. Il prend des caractères alphanumériques sans problème, mais malheureusement, il renvoie les données « 2 » si j'envoie « 2.UgnFl4kAWovazp_tVo6fHg __. 86400,1260025200-571701419 » comme paramètre.amfphp Fonction Entrée Problème

ici est la fonction (réelle simple que vous pouvez voir)

function checkOpenSession($guid, $session_key) { 
     return $session_key; 
} 
+0

Cela semble assez simple. Vous souhaiterez probablement afficher le code appelant la méthode et le code qui imprime le résultat. –

Répondre

1

Je viens d'essayer cela avec une configuration simple, et en train d'écrire les résultats dans un fichier à partir du navigateur de service et il semble être ok pour moi. Donc, le problème semble être dans la fin de l'appel.

Une autre possibilité est que amfphp modifie le type de données de la valeur renvoyée par une chaîne à un entier en raison de l'entier conduisant. Essayez de mettre un caractère alphanumérique au début de la chaîne de retour et voyez ce que cela fait.

+0

Vous avez raison sur amfphp, il change de chaîne en un entier, quand je mets alpha char au début de la chaîne, il renvoie la bonne valeur avec ma chaîne ajoutée. Connaissez-vous la solution ou le réglage pour éviter cela? (Si je ne trouve pas de solution, je mettrai un caractère comme solution temporaire) –

+0

J'ai fait un test rapide faisant écho aux chaînes qui ont ce format et php ne semble pas les convertir. Alors vous devrez trouver un paramètre de amfphp qui l'éteint. Je ne pense pas qu'il y en ait un cependant. Il est également possible que ce soit le frontal AS qui effectue la conversion. Utilisez-vous AS2 ou AS3? AS3 devrait être de type sécurisé. –

-1

guillemet vos cordes ... qui fonctionnera dehors.

1

Ce comportement est réellement présent dans le navigateur de service AMFPHP (bug), il est donc facile de se tromper comme le AMFPHP qui convertit des chaînes en nombre conduisant à int. Cependant, le problème est dans le code d'envoi. Par exemple l'envoi d'une chaîne urlencoded par la passerelle JSON fonctionne correctement (code Objective C):

NSString *theUrl = [[NSString alloc] initWithFormat:@"%@/modules/amfphp/amfphp/json.php/MysqlRemoting.checkAuth/%@/%@/1", kServerBaseUrl, userName, passMD5]; 
NSString *encodedUrl = [theUrl stringByAddingPercentEscapesUsingEncoding: NSASCIIStringEncoding]; 

Où passMD5 peut avoir un numéro de premier plan. Mais si j'entre les valeurs appropriées pour la méthode checkAuth dans le navigateur de service, il est cassé.

[modifier]

$value = urldecode($value); 
if($value != "") { 
if($value[0] != '[' && $value[0] != '{' && $value != "null" && $value != "false" && $value != "true") { 
$hasAlpha = false; 
//check to see if it is a number 
$sl = strlen($value); 
for ($i = 0; $i < $sl; $i++) { 
    $char1 = ord($value[$i]); 
    if($char1 >= 0x30 && $char1 <= 0x39) { 
    //Then this is a number 
    } else { //Else leave value as is */ 
    $hasAlpha = true; 
    } 
    } 
    if (!$hasAlpha) $value = json_decode($value, true); 
} 
     else 
     { 
      $value = json_decode($value, true); 
     } 
    } 
+0

2 ans plus tard j'ai déplacé le site qui prouve le dessus (que c'est dans le code d'envoi) à une nouvelle machine, et il s'avère que le problème est dans amfphp (ou peut-être dans l'implémentation php 5.3 de json_decode Dans amfphp/core/json/app/actions.php, ligne 48, il décode le param et ne vérifie que le premier caractère pour voir s'il devrait le coder en json_decode (c'est-à-dire supprimer les guillemets d'un nombre). toutes les lettres que vous obtenez null (sur PHP 5.3 au moins, encore une fois, cela a fonctionné avant pour moi sur 5.2.) Ci-dessous je commente dans mon changement au code pour le faire fonctionner. – ransomweaver

+0

déplacé à la réponse elle-même – ransomweaver

3

Pour contourner ce bug du navigateur de service, guillemet votre entrée sur le navigateur de service si vous attendez une chaîne sur un argument et cette chaîne commence par un numéro. J'ai eu le même problème en testant certaines méthodes via le navigateur de service et cela a bien fonctionné.

Questions connexes