当输入字段的数量和名称会有所不同时,如何确保MySQL插入的列匹配?

时间:2010-02-22 01:06:51

标签: php mysql arrays

处理预先存在的程序,该程序解析具有动态创建的字段数的html表单,并且为了向前兼容,可能甚至不知道mysql列的数量......

我想这需要创建两个数组,并进行某种比较/重新排序,但不能完全绕过它......

这会是这样的:

A)数据库阵列 - 1)获取MySQL列的# 2)循环遍历此数字并获取MySQL列名称

B)表格阵列 - 1)获取表单字段数 2)获取表单字段名称/值

C)匹配阵列 - 将name.form_field [f]与name.mysql_column [c]

匹配

D)执行插入 - 将name.form_field [f]的值插入name.mysql_column [c] (INSERT INTO name.mysql_column [c],name.mysql_column [c + 2],name.mysql_column [c + 5],name.mysql_column [c + n] VALUES value(name.form_field [f]),value(name .form_field [f + 9]),值(name.form_field [f + 3]),值(name.form_field [f + x]))

我猜测答案就像上面那样,但是不能完全描绘实现结果所需的嵌套循环......

有什么可能的解决方案让人想到吗?

所有回复都非常赞赏!

谢谢,

Sean McKernan

McK66 Productions

2 个答案:

答案 0 :(得分:3)

这需要更长的答案,但我会试着中途介绍。

我建议从另一个方向解决问题。理想情况下,代码将拥有自己要插入的字段列表,然后查看提交的数据以构造相关的行。这也让它具有“缺失”列的默认值,因此它总是可以生成具有正确数量的字段的行数据。

有一个令人沮丧的大量PHP,它使用提交的字段名来构建SQL,而不是从已知的字段名列表开始。根据我的经验,程序员这样做是因为他们控制生成的表单,但忘记他们并不真正控制提交的表单。所需要的只是在FireBug中进行一些编辑,你可以将页面敲六,这可能会破坏你的数据库。

答案 1 :(得分:0)

我不确定这是否完全适合您的情况,但我们使用类似于以下的内容来处理数据查询,我们不确定我们是否可以完全控制。表单输入名称与列名称匹配,因此如果您没有,则需要提供正确的映射。

这将从表中检索列数据,然后仅使用与表中存在的列匹配的元素从表单数据构建查询。

DB()是我们围绕MDB2的包装器。

$db = new DB();
$sql = 'DESCRIBE `table`';
$result = $db->query($sql);
$row = array();
$query = array();

while ($row = $result->fetchRow())
{
    if (array_key_exists($row['field'], $form_data))
        if (is_null($form_data[$row['field']]))
            $query[$row['field']] = 'NULL';
        else
            $query[$row['field']] = $db->quote($form_data[$row['field']]);
}

$keys = array_keys($query);

foreach ($keys as &$key)
    $key = $db->quoteIdentifier($key);

unset($key);

$vals = array_values($query);

$sql = 'INSERT INTO `table` '
     . '(' . implode(', ', $keys) . ') '
     . 'VALUES(' . implode(', ', $vals) . ')';