0

我正在尝试更新 mysql 数据库中的一行。为此,我将使用这样的简单查询:

    "UPDATE  `contactinfo` SET  `Company` =  'Google', WHERE `id` =  '1';"

问题是数据库是动态的,用户可以随时添加列。所以我不知道列的名称。要查找名称并创建一个表单以发布到实际执行 mysql 工作的页面,请使用以下代码:

    <?php
            $result = mysql_query("select * from contactinfo WHERE `id` = '".$rid."';");

            if (!$result) {
                die('Query failed: ' . mysql_error());
            }
            $i = 0;
            while ($i < mysql_num_fields($result)) {
                $meta = mysql_fetch_field($result, $i);
                if (!$meta) {
                    echo "ERROR";
                }
                $name = $meta->name;

                $r = mysql_fetch_array(mysql_query("select * from contactinfo WHERE `id` = '".$rid."';"));
                $content = $r[$name];

                if($name != 'id') {
                    echo "<tr><td align='center'><div align='left'>Edit ".$name."</div></td></tr>";
                    echo "<tr><td align='center'><input type='text' value='" . $content . "' /></td></tr>";
                }
                $i++;
            }
            mysql_free_result($result);
        ?>

这将创建一个带有输入框的漂亮小表格,允许用户编辑已选择行的内容。行 id 编号 ($rid) 用于标识需要更改的行。

我的问题是,如何从发布的表单中获取该行的新内容并创建查询来更新它?我似乎无法弄清楚如何动态获取表单的名称以及编写查询的新内容。

如果需要任何澄清,请告诉我,感谢所有帮助。

谢谢。

4

3 回答 3

2

最简单的方法是将表单中的字段准确命名为数据库中字段的名称。假设你有这个表格

<form action="">
   <input name="field[firstname]">
   <input name="field[lastname]">
   <input name="field[address]">
</form>

您应该也可以根据字段名称创建表单,您可能已经在这样做了。在处理响应的文件中,您可以执行以下操作:

foreach($_POST['field'] as $field_name => $field_value) {
   $sql_str[] = "{$field_name} = '{$field_value}'";
}

这只是通过来自 post 的“字段”数组并将正确的更新文本放入另一个数组中。然后做一个

mysql_query("UPDATE contactinfo SET ".implode(',', $sql_str)." WHERE `id` = '".$rid."';")

将其放入数据库中。

于 2012-12-05T23:02:42.393 回答
0

您最好调查一下是否有可以使用的 ORM 框架。

无论如何,做你想做的最简单的方法是在字段中传递字段的名称INPUT

$content = AddSlashes($content); // You may need HTMLEntities() here

$field = <<<FIELD
    <input type="text" value="$content" />
FIELD;

此外,另一个有用的技巧是提供一个“受保护”字段的数组,或者指定一个前缀,使该字段不可更改。例如,您几乎肯定不希望用户能够更改主键。

所以你可以用

if ('id' == $meta->name or 'pk' == $meta->name or (0 === strpos($meta->name, 'pk_')))
{
    // This is a primary key field
    $html .= <<<PKFIELD
    <input type="hidden" name="{$meta->name}" value="{$contents}" />
PKFIELD;
    continue;
}
if (0 === strpos($meta->name, 'hf_'))
{
    // hidden field, ignored (can't be changed)
    continue;
}
if (0 === strpos($meta->name, 'ro_'))
{
    // read-only field, shown but without even the name
    $html .= <<<ROFIELD
    <input type="text" readonly="readonly" class="readonly" value="{$contents}" />
ROFIELD;
    continue;
}

或者您可以使用固定大小的前缀和模板数组:

$fieldtpls = array(
    'pk_' => '<input type="hidden" name="{NAME}" value="{VALUE}" />',
    'ta_' => '<textarea name="{NAME}">{VALUE}</textarea>',
    'ro_' => '<input type="text" value="{VALUE}" readonly="readonly" />',
);

然后您分析每个字段并应用默认值,除非使用已知前缀。

然后,您的用户必须相应地命名这些字段。另一种可能性是允许“元表”保存每个表和字段的类型和处理,但在这种情况下,您需要通过为元创建一种“管理编辑器”来使用户界面复杂一点桌子:

table  field  type   rw   parameters
users  name   text   yes  
users  id     hidden no
users  role   text   no
users  notes  area   yes  class:"widearea"

...那就是ORM 框架。

于 2012-12-05T23:16:57.280 回答
0

您可以做的是在数据库中添加一个带有位标志的列,如果用户是新用户或旧用户,该标志将反映它。这样您就可以更新用户以说明它是新的还是旧的。

希望这可以帮助。

于 2012-12-05T22:44:05.353 回答