【问题标题】:Populating Multiple Combo Boxes with PHP from MySQL database使用 MySQL 数据库中的 PHP 填充多个组合框
【发布时间】:2011-11-22 15:12:06
【问题描述】:

组合框最多有 100 个选项(现在是 79 个),其中有 79 个。每个代表一个问题,并记录到 MySQL 中的“问题”表中。这些选项记录在一个名为“question_codes”的表中,它们代表与某些问题相关的字段名称。我尝试了 2 个 for 循环,但我认为由于 79*79 次迭代,这会使服务器过载。我还有一个文本字段,具体取决于使用 ajax 的选择,可以正常工作。表“question_codes”中的数字 0 字段是 id,我不使用它。这是我的代码。

$code_query="SELECT * FROM questions WHERE id='1'";
$question_query="SELECT * FROM questions WHERE id='2'";

$result_question_query=mysql_query($question_query,$conn);
$result_code_query=mysql_query($code_query,$conn);

$selected_query=mysql_query("SELECT * FROM question_codes");

while($row_selected=mysql_fetch_row($selected_query))
{
    $column_count=count($row_selected);
}

while($row=mysql_fetch_array($result_question_query) && $row2=mysql_fetch_array($result_code_query))

for($i=1;$i<$column_count;$i++)
    {
        $db_q="q$i";
        $fill=$row[$db_q];
        $fill_code=$row2[$db_q];
    print('<tr style="background:navy;color:white"><td width="60px">Question '.$i.'</td>
    <td>
        <select name="'.$db_q.'_code" id="'.$db_q.'_code" onchange="showQuestion(this)">

        <option value="">Select a question</option>

for ($j=1;$j<$column_count;$j++)
{
                $name=mysql_field_name($selected_query,$j);

if ($fill_code==$name)
        {
            $selected="selected";
        }
        else
        {
            $selected="";
        }

        print('<option value="'.$name.'" '.$selected.'>'.$name.'</option>');
}

 print('</select>

       </td>

    <td><input type="text" value="'.$fill.'" name="'.$db_q.'" id="'.$db_q.'"></td></tr>');

【问题讨论】:

    标签: php mysql loops populate


    【解决方案1】:

    可能有一种更优雅的方式来构建数据库和 PHP。

    对于 SQL 来说可能是这样的:

    CREATE TABLE `questions` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `question` varchar(255) NOT NULL,
      `answer` int(11) unsigned NOT NULL DEFAULT '0'
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
    
    
    CREATE TABLE `question_options` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `question_id` int(11) unsigned NOT NULL DEFAULT '0',
      `option` varchar(64) NOT NULL
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
    

    ...这适用于 PHP ...

    $q_sql = mysql_query("SELECT * FROM `questions`");
    while ($q = mysql_fetch_row($q_sql)) {
        echo '
            <tr><td>Question '. $q['id'] .'</td>
                <td><select name="q'. $q['id'] .'">';
        $qo_sql = mysql_query("SELECT * FROM `question_options` WHERE `question_id` = '". $q['id'] ."'");
        while ($qo = mysql_fetch_row($qo_sql)) {
            $selected = ($q['answer'] == $qo['id']) ? ' selected' : '';
            echo '
                        <option value="'. $qo['id'] .'"'. $selected .'>'. $qo['option'] .'</option>';
        }
        echo '
                    </select>
                </td></tr>';
    }
    

    为了进一步加强这一点(此方法可能会生成太多查询)...改为进行单个查询,例如:

    SELECT q.`question`, qo.*
    FROM `question_options` as `qo`
    LEFT JOIN `questions` as q
        ON (q.`id` = qo.`question_id`)
    ORDER BY qo.`question_id`
    

    ...然后使用单个 while 循环,检查问题的变化。

    【讨论】:

    • 你说的对,我先把数据库里的表改一下,照你说的做。
    • 很遗憾,你建议我的结构是正确的,但它对我不起作用,它只会让事情变得更难,所以我仍然无法解决这个问题
    • 你的原帖很难解密!贴出你当前的sql表结构,我们来看看。
    猜你喜欢
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 2017-01-25
    • 2012-09-11
    相关资源
    最近更新 更多