我很确定有一个解决方案,但我不确定如何正确地说出来。 我有一个需要保存在数据库中的表单,在php中非常简单并存储在mysql表中。但维护是相当繁琐的,所以我想知道是否有(或者我应该自己编写)一个解决方案,在mysql表中编写表单的问题和可能的值,并编写一个php脚本来从表中生成表单。 我应该寻找什么:一个框架?一个标准的脚本/类?....或者我应该自己做?
非常感谢
编辑添加澄清以回应bobobobo的回答
我将问题存储在一个单独的表中,我的问题是:如何从问题表中生成表单?
答案 0 :(得分:2)
短期:自己编码....假设您有时间根据元数据制作“表单生成器”(即表单布局,问题文本和答案选项),然后将用户输入的数据分别保存在数据表中。
长期:寻找框架......我还没有找到一个好的开源框架/正确抽象这个概念并允许适当的自定义/配置深度。
这里有点meta:这就是大多数企业Web应用程序的工作方式;每个人使用不同的方式(即,SugarCRM编码数据库中的一些元数据,以及平面文件中的.php数组中的其他部分)...一些使用模板引擎,如Smarty,而其他人需要您的表单元数据不那么抽象(即,可重用性更低,更直观)。
答案 1 :(得分:0)
听起来你正在保存整个< form>在MySQL表中!这不是一个好主意。
您应该创建一些MySQL表并动态生成表单
类似的东西:
questions +------------+--------------+ | questionId | questionText | answers_for_questions +----------+---------------+------------+ | answerId | questionId_fk | answerText |
所以问题存储在一个表格中,答案存储在另一个表格中,并通过questionId_fk字段回传/链接回适当的问题。
示例数据:
questions +------------+--------------+ | questionId | questionText | | 1 | How many pieces of bubble gum do you wish? | | 2 | What is your favorite fruit? | answers_for_questions +----------+---------------+------------+ | answerId | questionId_fk | answerText | | 1 | 1 | 1 piece | | 2 | 1 | 2 pieces | | 3 | 1 | 3 pieces | | 4 | 2 | apples | | 5 | 2 | oranges | | 5 | 2 | bananas |
答案 2 :(得分: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>
对;如果您需要使用单选按钮或复选框,那么您需要一些区分所需表单元素类型的方法。几乎肯定会涉及第二个表(针对不同类型的“无线电”,“检查”,“文本”,“文件”等),以及用于将问题文本链接到该问题的表单元素类型的查找表。
此外,值得注意的是,使用mysqli
或pdo
可能会提供更好的结果或易于实施。作为业余爱好者,我还没有时间和他们一起工作,以便可靠地找到答案。很遗憾。
答案 3 :(得分:0)
试试这个解决方案。它存储问题短语,问题类型(问题的输入元素是文本,复选框,单选按钮等),以及可能的答案(将每个答案分开; |字符组合。 存储问题的表格;
+-----+----------------------+----------+------------------------+
| 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);
?>