【问题标题】:display data from database in a specific order: php or mysql?以特定顺序显示数据库中的数据:php 还是 mysql?
【发布时间】:2016-01-20 22:29:19
【问题描述】:

我有一个电话号码表:

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

移动:要填写的空白字段

也许可以用关联数组来完成,但我不知道怎么做:(

感谢您的帮助!

编辑:在阅读了这里的所有答案和 cmets 之后,我了解到拥有专用表电话类型并在电话表中使用外键是更好的设计。认为这是一个完全不同的场景,我问了另一个问题mysql left join not return all left table row 再次感谢所有花时间帮助我的人。

【问题讨论】:

  • 考虑在查询中使用ORDER BY 子句?另外,您将电话类型存储在数据库中的什么位置?
  • @Maximus2012 问题可能是其中两条记录不存在,所以空字段总是最后出现
  • @RobbieAverill 你是对的。在这种情况下,用户可能应该有第二个电话类型表,然后尝试先遍历该表。
  • 不清楚你想要什么,因为你的标题要求一些东西,但是你解释的问题(如果我理解得好的话)谈论的是别的东西
  • 那么您如何表明其中一行是公司或家庭电话号码?表中没有任何内容表明

标签: php mysql arrays


【解决方案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 行,其中一些可能是空值

【讨论】:

  • @Gravel 谢谢 Gravel,我现在正在测试它。 2个小问题:1)如果我已经有字段phonetype,我如何将它设置为ENUM? 2)您认为对于电话类型,最好有一个单独的表吗?谢谢!
  • 不管它是什么类型。如果是整数,则代替 phone.phonetype='company' 使用:phonetype=0 等。
  • 对不起 Gavriel,我在哪里输入 'phonetype' ENUM('company','fax','home','mobile') ?它给了我一个错误
  • 你不必这样做,我在你记得你已经拥有那个字段之前就写了,尽管你仍然对它的类型保密。只需使用您已有的。
【解决方案2】:

我可以想出十几种方法来改进它;最明显的是数据库中的一个单独的电话号码表。但是,为了最简单的插入式代码替换,您可以将其设置为按类型键入的单个数组:

/* 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>';                
}

【讨论】:

  • 谢谢米肯!电话号码的单独表格是什么意思?每种类型都有一个单独的表?比如:table_companyphone、table_homephone……等等?
  • 抱歉,是指电话类型。然后,您现有数据库中的 phonetype 将成为外键,并且连接将导致任何缺少的类型为空值。与其他答案类似,但我不想建议数据库更改,不确定这是否是实时代码。
  • 谢谢 miken,它还没有上线,所以我可以添加一个外键。我仍然可以添加一个电话类型表。在这种情况下,你会用 $stmt = $conn-&gt;prepare("NEW SQL WITH JOIN"); 编写什么代码。抱歉,我还是新手!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 2012-02-14
相关资源
最近更新 更多