为动态数据库创建更新查询

时间:2012-12-05 22:35:35

标签: php mysql forms post

我正在尝试更新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)用于标识需要更改的行。

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

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

感谢。

3 个答案:

答案 0 :(得分: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发出的'field'数组,并将正确的更新文本放入另一个数组中。 然后做一个

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

将其放入数据库。

答案 1 :(得分:0)

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

希望这会有所帮助。

答案 2 :(得分: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" />',
);

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

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

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

......那就是 ORM框架。