我正在尝试更新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)用于标识需要更改的行。
我的问题是,如何从发布的表单中获取该行的新内容并创建查询以进行更新?我似乎无法弄清楚如何动态获取表单的名称以及写入查询的新内容。
如果需要澄清,请告诉我并感谢所有帮助。
感谢。
答案 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框架。