отображать данные из базы данных в определенном порядке: php или mysql?

У меня есть таблица для телефонных номеров:

phone: phoneID (PK) peopleID (fK) countrycode areacode phonenumber extension phonetype //EDIT!!! (sorry forgot this in first post) 

У каждого человека может быть максимум 4 телефонных номера: компания, факс, домашний, мобильный.

У меня есть форма редактирования. Форма редактирования извлекает данные из БД и заполняет форму. Этот код для вывода данных:

 $stmt = $conn->prepare("SELECT * FROM phone WHERE peopleID=?"); if ( !$stmt ) { die(printf("Error: %s.\n", mysqli_stmt_error($stmt) ) ); } else if ( !$stmt->bind_param('i', $peopleID) ) { die(printf("Error: %s.\n", mysqli_stmt_error($stmt) ) ); } else if ( !$stmt->execute() ) { die(printf("Error: %s.\n", mysqli_stmt_error($stmt) ) ); } else { $resultaddress = $stmt->get_result(); while($row = $resultaddress->fetch_assoc()) { $phoneID_array[] = $row['phoneID']; $phonetype_array[] = (isset ($row['phonetype']) ? $row['phonetype'] : ""); $countrycode_array[] = (isset ($row['countrycode']) ? $row['countrycode'] : ""); $areacode_array[] = (isset ($row['areacode']) ? $row['areacode'] : ""); $phonenumber_array[] = (isset ($row['phonenumber']) ? $row['phonenumber'] : ""); $extension_array[] = (isset ($row['extension']) ? $row['extension'] : ""); } } 

и это заполнить форму:

 for ($i = 0; $i < 4; $i++) { echo 'Phone<input type="text" name="type[]" id="" value="' . (isset ($phonetype_array[$i]) ? $phonetype_array[$i] : "company") . '"/>'; echo '<input type="text" name="countrycode[]" id="" size="3" maxlength="3" value="' . (isset ($countrycode_array[$i]) ? $countrycode_array[$i] : "") . '"/>'; echo '<input type="text" name="countrycode[]" id="" value="' . (isset ($areacode_array[$i]) ? $areacode_array[$i] : "") . '"/>'; echo '<input type="text" name="number[]" id="" value="' . (isset ($phonenumber_array[$i]) ? $phonenumber_array[$i] : "") . '"/>'; echo '<input type="text" name="extension[]" id="" value="' . (isset ($extension_array[$i]) ? $extension_array[$i] : "") . '"/><br>'; } 

Теперь форма отображает:

компания 000 000 1234567

начало 000 000 1234569

(нет пустых полей для ввода новых номеров)

ПРОБЛЕМА:

Я хотел бы отображать номера телефонов всегда в одном порядке: допустим, у меня есть только номера компании и дома в БД, форма редактирования должна выглядеть так:

компания: 000 000 1234567

факс: пустые поля для заполнения

главная: 000 000 1234569

mobile: пустые поля для заполнения

Вероятно, это можно было бы сделать с ассоциативными массивами, но я не знаю, как 🙁

Спасибо за вашу помощь!

EDIT: прочитав все ответы и комментарии здесь, я понял, что это лучший дизайн, чтобы иметь выделенный тип таблицы phonetype и использовать внешний ключ в телефонной таблице. Подумав, что это был совершенно другой сценарий, я задал этот другой вопрос: mysql left join не возвратил всю левую строку таблицы. Спасибо всем, кто нашел время, чтобы помочь мне.

Вам нужно будет добавить еще одно поле в телефонную таблицу:

 'phonetype' ENUM('company','fax','home','mobile') 

и запрос:

 SELECT phone.* FROM people LEFT JOIN phone ON phone.peopleID=people.peopleID WHERE people.peopleID=? AND phone.phonetype='company' UNION SELECT phone.* FROM people LEFT JOIN phone ON phone.peopleID=people.peopleID WHERE people.peopleID=? AND phone.phonetype='fax' UNION SELECT phone.* FROM people LEFT JOIN phone ON phone.peopleID=people.peopleID WHERE people.peopleID=? AND phone.phonetype='home' UNION SELECT phone.* FROM people LEFT JOIN phone ON phone.peopleID=people.peopleID WHERE people.peopleID=? AND phone.phonetype='mobile' 

Теперь вы получите 4 строки, некоторые из них могут быть нулями

Я мог подумать о дюжине способов улучшить это; наиболее очевидной будет таблица отдельных телефонных номеров в базе данных. Но для упрощения замены кода вы можете просто сделать его одним массивом с ключом по типу:

 /* Make an empty array with empty values for each phone type */ $emptyphone = array( "countrycode"=>"", "areacode"=>"", "phonenumber"=>"", "extension"=>"", ); $phones = array( "company"=>$emptyphone + array("phonetype"=>"company"), "fax"=>$emptyphone + array("phonetype"=>"fax"), "home"=>$emptyphone + array("phonetype"=>"home"), "mobile"=>$emptyphone + array("phonetype"=>"mobile"), ); /* Now fill in the values you do have */ while($row = $resultaddress->fetch_assoc()) { $phones[$row["phonetype"]] = $row; } /* Now you can loop through them with a simple foreach */ foreach($phones as $phone) { echo 'Phone<input type="text" name="type[]" id="" value="' . $phone["phonetype"] . '"/>'; echo '<input type="text" name="countrycode[]" id="" size="3" maxlength="3" value="' . $phone["countrycode"] . '"/>'; echo '<input type="text" name="countrycode[]" id="" value="' . $phone["areacode"] . '"/>'; echo '<input type="text" name="number[]" id="" value="' . $phone["phonenumber"] . '"/>'; echo '<input type="text" name="extension[]" id="" value="' . $phone["extension"] . '"/><br>'; }