У меня есть таблица для телефонных номеров:
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>'; }