Ilişkilendirilebilir dizilerle yardıma ihtiyacınız var

4 Cevap php

Beynim kodlama 10 saat sonra kızarmış, bu yüzden biraz yardıma ihtiyacım olduğunu.

(Ben, vb girişi doğrulayarak, verilerin işlenmesi önce) ben bir form gönderme veri almak için aşağıdaki işlevi kullanmış:

  // All form fields are identified by '[id]_[name]', where 'id' is the 
  // identifier of the form type. Eg. brand, store etc.
  // The field identifier we want to return is just the name and not the id.
  public function getFormData() {
    $formData = array();
    foreach ($_POST as $key => $value) {
      $name = preg_replace('!.*_!', '', $key);
      if (is_array($value)) {
        $formData[$name] = implode(',', $value);
      } else {
        $formData[$name] = $value;
      }
    }
    return $formData;
  }

Şimdi AJAX kullanarak formunu teslim ediyorum, bu yüzden bir daha bu işlevi kullanmak mümkün değilim.

Benim $ _POST ['formData'] dizesi bu (kısa versiyon) gibi görünüyor:

"store_name=My+new+store&store_street1=Some+address&store_zipcode=1188"

Amacım aşağıdaki kodu çalıştırmak mümkün değildir:

echo $formData['name'] //Displays 'Some address'

Benim jQuery kod şöyle görünür:

  function processRegistration()
  {

    var formData = jQuery('#registerStore form').serialize();

    jQuery.post("mypath/jquery_bll.php", { instance: 'processRegistration', formData : formData },
      function(data)
      {
          alert('some test data here');
      },"json");

Nasıl bir Ajax çağrısı verileri işlemek için benim işlevi değiştirebilirim?

4 Cevap

Ben senin kullanarak fark:

jQuery.post("mypath/jquery_bll.php", { instance: 'processRegistration', formData : formData },

Kodunuzda hangi olacak muhtemelen çıktı:

instance=processRegistration&formData=field1=value1&field2=value2

Peki php betik elde edecektir:

$_POST = array(
  'instance'=>'processRegistration',
  'formData'=>'field1=value1',
  'field2'=>'value2
);

Edit: This is because the serialized object will create a query string that is ready to be sent and then you are putting it inside an object for the data parameter.
The data parameter either accepts an key/value object or query string from the likes of jquery.fn.serialize.
http://docs.jquery.com/Ajax/jQuery.post
So maybe if you change this line:

jQuery.post("mypath/jquery_bll.php", { instance: 'processRegistration', formData : formData },

.. Için ..

jQuery.post("mypath/jquery_bll.php", formData + '&instance=processRegistration',

Bunun işe yarayacağını

Bir ajax çağrısı ve bir tarayıcı normal bir çağrı arasında işlevsel bir fark yoktur.

Peki, cevap ...

$formData = getFormData();
echo $formData['name'];

Eğer jquery eklentisi repo mevcut olmasa da bu küçük eklenti kullanabilirsiniz eklentileri kullanarak açıksa

$.params2json = function(d) {
    if (d.constructor != Array) {
        return d;
    }
    var data={};
    for(var i=0;i<d.length;i++) {
        if (typeof data[d[i].name] != 'undefined') {
            if (data[d[i].name].constructor!= Array) {
                data[d[i].name]=[data[d[i].name],d[i].value];
            } else {
                data[d[i].name].push(d[i].value);
            }
        } else {
            data[d[i].name]=d[i].value;
        }
    }
    return data;
};

Sen eklentisi ile aşağıdaki kodu kullanabilirsiniz:

function processRegistration()
{
  var formData = $.params2json($('#registerStore form').serializeArray());
  formData.instance = 'processRegistration';
  $.post('mypath/jquery_bll.php', formData,
    function(data) {
      alert('some test data here');
    }, "json");
  });
}