Заполнение нескольких полей со списком PHP из базы данных MySQL - PullRequest
0 голосов
/ 22 ноября 2011

У меня максимум 100 вариантов (теперь 79) для поля со списком, и у меня их 79.Каждый обозначает вопрос и записывается в таблицу «вопросов» в MySQL.Опции записываются в таблицу с именем «question_codes» и обозначают имена полей, связанных с некоторыми вопросами.Я пробовал 2 цикла for внутри друг друга, но я думаю, что это приведет к перегрузке сервера из-за 79 * 79 итераций.У меня также есть текстовое поле, в зависимости от выделения с помощью Ajax, работает должным образом.Поле номер 0 в таблице «question_codes» - это 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>');

1 Ответ

1 голос
/ 22 ноября 2011

Вероятно, есть более элегантный способ структурировать базу данных и 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 цикл, проверьте наличие изменений в вопросе.

...