形成生成器的表格

问题描述 投票:0回答:4

我有一个表单需要保存在数据库中,用 PHP 完成非常简单并存储在 MySQL 表中。但维护非常繁琐,所以我想知道是否有(或者我应该编写自己的)解决方案来在 MySQL 表中写入表单的问题和可能的值,并编写 PHP 脚本从表生成表单。 我应该寻找什么:框架?标准脚本/类?...或者我应该自己做?

我将问题存储在单独的表中,我的问题是:如何从问题表生成表单?

php mysql forms generator
4个回答
2
投票

短期:编写自己的代码......假设您有时间根据元数据(即表单布局、问题文本和答案选择)制作“表单生成器”,然后单独保存用户输入的数据在数据表中。

长期:寻找一个框架...我还没有找到一个好的开源框架/可以正确抽象这个概念并允许适当的定制/配置深度。

这里要稍微介绍一下:这是大多数企业 Web 应用程序的工作方式;每个都使用不同的方式来执行此操作(即 SugarCRM 对数据库中的一些元数据进行编码,而其他部分则在平面文件中的 .php 数组中进行编码)...有些使用 Smarty 等模板引擎,而另一些则需要您的表单元数据更少抽象(即,更少可重用,更直观)。


1
投票

尝试这个解决方案。它存储问题短语、问题类型(问题的输入元素是否是文本、复选框、单选按钮等)和可能的答案(用 ;| 字符组合分隔每个答案。 存储问题的表;

+-----+----------------------+----------+------------------------+
| qid | que_phrase           | type     | possible_answers       |
+-----+----------------------+----------+------------------------+
|   1 | What is my birthday? | checkbox | 1986-01-05;|1984-01-05 |

CREATE TABLE `questions` (
  `qid` int(11) NOT NULL auto_increment,
  `que_phrase` mediumtext collate latin1_general_ci NOT NULL,
  `type` varchar(20) collate latin1_general_ci NOT NULL,
  `possible_answers` mediumtext collate latin1_general_ci NOT NULL,
  PRIMARY KEY  (`qid`)
)

代码将如下所示。

<?php
$con = mysql_connect("localhost","root","root");

if (!$con)
{
    die('Could not connect: ' . mysql_error());
}

$db_selected = mysql_select_db("test", $con);

if (!$db_selected)
{
    die ("Can\'t use test : " . mysql_error());
}
print_r($_POST);
$sql = "SELECT * FROM questions";
$result = mysql_query($sql);
echo "<form id='qform' name='qform' method='post'>";
echo "<table>";
while($row = mysql_fetch_array($result))
{
    $q_id       = $row['qid'];
    $q_phrase = $row['que_phrase'];
    $q_type = $row['type'];
    $q_pos_answers = $row['possible_answers'];
    echo "<tr>";
    echo "<td>{$q_id}.</td>";
    echo "<td>{$q_phrase}</td>";
    if ('text' == $q_type){
        echo "<td><input type='text' name='{$q_id}' id='{$q_id}' value='{$q_pos_answers}'/></td>";
    }
    else if ('checkbox' == $q_type){
        $answers = preg_split('/;\|/', $q_pos_answers);
        echo "<td>";
        foreach ($answers as $num => $ans) {
            echo "<input type='checkbox' name='{$q_id}[]' id='{$q_id}[]' value='{$ans}'/>";
            echo "{$ans}<br/>";
        }
        echo "</td>";
    }
    // Code for other types
    echo "</tr>";
}
echo "<tr><td colspan=3 align='center'><input type='submit' value='Submit' id='btnsub' name='btnsub'/></td></tr>";
echo "</form>";
echo "</table>";
mysql_close($con);
?>

0
投票

听起来您正在将整个

保存在 MySQL 表中! 这不是一个好主意。

您应该创建一些 MySQL 表并动态生成表单

类似:


问题
+------------+--------------+
|问题ID |问题文本 |


问题的答案
+----------+----------------+------------+
|答案 ID |问题ID_fk |答案文本 |

因此,问题存储在一个表中,答案存储在另一个表中,并通过 QuestionId_fk 字段将其反向/链接回相应的问题。

示例数据:


问题
+------------+--------------+
|问题ID |问题文本 |
|     1 |您想要多少块泡泡糖? |
|     2 |你最喜欢的水果是什么? |

问题的答案
+----------+----------------+------------+
|答案 ID |问题ID_fk |答案文本 |
|    1 |       1 |   1 件 |
|    2 |       1 |   2 件 |
|    3 |       1 |   3 件 |
|    4 |       2 |   苹果|
|    5 |       2 |   橙子|
|    5 |       2 |   香蕉|

假设有以下 MySQL 表:

表名“问题”,包含 q_id、q_text 列

<?php

// I'm assuming you've connected to the database server, and the correct database

$query = "SELECT q_id AS num, q_text AS question FROM questions";
$results = mysql_query($query);

$row = mysql_fetch_array($results);

?>

<form enctype="form/multipart" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<fieldset>

<?php

while($row = mysql_fetch_array($results)) {

echo "<label for=\"q" . $row['num'] . "\">" . $row['question'] . "</label>";
echo "<input type=\"text\" name=\"q" $row['num'] . "\" />

}

?>
</fieldset>
</form>

这应该 - 假设我没有搞砸得很严重 - 生成类似的东西:

<label for="q1">What is your name?</label><input type="text" name="q1" />
<label for="q2">What is your favourite colour?</label><input type="text" name="q2" />

也可能值得放入 id 属性,但首先看看基础知识是否有效。

作为附录,这只会实现直的

<label>
/
<input>
对;如果您需要使用单选按钮或复选框,那么您将需要某种方法来区分所需的表单元素类型。这几乎肯定会涉及第二个表(对于不同类型的“radio”、“check”、“text”、“file”等)和一个查找表,用于将问题文本链接到该问题的表单元素类型。

此外,值得注意的是,使用

mysqli
pdo
可能会提供更好的结果或易于实施。作为一名业余爱好者,我还没有时间与他们一起可靠地找出答案。太让我羞愧了。


0
投票

假设有以下 MySQL 表:

表名“问题”,包含 q_id、q_text 列

<?php

// I'm assuming you've connected to the database server, and the correct database

$query = "SELECT q_id AS num, q_text AS question FROM questions";
$results = mysql_query($query);

$row = mysql_fetch_array($results);

?>

<form enctype="form/multipart" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<fieldset>

<?php

while($row = mysql_fetch_array($results)) {

echo "<label for=\"q" . $row['num'] . "\">" . $row['question'] . "</label>";
echo "<input type=\"text\" name=\"q" $row['num'] . "\" />

}

?>
</fieldset>
</form>

这应该 - 假设我没有搞砸得很严重 - 生成类似的东西:

<label for="q1">What is your name?</label><input type="text" name="q1" />
<label for="q2">What is your favourite colour?</label><input type="text" name="q2" />

也可能值得放入 id 属性,但首先看看基础知识是否有效。

作为附录,这只会实现直的

<label>
/
<input>
对;如果您需要使用单选按钮或复选框,那么您将需要某种方法来区分所需的表单元素类型。这几乎肯定会涉及第二个表(对于不同类型的“radio”、“check”、“text”、“file”等)和一个查找表,用于将问题文本链接到该问题的表单元素类型。

此外,值得注意的是,使用

mysqli
pdo
可能会提供更好的结果或易于实施。作为一名业余爱好者,我还没有时间与他们一起可靠地找出答案。太让我羞愧了。

© www.soinside.com 2019 - 2024. All rights reserved.