我有一个电话号码表:
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
home 000 000 1234569
(没有空字段最终输入新数字)
问题:
我想以相同的顺序显示电话号码: 假设我在DB中只有公司和家庭号码,编辑表格应该看起来像
公司:000 000 1234567
传真:空白字段填写
主页:000 000 1234569
移动:空字段填写
可能可以使用关联数组,但我不知道如何:(
感谢您的帮助!
编辑:在阅读完所有的答案和评论后,我明白这是一个更好的设计,有一个专用的表格式,并在电话表中使用外键。认为这是一个完全不同的场景,我问了另一个问题mysql left join not return all left table row 再次感谢所有花时间帮助我的人。答案 0 :(得分:1)
您需要在电话桌中添加另一个字段:
'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行,其中一些可能是空的
答案 1 :(得分:1)
我可以想到十几种改善这种方法的方法;最明显的是数据库中的单独电话号码表。但是,对于最简单的插入代码替换,您可以将其设置为按类型键入的单个数组:
/* 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>';
}