选择框到textarea到PHP:转移不出现在$ _POST中

时间:2013-01-22 15:51:27

标签: php javascript

这是一个奇怪的问题。

我有以下javascript代码:

function doTransfer(target, source)
{
    var targetObj = f_getElement(target);
    var tempText = targetObj.value.split(',');
    var len = tempText.length;
    var targetText = new Array;
    var text;
    var selection;
    var split;
    for(var i = 0; i < len; i ++)
    {
        text = trim(tempText[i]);
        if(text)
            targetText.push(text);
    }
    var sourceObj = f_getElement(source);
    len = sourceObj.options.length;
    for(i = 0; i < len; i++)
    {
        split = sourceObj.options[i].value.split('_');
        selection = decode_base64(split[1]);
// When searching for existing word, we ignore case as different words may be indicated by different use of case on the same letters.
// i.e. we trust the user to get it right.
        if(sourceObj.options[i].selected && (searchArray(targetText, selection) == -1))
            targetText.push(selection);
    }
    targetObj.value = targetText.join(',');
}

function f_getElement(id)
{
    return document.getElementById(id);
}

这一切都运行正常,并将多个选择(base64_encoded)从选择框传输到目标textarea(base64_decoded - 此处未显示javascript代码)。

假设我转移3个选项('aaa','aaaa','aaaaa'),然后我在textarea中获得'aaa,aaaa,aaaaa'。这就是我想要的。

然后我点击了提交按钮,但是我没有在textarea的$ _POST变量中获得'aaa,aaaa,aaaaa',而是获得'aaa,aaaa'。

我注意到的一些事情:

  1. 'aaa,aaaa'transition正确显示在$ _POST。
  2. 'aaaaa'转移正确显示在$ _POST。
  3. 'aaa,aaaaa'转移正确显示在$ _POST。
  4. 同样的错误和成功与“b”的类似变化一起出现。
  5. 'UT1,UT2,UT3,UT4,UT5'转移正确显示在$ _POST中。
  6. *如果我键入'aaa,aaaa,aaaaa'进入textarea,它确实在$ _POST中正确显示。*
  7. 我很困惑,不知道从哪里开始追踪问题。

    此致

    标记

    网关功能:

    /**
    * Gateway to AJAX javascript functions
    * @param input - JSON string representing an array of sets of instructions to be processed in numerical order. At the very
    * least a startFunction() method should be present in each set.
    */
    function gateway(input)
    {
        var parsedInput = JSON.parse(input);
        var inputLen = parsedInput.length;
        if(gateway.aobj_index == undefined)
            gateway.aobj_index = -1;
        gateway.aobj_index++;
        for(var i = 0; i < inputLen; i++)
        {
            if(parsedInput[i].startFunction != undefined)
            {
                A_OBJ[gateway.aobj_index] = new AJAXOBJECT();
                A_OBJ[gateway.aobj_index].input = parsedInput[i];
                A_OBJ[gateway.aobj_index].evalReturn = eval('(' + A_OBJ[gateway.aobj_index].input.startFunction + '())');
                if(A_OBJ[gateway.aobj_index].evalReturn == false)
                {
                    return false;
                }
            }
            else
            {
                alert('No startFunction() defined');
                return false;
            }
            gateway.aobj_index++;
        }
        return true;
    }
    
    /**
    * The object used for independent AJAX instances
    */
    function AJAXOBJECT()
    {
    //properties
        this.input = null;
        this.processedScript = null;
        this.phpResponse = null;
        this.targetObj = null;
        this.evalReturn = null;
    // methods
        this.checkInput = checkInput;
        this.doXmlHttp = doXmlHttp;
    }
    
    /**
    * Check required input parameters are present in input
    * @param input array
    * @return false|true
    */
    function checkInput(inputArray)
    {
        var len = inputArray.length;
        for(var i = 0; i < len; i++)
        {
            if(this.input[inputArray[i]] == undefined)
            {
                alert('required input parameter is missing: ' + inputArray[i]);
                return false;
            }
        }
        return true;
    }
    
    /**
    * Create the xmlHttp object
    * @return xmlHttp object
    */  
    function createXmlHttpObject()
    {
        var xmlHttp = false;
    //Check if we are using IE.
        try
        {
    //If the javascript version is greater than 5.
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
        } 
        catch (e)
        {
    //If not, then use the older active x object.
            try
            {
    //If we are using IE.
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            } 
            catch (E)
            {
    //Else we must be using a non-IE browser.
                xmlHttp = false;
            }
        }
    //If we are using a non-IE browser, create a JavaScript instance of the object.
        if (!xmlHttp && typeof XMLHttpRequest != undefined)
        {
            xmlHttp = new XMLHttpRequest();
        }
        return xmlHttp;
    }
    
    /**
    * Execute the xmlHTTP object
    *
    * @return true|false
    */
    function doXmlHttp()
    {
        if(this.targetObj == null)
        {
            alert('No AJAXOBJECT targetObj property set');
            return false;
        }
        if(this.processedScript == null)
        {
            alert('No AJAXOBJECT processedScript property set');
            return false;
        }
        var targetObj = this.targetObj;
        var xmlHttp = createXmlHttpObject();
        xmlHttp.open("GET", this.processedScript, true);
    //alert(this.processedScript);
        xmlHttp.onreadystatechange = function()
        {
            if((xmlHttp.readyState == 4) && (xmlHttp.status == 200))
            {
                try
                {
                    this.phpResponse = JSON.parse(xmlHttp.responseText);
                }
                catch(err)
                {
                    alert('HTTP status: ' + xmlHttp.status + '. ' + err.message + ' ERROR. PHP says:\n' + xmlHttp.responseText);
                    return false;
                }
                if(this.phpResponse.ERROR)
                {
                    alert('PHP ERROR:\n' + this.phpResponse.ERROR);
                    return false;
                }
                if(this.phpResponse.innerHTML)
                    targetObj.innerHTML = this.phpResponse.innerHTML;
    //alert(this.phpResponse.next);
    // Further action to be taken?
                if(this.phpResponse.next != undefined)
                    gateway(JSON.stringify([this.phpResponse]));
            }
        }
        xmlHttp.send(null);
        A_OBJ[gateway.aobj_index].xmlHttp = xmlHttp;
        return true;
    }
    /**
    * Get an object for the requested HTML element ID
    * @return element object
    */
    function f_getElement(id)
    {
        return document.getElementById(id);
    }
    

1 个答案:

答案 0 :(得分:0)

好的,我发现了这个bug,这是一个base64编码问题。

首先是破坏代码的jsFiddle: http://jsfiddle.net/mexd7/2/

Oben Firebug控制台: https://getfirebug.com/logging

通过添加单词并查看所看到的内容来玩游戏。

现在这里是固定版本: http://jsfiddle.net/mexd7/1/

function decode_base64(s)
{
    var e={},i,k,v=[],r='',w=String.fromCharCode;
    var n=[[65,91],[97,123],[48,58],[43,44],[47,48]];

    for(z in n) {
        for(i=n[z][0];i<n[z][1];i++) {
            v.push(w(i));
        }
    }

    for(i=0;i<64;i++) {
        e[v[i]]=i;
    }

    for(i=0;i<s.length;i+=72) {
        var b=0,c,x,l=0,o=s.substring(i,i+72);
        for(x=0;x<o.length;x++) {
            c=e[o.charAt(x)];b=(b<<6)+c;l+=6;
            while(l>=8) {
            var charCode = (b>>>(l-=8))%256;

                if (charCode > 31) {
                    // only add printable chars
                    r+=w(charCode);
                }
            }
        }
    }
    return r;
}

它接缝你的base64编码器有问题,但我用解码解决了它。 不要在字符串中添加像\ 0这样的可打印字符。

http://www.asciitable.com/

相关问题