2011-11-22 123 views
0

对于组合框,我最多有100个选择(现在是79),并且有79个选项。每个人都代表一个问题,并记录在MySQL的“问题”表中。这些选项记录在一个名为“question_codes”的表中,它们代表与某些问题相关的字段名称。我在对方内部尝试了2次循环,但是我认为这会因79 * 79迭代而使服务器过载。我也有一个文本字段,取决于与Ajax的选择,正常工作。表“question_codes”中的Number 0字段是id,我不使用它。这是我的代码。用MySQL数据库中的PHP填充多个组合框

$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>'); 

回答

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循环,检查问题的变化。

+0

你是绝对正确的,我将首先更改数据库中的表格,并按照你的说法进行操作。 – huroran

+0

不幸的是你建议我的结构是正确的,但它不适合我,它只是让事情变得更加困难,所以我仍然无法解决这个问题 – huroran

+0

你原来的帖子很难解密!发布你当前的sql表结构,我们来看看。 – neokio