如何编辑和插入动态创建的表单文本框值到MySQL数据库


How to edit and insert dynamicaly created form textboxes values to MySQL DB?

我在我的PHP项目中有一堆MySQL DB功能表。我通过php获取并创建一个表格,文本框由列名和id记录在照片表中使用代码命名:

functions.php代码:

function m_html_editPhotos($id) {
$result = "<table class='"tabelka'" id='"tbl_photos'"><thead><tr><th>Miniaturka</th><th>Duże zdjęcie</th></tr></thead><tbody>";
$mysqli = m_db_Init();
$qry = "SELECT ID, Img_Min, Img_Nrm FROM tbl_Zdjecie WHERE ID_Grzyb = ?";
if($stmt = $mysqli -> prepare($qry)) {
          $stmt -> bind_param("i", $id);
          mysqli_stmt_bind_result($stmt, $img_id, $img_min, $img_nrm);
          $stmt->execute();
          $i =0;
          while (mysqli_stmt_fetch($stmt)) {
              $i = $i+1;
              $result .= "<tr><td><!--<label>Link do miniaturki:<label>--><input type='"text'" class='"required'" name='"photo[$i][min]'" value=$img_min></td><td><!--<label>Link do zdjęcia pełnego rozmiaru:</label>--><input type='"text'" class='"required'" name='"photo[$i][nrm]'" value=$img_nrm></td><td style='"display:none;'"><input type='"text'" name='"photo[$i][id]'" value=$img_id /></td></tr>";
          }
          $stmt -> close();      
}
mysqli_close($mysqli);
$result .= "</tbody></table><div class='"link'" onclick='"AddPhotoEditRow();'">Dodaj kolejne zdjęcie</div>";
return $result;
}

现在我想编辑的是照片表迭代通过每一行生成的上面的表thumbnail_url (img_min)和全尺寸链接(img_nrm)的文本框此外,我想添加新的表从动态创建的行AddPhotoEditRow()函数;

functions.js Code:

function AddPhotoEditRow(){
 $('#tbl_photos > tbody:last').append('<tr><td><input type="text" name="photo[0][min]"></td><td><input type="text" name="photo[0][nrm]"></td><td style='"display:none;'"><input type='"text'" name='"photo[0][id]'" value='"0'" /></td></tr>');
}

edit.php代码:

include 'functions.php';
if(isset($_POST["change"])) m_db_updateAllFeatures($_GET["id"]);
if (m_db_isAdmin("")){
if (!isset($_GET["id"]) || !is_numeric($_GET["id"]))
    header("Location: ../index.php");
else {
if (isset($_POST["Nazwa_PL"]))
    m_db_UpdateName("PL", $_GET["id"],$_POST["Nazwa_PL"]);
if (isset($_POST["Nazwa_Lac"]))
    m_db_UpdateName("Lac", $_GET["id"],$_POST["Nazwa_Lac"]);
render_edit_body();
    }
}

我想以某种方式通过照片链接迭代,并通过解析$_POST传递的文本框名称来更新现有记录,另外插入新的照片链接(id=0)也会很好。我将新行id设为0因为我需要区分是插入表还是更新表?我假设应该添加所有0索引字段,其余字段应该插入。我可能有我的概念是错误的,如果有一个更好的方法来做完整的功能表"控制",那么我非常开放的建议。

你已经有了基本的,除了

$('#tbl_photo snip snip name="photo[0][min]"> snip snip snip
                                    ^---

0不应该硬编码。你告诉php在$_POST数组中创建一个'photo'值数组,但随后你强制索引键为所有条目为0,导致后面的条目覆盖前面的条目。

在Javascript中记录你插入了多少个这样的字段,并使用该计数来增加索引键,例如

$('#tbl_photo snip snip name="photo[' + i + '][min]"> snip snip snip
而不是

,其中i是字段计数。然后只需输入:

foreach($_POST['photo'] as $i => $photo) {
    echo $photo['min'];
}

如果对所有新创建的HTML元素使用0, PHP $_POST将只包含最后一个项的信息。

这是我的解决方案,使用与您相同的方法,稍加修改,假设我们有一个form包装外出循环和一个名为$data的数组包含播种信息:

创建表的PHP代码

// the $data array contains a list of picture object, these object will be updated later.
foreach($data as $num => $row)
{
    echo "<tr>'n";
    echo sprintf("<td><input type='text' name='name[%d]' value='%s' /></td>'n", $num, $row['name']);
    echo "</tr>'n";
}
echo "<tr><td>'n";
echo "<a id='add-item'>Add new item</a>'n";
echo "<input type="hidden" name='num-created' value='0' />";
echo "</td></tr>'n"

添加新元素的JavaScript代码(使用jQuery)

$(document).ready(function(){
    $('#add-item').click(function(){
        var currentCreatedNum = $("input[name=num-created]").val() * 1;
        var html = "<tr>";
        html += "<td><input type='text' name='newname["+ (currentCreatedNum + 1) +"]' value='' /></td>";
        html += "</tr>";            
        $("input[name=num-created]").val(currentCreatedNum + 1);
    });
});
操作POST请求的PHP代码
# check contrains ...
# update old records
foreach($_POST['name'] as $id => $name)
{
    // get information of existing item and update this record
}
# create new record
foreach($_POST['newname'] as $order => $name)
{
    // get information of new item and create a new record
}

可以看到,手工创建的元素的name属性必须与现有的不同。

如果我的理解,你想要访问每个动态创建的表项?您可以通过简单地创建一个动态数组来实现这一点。在生成每个新的TD元素(或任何元素)时,将其命名为name=Something[](使用空括号)。这将自动将生成的每个项目分配为名为"Something"的数组成员。当然,您也可以通过计数器生成键值。

这是我做过的一个项目的简化示例,其中一个"更新"按钮(此处未显示)发送回同一页面:

echo "<td class='grid'>
<input type='checkbox' name='chkDel[]' />
</td>";

则PHP如下:

if (isset($_POST['chkDel'])) {
    // Make a MySQL Connection
    $con = mysql_connect(host,user,pwd) or die(mysql_error());
    mysql_select_db("db_name"); 
    $rows = 0;
    foreach($_POST['chkDel'] as $chkdel)  {
        //query to delete post
        $delQuery = "DELETE FROM table WHERE ".$chkdel;
        //run the query 
        mysql_query($delQuery) or die(mysql_error());
        //Get rows affected
        $i = mysql_affected_rows();
        $rows = $rows + $i;
    }
    mysql_close($con);
}

这是你想要的吗?