【问题标题】:Passing values from jQuery to PHP将值从 jQuery 传递到 PHP
【发布时间】:2009-05-23 17:42:42
【问题描述】:

情况如下:

我正在使用 jquery.validate.js 来验证我的表单,但我需要添加一个服务器端验证层。 jQuery Validate 使用表单元素中的类名来确定它应该做什么——我想将这些类名提取到 PHP 中,以便我可以在服务器端执行相同的验证。

我希望做这样的事情:

foreach($_POST as $key=>$value) {
     $class=array(...// get this #key element class name list with jQuery
     $error=...// based on the class names, perform specific PHP validations
     if($error=="")
         return true;
     else
         return false;
}

问题是,我可以这样做吗?我可以使用 jQuery 获取元素类名称并将它们传递给 PHP 吗?

【问题讨论】:

    标签: php jquery


    【解决方案1】:

    您可以让 jQuery 将类名与表单一起发送 - 但是这会导致严重的安全问题。看到发布到您服务器的所有内容实际上都是由您的用户浏览器完成的,您的用户将能够更改您的验证规则并因此绕过它们,这将使您在这里的整个目的毫无用处。我会建议以下内容。

    在 php 中创建一个函数来获取表单元素的名称并返回适当的类名。为表单生成每个表单元素时,调用此函数以获取类名(然后应用 jQuery 验证)。当您在 PHP 代码中读取表单时 - 使用相同的函数来获取类名,然后您就知道在服务器端 php 代码中应用哪些验证规则。

    希望这是有道理的。

    【讨论】:

    • 如何从 jQuery 调用 PHP 函数?
    • @Ronny-André Bendiksen - 这是一个完全不同的话题,如果提出一个新问题可能会更好。简短的版本是有一个常规的 .php 页面,在该页面中调用该函数 - 然后使用 jQuery.ajax 方法(有关此内容的更深入解释,请参阅 jQuery 手册)
    【解决方案2】:

    永远不要相信客户端(浏览器)!

    您不应该让客户端上的任何东西指示服务器如何测试发布信息的有效性。

    这是一个非常糟糕的主意。

    【讨论】:

      【解决方案3】:

      客户端:

      function validate()
      {
          var params = {
             var1: {key:$('#field1').get(0).className, value:$('#field1').get(0).value},
             var2: {key:$('#field2').get(0).className, value:$('#field2').get(0).value},    
             ...
          }
          $.post('http://host/validate_script.php', params, onValidate);
      }
      function onValidate(data)
      {
          alert(data);
      }
      

      希望这会有所帮助...确保这是一种简单的方法,并且您可以更正式地进行操作。

      【讨论】:

        【解决方案4】:

        serializeArray 会将您的表单数据转换为 JSON:

        var json = $('#formid').serializeArray();
        

        通常,您可以将整个 JSON 字符串发送到可以从那里获取的服务器。

        【讨论】:

          【解决方案5】:

          如上所述,您可以使用 AJAX 和 JSON 将值传递给 PHP。但是,这不会提供比常规 JS 验证更安全的验证(因为您的 PHP 仍将依赖于您的 JS)

          如果您选择使用此方法,这里是对 Evgeniy Savichev 之前提供的脚本的一些改进

          <script type="text/javascript">
          params = {
              elementName : {
                  className : $('elementId').attr('class'),
                  elementValue : $('elemenetId').val()
              },
              anotherElement : {
                  //etc
              }
          
          }
          
          $.post('http://host/validate_script.php', params, onValidate);
          
          function onValidate(data)
          {
              alert(data);
          }
          </script>
          

          但是更好的解决方案是自动生成和验证您的表单元素。 Zend 框架有一个很棒的类可以做到这一点。如果您决定编写自己的脚本,我已经提供了一个简化版本。

          希望对你有所帮助

          • 维姆

            $elements = array(
                'email-field' => array('email', 'required'),
                'integer'  => array('integer')
            );
            
            if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
                $error = false;
                foreach($elements as $elementName => $validators) {
                    if (array_key_exists($elementName, $_POST)) {
                        foreach ($elements[$elementName] as $validator ) {
                            switch($validator) {
                                case 'email':
                                    if (filter_input(FILTER_VALIDATE_EMAIL, $elementValue)) {
                                        $error = true;
                                    }
                                    break;
                                case 'integer':
                                    // etc
                                    break;
                                default :
                                    break;
                            }
                        }
                    } else {
                        if ( in_array('required', $validators) ) {
                            $error = true;
                        }
                    }
                }
                if ( $error ) {
                    // etc
                }
            }
            ?>
            

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-02-12
            • 2017-12-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多