在 $.post 中创建动态变量赋值 - JQuery

Posted

技术标签:

【中文标题】在 $.post 中创建动态变量赋值 - JQuery【英文标题】:Create dynamic variable assignment inside $.post - JQuery 【发布时间】:2016-05-11 09:56:19 【问题描述】:

我可以在$.post JQuery/Ajax 代码中使用动态变量吗?我想知道我在哪里犯了错误或者我误解了JQuery的$.post的用法。

我有动态创建的变量和从 text-fields 分配给它的值。现在我想在 JQuery 的 $.post 中使用这些变量。

代码如下:

工作正常的部分:

var boxFields = ["customerId","customerName","customerContact","customerEmail"];
var boxVar = [];

for(var x=0;x<4;x++)

	boxVar[x] = $("#" + boxFields[x]).val();


alert(boxVar[1]); //Just random call to check it works.
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<input type="text" id="customerId" value="12345"/>
<br>
<br>
<input type="text" id="customerName" value="John Doe"/>
<br>
<br>
<input type="text" id="customerContact" value="XXXXXXXXXX"/>
<br>
<br>
<input type="text" id="customerEmail" value="xxxxxx@xxx.com"/>

现在我已经动态生成了变量(check above hidden snippet for that)。所以使用$.post中的那些。

更新:

抱歉,遗漏了实际部分

我的问题/疑问:我可以使用 for 循环在 $.post 中创建动态对象吗?

完整代码:

var boxFields = ["customerId","customerName","customerContact","customerEmail"];
var boxVar = [];

for(var x=0;x<4;x++)

	boxVar[x] = $("#" + boxFields[x]).val();


$.post("url.php",

  requestType: "updateRow",
  
  for(var y=0;y<4;y++)
  
    boxFields[y]: boxVar[y] 
    if(y!=3),  
  
  
  /* I want above code to work like this:
  requestType: "updateRow",
  customerId: 12345,
  customerName: John Doe,
  customerContact: XXXXXXXXXX,
  customerEmail: xxxxxx@xxx.com
  */
,
function(data)

 //Success Code Lines..........
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<input type="text" id="customerId" value="12345"/>
<br>
<br>
<input type="text" id="customerName" value="John Doe"/>
<br>
<br>
<input type="text" id="customerContact" value="XXXXXXXXXX"/>
<br>
<br>
<input type="text" id="customerEmail" value="xxxxxx@xxx.com"/>

也想知道如何防止SQL注入

谢谢!

【问题讨论】:

你有什么问题?什么不工作?您所说的只是您的代码“运行良好”。所以...你在问什么?至于 SQL 注入,无论您实际与 SQL 服务器进行交互,您都可以处理它。您在此代码中的任何地方都没有这样做。 很抱歉错过了实际问题。 【参考方案1】:

您不能在 post 函数中放置循环(循环不是对象),但您可以在 post 之前构造数据。更清洁的方法是:

var data = 
  requestType: "updateRow"
;

$('input').each(function()  // change the selector to be more precise
  data[$(this).attr('id')] = $(this).val();
);

console.log(data);

$.post("url.php", data, function(data) 
  //Success Code Lines..........
);

SQL 注入

即使您可以在 JS 中进行一些检查,但真正防止 SQL 注入的唯一方法是在与 SQL 数据库交互时在服务器端转义/检查/使用特殊方法。

【讨论】:

这必须发生,因为在这种情况下找不到名为 url.php 的文件。 当然是问题所在。但由于数据是正确的,它应该适合您。 很抱歉错过了实际问题。【参考方案2】:

我可以使用 for 循环在 $.post 中创建动态对象吗?

不在内部.post()的调用,没有。这与.post() 本身或AJAX 或类似的东西无关,而只是作为语言的语法。考虑一下你的尝试:

$.post("url.php",

  requestType: "updateRow", 
  for(var y=0;y<4;y++)
  
    boxFields[y]: boxVar[y] 
    if(y!=3),  
  
  //...

函数的第二个参数只是一个对象。循环和其他控制结构之类的东西对于声明对象无效。你可以做的就是你之前已经做过的。构建对象,然后在函数调用中使用它:

var someArray = [];
for(var x = 0; x < 4; x++)

    someArray[x] = someValue;

// etc.

// later...
$.post('url.php', someArray, function ()  /.../ );

基本上,循环不是可以传递给函数的对象。它是命令式代码的控制结构。

【讨论】:

所以基本上我不能从数组创建动态对象(like: customerName: )?我必须按照以前的方式去吗? @divy3993:在使用之前创建对象有什么问题?你想在这里解决什么实际问题?你可以动态地创建东西,但你必须在语言的语法范围内这样做。 我在这里要做的是,从boxFields 中获取数组的值,我可以用它来获取text-fields 的值,因为它们有similar id's,也可以使用@ 内部的值987654329@作为对象名(like: customerName: ) 重点只是让代码更短。顺便谢谢您的回复。 @divy3993:“更短”的代码不一定是“更好”的代码。不要试图让你的代码尽可能聪明。让它简单明了。构建对象,在函数调用中使用对象。如果您可以在单个代码语句中清晰而轻松地构建对象,那么您可以直接在函数调用中做到这一点。但是您不能以您尝试的方式使用整个控制结构。

以上是关于在 $.post 中创建动态变量赋值 - JQuery的主要内容,如果未能解决你的问题,请参考以下文章

在前块中创建的 Rspec 变量在功能规范到达 POSTed 控制器操作时被删除

如何在 Amplify Datastore 中创建动态查询

T_SQL编程赋值分支语句循环

java中创建一个客户类数组customer[] 怎么给数组中的变量赋值?

我的Android进阶之旅如何在Retrofit2 中创建动态 URL?

如何在数据表中动态创建列并为其赋值?