MySQL PHP将数据从两行插入到多维数组中

时间:2014-04-14 16:00:12

标签: php mysql arrays database multidimensional-array

我正在尝试将数据从我的数据库中的两个表插入到多维数组中,但它确实做了一些我不知道如何解决的问题。

首先,这是我的PHP脚本:

if ($stmt = $mysqli->prepare('SELECT objects_price.object_id, materials.material_id, materials.name, material_amount
                              FROM objects_price
                              INNER JOIN materials ON objects_price.material_id=materials.material_id
                             ')) {
    $stmt->execute();

    $stmt->bind_result($object_id, $material_id, $material_name, $material_amount);
    $j = 1;
    $arr = array();

    while ($stmt->fetch()) {
        $k = 1;
        if ($object_id == $k) {
            $arr[] = array($j, $material_name, $material_amount);
            $k++;
            $j++;
        }
    }

    $stmt->close();

此脚本从数据库中取出一些值并将它们插入到数组中。我的数据库看起来像这样: (objects_price)

This is objects_price

(材料)

This is materials

现在发生的事情是它只输出:

What the code above outputs

如果我将数据库查询更改为:

if ($stmt = $mysqli->prepare('SELECT objects_price.object_id, materials.material_id, materials.name, material_amount
                            FROM objects_price
                            INNER JOIN materials
                            ')) {

它输出:

with only INNER JOIN materials

因此,此表的左侧显示正确,但右侧仅显示价格的第一行,(47)。它应该是这样的:

enter image description here

我不知道通过更改数据库查询是否可以轻松实现。但我希望我能在这里得到一些建议,建议或帮助。提前谢谢。

2 个答案:

答案 0 :(得分:2)

尝试在桌面上使用左连接:

$query = "SELECT m.name, op.objects_id
    FROM objects_price op 
    LEFT JOIN materials m USING(material_id)";
$result = $mysqli->query($query);

您需要改变的下一步是处理结果的方式。很可能你会经历结果并跳过很多,这就是为什么你最终只能得到一个。试试这个:

$arr = array();
while($row = $result->fetch_assoc()) {
    $arr[$row['objects_id']] = $row['name'];
}

如果每个对象有超过1种材质,那么只需对多维数组使用这种轻微调整

$arr = array();
while($row = $result->fetch_assoc()) {
    $arr[$row['name']][] = $row['objects_id'];
}

然后从中产生你的表:

echo '<table>';
foreach($arr as $name => $objects) {
    echo '<tr><td>' . $name . '</td><td>';
    $space = '';
    foreach($objects as $id) {
        echo $space . $id;
        $space = ", ";
    }
    echo '</td></tr>';
}
echo '</table>';

一些提示:

  1. 如果您没有输入任何变量,则无需准备查询。您可以按上述方式运行它。
  2. 不要选择超出需要的列数。当你只使用2?
  3. 时,为什么要从表中获取所有列?
  4. 如果您要加入两个表中具有相同名称的列,则可以使用USING(column_name)

答案 1 :(得分:1)

除了这些行之外,代码中的所有内容都很好看:

 while ($stmt->fetch()) {
    $k = 1;

正在发生的是$ k被声明并且赋值为1.因为它在循环中,每次运行该行时,值都会返回1.要解决此问题,只需将该值放在循环外部像这样:

 $k = 1;
 while ($stmt->fetch()) {
     //blah blah blah
 }