【问题标题】:jQuery ajax output as return of a functionjQuery ajax 输出作为函数的返回
【发布时间】:2010-01-09 13:51:02
【问题描述】:

我创建了一个小的 php 脚本,它根据给定的 post/get 参数返回一个 mysql 结果。有了这个文件,我现在可以使用 jquery.post 或 .get 命令从我的数据库中检索某些内容。

脚本总是返回 1 个值。所以我尝试制作一个 javascript 函数,从数据库中返回检索到的值。

这是我想要它做的,但我没有像它应该做的那样工作:

function mysql(args) {
    $.post("scripts/ajax_mysql.php",args,function(data) {
        return data;
    });
}

var value=mysql({ table:"user", where:"nickname='test'", get:"email" });

似乎在函数已经传递时检索数据。有解决办法吗?

【问题讨论】:

  • 这看起来像是一个可怕的安全漏洞,您实际上是在让任何访问者访问您的整个数据库。另请查看:en.wikipedia.org/wiki/SQL_injection
  • 不错,没想到。
  • 有安全的方法来实现这一点吗?
  • 不允许任意查询。为您需要执行的每个查询创建一个特定的方法,并且只传递参数。在服务器上使用参数化查询。

标签: php javascript jquery mysql


【解决方案1】:

抛开让用户基本上创建任何类型的 SQL 命令并将其发送到您的服务器的问题——一个具有可怕安全隐患的可怕想法,您的脚本的问题是未能理解 AJAX 的本质。

AJAX 调用是异步的,因此您的方法会在 AJAX 调用完成之前返回。你有两种方法来处理这个问题。将回调传递给您的函数,并在 AJAX 发布完成时执行回调。这保持了请求的异步性质。或者,您可以使用完整的 $.ajax() 语法来执行发布并将 async 参数设置为 true。然后,您可以将 AJAX 请求的结果存储在一个作用域为函数外部块的变量中,并在函数结束时返回它。将 async 设置为 true 基本上可以完成使用回调的工作,除了 jQuery 在后台处理它。

function mysql(data, callback) {
     $.post( "scripts/ajax_mysql.php",args,function(data) {
         if (callback) {
            callback(data);
         }
     });
}

mysql({ table:"user", where:"nickname='test'", get:"email" }, function(user) {
     $('#email').val(user.email);
     ...
});

function mysql(data, callback) {
     var value;
     $.ajax({
        url: "scripts/ajax_mysql.php",
        type: 'post',
        async: false,
        data: args,
        success: function(data) {
                    value = data;
                 }
     });
     return value;
}

使用您现有的调用语义。

【讨论】:

  • 这样我应该只删除整个 mysql 函数并使用 $.post 回调。
  • 不一定。打包代码集可以很方便地减少设置的重复。你也想保持你的 JavaScript DRY。
【解决方案2】:

Ajax 是异步的。调用该函数会触发一个请求,然后程序继续。

当请求返回并触发事件时,附加的事件处理程序会处理数据。

您可以使用 XHR 进行同步,但不建议这样做。

设计您的程序以处理回调中检索到的数据,而不是作为返回的变量。

【讨论】:

    【解决方案3】:

    问题是return data语句不会导致mysql函数“返回”。

    我要做的是从mysql函数返回$.post调用返回的XMLHTTPRequest对象,然后为成功的ajax调用添加一个监听器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-11
      • 2017-08-09
      • 2012-09-29
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      相关资源
      最近更新 更多