新值覆盖以前的值

时间:2010-10-12 01:14:46

标签: php javascript ajax

好的,我有这个javascript

function getpreconfigproducts(str1,str2)
{
var url="ajax_preconfig_products.php?";
url=url+"id="+str1+"&cid="+str2;
xmlHttp = GetXmlHttpObject(stateChangeHandler);
xmlHttp_Get(xmlHttp, url);
return false;
}

它称之为php

<?php 
if($_GET['id']!='')
{
   $sql="SELECT * FROM productinfo WHERE ProductID=".$_GET['id']." AND Status=1";
   $pro=ExecuteGetRows($sql);
?>
<p>Qty: <input type="input" name="qty[]" id="fpro[]" value="1" style="width:15px; margin-top:-3px;" /> <label><?php echo $pro[0]['ProductName'];?></label> </p>
<?php 
        echo "^_^";
        echo ",".$pro[0]['ProductID'];
    } ?>

生成此

<div class="fields">
<h2>Final Products</h2>
<p id="finalproductsid">
  <p>Qty: <input name="qty[]" id="fpro[]" value="1" style="width: 15px; margin-top: -3px;" type="input"> <label>FIREBOX S5510 15</label> </p>
  <p>Qty: <input name="qty[]" id="fpro[]" value="1" style="width: 15px; margin-top: -3px;" type="input"> <label>FIREBOX S5510 15</label> </p>
</p>
</div>

问题在于,如果用户将输入qty []更改为5并添加另一个产品,则会将其恢复为1 ...任何想法如何解决此问题

2 个答案:

答案 0 :(得分:1)

除了已经提到的所有SQL注入内容之外,我想我可能知道你的问题是什么。如果我理解你的剧本,请告诉我:

  1. 用户点击“添加产品”按钮
  2. 按钮向上面的PHP脚本发出AJAX请求
  3. PHP脚本生成一些HTML
  4. 以某种方式(?)显示生成的HTML
  5. 表单中所有其他产品字段的值将恢复为一个
  6. 我假设#4是问题(#5)发生的地方。根据您将HTML附加到表单的方式,输入字段有时会还原。例如:

    //Reverts all form inputs to default-
    myForm.innerHTML += "<input name='new_input'/>";
    //Keeps current input values-
    var newNode = document.createElement('input');
    myForm.appendChild(newNode);
    

    我可以建议,您不是添加HTML字符串,而是使用JavaScript创建HTML,通过AJAX请求获取产品名称/ ID。

    我不太明白你的脚本是如何工作的。就我的有限知识而言,PHP不会显示在当前页面上,而是回显到AJAX的响应文本。还有更多东西,还是仅仅是我?

答案 1 :(得分:1)

Re:sql注入在哪里?

这个答案是对OP关于sql注入错误的评论的回应。

注意这一行:

$sql="SELECT * FROM productinfo WHERE ProductID=".$_GET['id']." AND Status=1";

错误是“id”的传入HTML值未正确转义。你期望它将包含一个整数或什么都没有。但如果黑客发送了类似

的内容

1;truncate users;select * from users where id=1作为id的值,你最终会得到sql语句:

$sql="SELECT * FROM productinfo WHERE ProductID=1;truncate users;select * from users where id=1 AND Status=1";

正确的方法是始终 始终 始终正确转义或取消任何来自该计划的数据。对于Php MySQL dbms查询(manual):

$sql= sprintf("SELECT * FROM productinfo WHERE ProductID=%s AND Status=1",
      mysql_real_escape_string($_GET['id']));

注意:

  • 对于MySQL以外的数据库,还有其他Php技术。参见文档。