【问题标题】:Jquery .post() return arrayJquery .post() 返回数组
【发布时间】:2011-07-19 12:47:52
【问题描述】:

抱歉标题不好,但我不知道如何命名。我的问题是,每当我从选择框中传递一个值时,我都会触发此 jquery 事件以检查复选框。基本上我会回显 $res[];在 selectedgr.php 中。我需要使用json吗?我该怎么做?

主页:

$("#group_name").change(function(){
    var groupname = $("#group_name").val();
    var selectedGroup = 'gr_name='+ groupname;
    $.post("selectedgr.php", {data: selectedGroup}, function(data){
        $.each(data, function(){
            $("#" + this).attr("checked","checked");
        });
    },"json");


});

PHP (selectedgr.php):

<?php
    include_once '../include/lib.php';
    $gr_name=mysql_real_escape_string($_POST['gr_name']);

    $sqlgr = "SELECT * FROM PRIVILLAGE WHERE MAINGR_ID=".$gr_name;
    $resultgr = sql($sqlgr);
    while($rowgr = mysql_fetch_array($resultgr)){
        $res[] = $rowgr['ACT_ID'];
    }

    echo $res[];
?>

【问题讨论】:

  • 你的代码存在SQL injection漏洞
  • 在哪里??请指导我>
  • @Eric 你需要使用mysql_real_escape_string() 转义$gr_name 如果它是一个字符串(那么你需要添加引号)或者如果它是一个数字ID,检查它是否是一个使用intval() 的数字。
  • `$.each(data, function(){ $("#" + this).attr("checked","checked"); });`的目的是什么跨度>
  • $sqlgr = "SELECT * FROM PRIVILLAGE WHERE MAINGR_ID=".$gr_name; 在这里。您应该使用 sql 占位符(绑定变量)。像这样: $sql = "SELECT * FROM PRIVILLAGE WHERE MAINGR_ID=:n"; $stmt = $pdo->prepare($sql); // 将 php 变量绑定到语句中的占位符 $stmt->bindParam(':n', $gr_name); $stmt->执行(); //对不起,我不是 php 大师 ;) 但你有一个想法......

标签: php jquery arrays json .post


【解决方案1】:

将 PHP 示例 (echo $res[];) 中的最后一行更改为:

echo json_encode($res);

json_encode() 手册页会告诉你更多。

正如@Unicron 所说,您需要在将 $gr_name 变量传递给 SQL 语句之前对其进行验证。

你可以使用:

if(isset($_POST['gr_name'])) {
    $gr_name = mysql_real_escape_string($_POST['gr_name']);
}

有关 PHP 手册中的更多信息,请参阅:http://php.net/manual/en/function.mysql-real-escape-string.php

【讨论】:

  • 如果你想使用 JSON,这将是我的建议
【解决方案2】:

您可以使用json_encode 函数将任意数据转换为 JSON。假设你想返回一个字符串数组,下面是你将如何使用 json_encode:

<?php
    include_once '../include/lib.php';
    $res = array(); // initialize variables
    $sqlgr = sprintf("
        SELECT ACT_ID
        FROM PRIVILLAGE
        WHERE MAINGR_ID=%d
        ",
        $_POST['gr_name']
    ); // only select those columns that you need
       // and do not trust user input
    $resultgr = sql($sqlgr);
    while($rowgr = mysql_fetch_array($resultgr)){
        $res[] = $rowgr['ACT_ID'];
    }
    echo json_encode($res); // use json_encode to convert the PHP array into a JSON object
                            // this will output something like ['foo', 'bar', 'blah', 'baz'] as a string
?>

在客户端你可以使用jQuery.post method,像这样:

<script type="text/javascript">
$("#group_name").change(function () {
    $.post("selectedgr.php", {
        gr_name: $(this).val()
    }, function (data) {
        // console.log(data);
        // jQuery will convert the string "['foo', 'bar', 'blah', 'baz']" into a JavaScript object
        // (an array in this case) and pass as the first parameter
        for(var i = 0; i < data.length; i++) {
            $("#" + data[i]).attr("checked", "checked");
        }
    }, "json");
});
</script>

【讨论】:

    【解决方案3】:

    如果您想使用 JSON,请使用 echo json_encode($res); 但是我真的不明白如果你的代码现在可以工作你会得到什么,因为你仍然需要在 Javascript 中进行一些处理来处理结果。

    【讨论】:

      【解决方案4】:

      我发现我的主要问题如下

      而不是(之前):

       $.post("selectedgr.php", {data: selectedGroup}, function(data){
      

      这样做(之后):

      $.post("selectedgr.php", selectedGroup, function(data){
      

      原谅我的不好。啊,伙计们,关于 mysql 上的转义实际上 #group_name 不是任何输入字段,而是一个选择框。感谢每一个评论、建议和指导。

      埃里克。

      【讨论】:

      • 不要仅仅因为它是一个选择框就假设某人不会尝试发布您不期望的值。 firefox 有很多插件可以更改表单中的字段类型,有些人可以编写一个机器人,发出一个 CURL 请求您的 AJAX 端点,或者简单地编写他们自己的 HTML 表单以提交到您的 PHP。验证一切
      • 好吧,会逃跑的~谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多