Значения строк DHTML не фиксируются в SQL Insert - PullRequest
0 голосов
/ 21 января 2010

У меня есть некоторый Javascript, который динамически добавляет строки / поля, когда вы нажимаете кнопку «Добавить новый элемент». Значение для каждой строки фиксируется в скрытом текстовом поле «txtIndex». (Начальное значение txtIndex установлено в 1.) Затем я записываю txtIndex в переменную в vbscript для циклического перебора значений, чтобы все они могли быть вставлены в таблицу SQL (вставка выполняется в хранимой процедуре spInsert ). Это та часть, с которой у меня проблемы.

Первая строка на странице просто вставляется в таблицу SQL, но когда я нажимаю кнопку и добавляю любые последующие строки, эти значения не вставляются в таблицу; вместо этого вставляется пустая строка. Так что это не проблема SQL. Из того, что я вижу при просмотре исходного кода страницы, страница не распознает, что я вообще добавил какие-либо новые строки / значения. Итак, я предполагаю, что что-то в моем Javascript отключено? Может кто-нибудь сказать мне, что я делаю неправильно и как я могу это исправить? Спасибо!

<!--#includes file="header.asp"-->

<head>
<title>Offset Input</title>
</head>

<%Dim CN, RS, vIndex, vSQL

'GetDataConnection is included in header file.
Set CN = GetDataConnection

If Request.TotalBytes > 0 Then
    vIndex = Request.Form("txtIndex")

    If Request.Form("cboOffsetGroupOperator") = "" Then
        Response.Write("Unable to process your request. Please complete a new entry.")
        Response.Redirect("input.asp")  
    Else                
        'Loop through values in txtIndex.  Insert data into table.
        Do While vIndex > 0 
            vSQL = "spInsert "
            vSQL = vSQL & "@vExceptionID = " & RS("ExceptionID") & ","
            vSQL = vSQL & "@vOffsetDetailCorrectionOperator = '" & Request.Form("cboOffsetGroupOperator" & vIndex) & "',"
            vSQL = vSQL & "@vOffsetDetailNumberOfItems  = '" & Request.Form("txtNumberOfItems" & vIndex) & "',"
            vSQL = vSQL & "@vOffsetDetailComments  = '" & Request.Form("txtComments" & vIndex) & "'"

            CN.Execute (vSQL)       
            vIndex = vIndex-1       
        Loop    
    End If
Else%>

<body>
<form name="frmInput" id="Input" method="post">
<table class="WebApps" id="tblOffsetDetail">
<tbody>
    <tr>
        <td colspan="3">
            <h3>Offset Item Detail</h3> 
            <p><input name="btnSubmit" type="submit" class="button" id="btnSubmit" value="Submit"></p>
        </td>
    </tr>
    <tr>
        <td colspan="3">    
        <input type="button" class="button" value= "Add New Item" id="btnNewItem" name="btnNewItem" onClick="javascript:addNewItem();">
        <input type="hidden" id="txtIndex" name="txtIndex" value="1">
        </td>
    </tr>
    <tr>
        <td width="9%"><h4>Operator:</h4></td>
        <td width="6%"><h4># of Items:</h4></td>
        <td width="13%"><h4>Comments:</h4></td>
    </tr>
    <tr>
        <td>
            <p><select name="cboOffsetGroupOperator1" id="cboOffsetGroupOperator1">
                <option></option>
                <option value="1">Name1</option>
                <option value="2">Name2</option>
                <option value="3">Name3</option>
                <option value="4">Name4</option>
            </select></p>
        </td>
        <td><p><input name="txtNumberofItems1" type="text" id="txtNumberofItems1" size="10" maxlength="10"></p></td>
        <td><p><textarea name="txtComments1" cols="20" rows="3" id="txtComments1"></textarea></p></td>
    </tr>
</tbody>
</table>
</form>

<% 
End If

Set RS = Nothing
CN.Close
Set CN = Nothing
%>

<script language="javascript">

//Display additional rows, columns, and fields when Add New Item button is clicked.
function addNewItem()
{
    var iX = document.getElementById("txtIndex").value;
    iX ++;
    document.getElementById("txtIndex").value = iX;

    var tbl = document.getElementById("tblOffsetDetail").getElementsByTagName("TBODY")[0];
    var tr = document.createElement("TR");
    tbl.appendChild(tr);

    //cboOffsetGroupOperator1
    var tdOffsetGroupOperator = document.createElement("TD");
    tr.appendChild(tdOffsetGroupOperator);

    var p = document.createElement("P");
    tdOffsetGroupOperator.appendChild(p);

    var cboOffsetGroupOperator = document.createElement("select"); 
    p.appendChild(cboOffsetGroupOperator);

    cboOffsetGroupOperator.id = "cboOffsetGroupOperator" + iX;

    var cboOffsetGroupOperator1 = document.getElementById("cboOffsetGroupOperator1");
    var i = 0;

    for (i = 0; i < cboOffsetGroupOperator1.children.length; i++)
        {
            var opt = document.createElement("option");
            opt.value = cboOffsetGroupOperator1 [i].value;
            opt.innerText = cboOffsetGroupOperator1 [i].innerText;
            cboOffsetGroupOperator.appendChild(opt);
        }   

    //txtNumberofItems1
    var tdNumberofItems = document.createElement("TD");
    tr.appendChild(tdNumberofItems);

    var p = document.createElement("P");
    tdNumberofItems.appendChild(p);

    var txtNumberofItems = document.createElement("input"); 
    p.appendChild(txtNumberofItems);

    txtNumberofItems.id = "txtNumberofItems" + iX;
    txtNumberofItems.setAttribute('size',10);

    var txtNumberofItems1 = document.getElementById("txtNumberofItems1");

    //txtComments1
    var tdComments = document.createElement("TD");
    tr.appendChild(tdComments);

    var p = document.createElement("P");
    tdComments.appendChild(p);

    var txtComments = document.createElement("textarea"); 
    p.appendChild(txtComments);

    txtComments.id = "txtComments" + iX;
    txtComments.setAttribute('cols',20);
    txtComments.setAttribute('rows',3);

    var txtComments1 = document.getElementById("txtComments1"); 
}
</script>

</body>
</html>

Ответы [ 2 ]

1 голос
/ 21 января 2010

Этот код JavaScript подходит для изучения работы базовых веб-приложений на основе DOM и баз данных, но если вы хотите, чтобы люди использовали это приложение, вы должны очистить весь этот код JavaScript, поскольку он не будет работать во всех браузерах. Сделайте себе одолжение и возьмите простую, но мощную библиотеку, такую ​​как jQuery .

Также посмотрите на MVC framework и отделите ваш код БД от представления и проверьте ваш ввод на обоих концах.

То же самое по вопросу внедрения SQL.

Удачи.

0 голосов
/ 21 января 2010

Элементы формы, которые вы добавляете в DOM, не имеют имен. Вам необходимо присвоить им имена, прежде чем эти имена можно будет использовать при отправке формы.

var cboOffsetGroupOperator = document.createElement("select"); 
cboOffsetGroupOperator.setAttribute('name', 'cboOffsetGroupOperator1'); // this is what you're missing
p.appendChild(cboOffsetGroupOperator);

И, пожалуйста, как сказал SQLMenace, исправьте проблему внедрения SQL-кода, которая у вас есть ... чтобы начать, поместите следующий текст в поле подробных комментариев и отправьте его.

abc '; создать таблицу bork (a varchar (30)); вставьте значения bork ('все ваша база принадлежит нам "); -

Однако я призываю вас обратить внимание на ответ, в котором говорится, что ваш javascript не будет работать в разных браузерах. Похоже, вам нужно немного покопаться в вещах, чтобы ваш код был действительно правильным.

...