1

データベースから多次元配列を使用して配列を作成したいと思います。データベースには3つのテーブルがあり、1つは車両用、1つは損害賠償用、もう1つは損害賠償用です。

テーブル車両には、 ID名前の2つの列があります

テーブルのdamagesには、damagesID 、 VehicleIDdamagesTypedamagesDescriptionの4つの列があります。

テーブルdamagesPhotosには、 damagesPhotoIDdamagesIDdamagesPhotoUrlの3つの列があります。

これらの3つの列を1つの配列に結合する必要があります。これは、次のようになります。

$vehicle = array( 
   "id" => "somestring", 
   "name" => "somestring", 
   "damages" => array( 
       "damagesType" => "somestring", 
       "damagesDescription" => "somestring", 
          "photoOfDamages" => array( 
            "damagesPhotoUrl" => "somestring" 
          ) 
  ) 
); 

私のコードはこのように見えますが、正しく機能していません。

$result = mysql_query( "SELECT * from vehicle v LEFT JOIN damages d ON v.id = d.vehicleID LEFT JOIN damagesPhotos p ON d.damagesID = p.damagesID WHERE d.damagesID = p.damagesID AND v.id = 1") or die(mysql_error());  

$rowsResult  = array();

while ($r = mysql_fetch_assoc($result))
    {
        $rowsResult  [] = $r;       
    }

mysql_free_result($result);

echo json_encode($rowsResult);
...

/ Morten

4

6 に答える 6

4

mysqlでは不可能であるため、特定の車両に関するすべての情報を提供するスクリプトを記述し、そのデータを使用して配列を作成できます。次のコードを参照してください。

$query = "SELECT * from vehicle v LEFT JOIN damages d ON v.id = d.vehicleID LEFT JOIN   damagesPhotos p ON d.damagesID = p.damagesID WHERE d.damagesID = p.damagesID AND v.id = 1";

$result = mysql_query($query);

$i = 0;
$vehicle = array();
while($row = mysql_fetch_array($result)){
      $vehicle[$i] = array( 
        "id" => $row[id], 
        "name" => $row[name], 
        "damages" => array( 
            "damagesType" => $row[damagesType], 
            "damagesDescription" => $row[damagesDescription], 
            "photoOfDamages" => array( 
               "damagesPhotoUrl" => $row[damagesPhotoUrl] 
            ) 
         )
      );
      $i++;
}
于 2012-08-31T07:38:26.047 に答える
2

mysqlから多次元配列を取得することはできません。2次元の結果セットが得られるだけです。各行の列値の数は、取得できるすべてです。そのようにネストしたい場合は、結果を取得した後に配列を処理する必要があります。

このようなもの:

$vehicles = array();

while ($r = mysql_fetch_assoc($result))
{
    $vehicle['id'] = $r['id']; 
    ...
    $damage = array();
    $damage['damagesType'] = $r['damagesType'];
    ...
    $vehicle['damages'] = $damage;
    ...
    array_push($vehicles, $vehicle);      
}
echo json_encode($vehicles);
于 2012-08-31T07:28:46.970 に答える
2

MySQL (またはSQL駆動型データベース)からの結果セットが正確に持つことができるため、ここでMySQLにすべての作業を実行させることはできません(ほとんどの作業を実行させること可能ですが、実行しないでください)。二次元。最初のディメンションは行のコレクションであり、2番目のディメンションは各行の列のコレクションです。

ターゲットデータ構造の例に基づいて、2つの選択肢があります。

  1. 最初の結果セット(vehicle LEFT JOIN damages)を取得し、それを反復処理して、クエリを実行して写真を取得します
  2. 現在行っているようにすべてのテーブルを結合し、目的の多次元構造に後処理します。

これはトレードオフです-オプション1はデータベーストラフィックを大幅に増やしますが、必要なデータしか取得しませんが、オプション2はデータベーストラフィックが少ない単一のクエリに減らしますが、各写真行が全体を運ぶため、必要以上のデータを取得しますそれを使用した車両のデータ。

オプション1は、プリペアドステートメントを使用するための最有力候補です。これは、mysql_*関数の使用を利用できないものです。代わりに、 PDOまたはMySQLiの使用に切り替える必要があります。私は個人的にPDOをお勧めします。これを行う理由は他にもたくさんあります。たとえば、MySQL拡張機能がいつかPHPから削除され、プリペアドステートメントを適切に使用することで、ユーザー入力によるSQLインジェクションに起因するセキュリティ問題のリスクを完全に取り除くことができます。

私はおそらくオプション2をお勧めします。

于 2012-08-31T07:35:16.673 に答える
0

あなたの主な問題を解決した後。私は新しい問題のためにこれを書いています。私が知っているように、配列内の同じキーに値を割り当てることができないということは、重複するキーを持つことを許可できないことを意味します。複数のキーが同じキーを持つことができる場合、どのようにして必要な値にアクセスするのでしょうか。そのため、値をマージする別の方法を選択できます。次のようにアレイを再配置します。

$key = "damagesPhotoUrl";
$value = "link to damagesPhoto 01";
$array[$key][] = $value;

その後、次のようにアクセスできます。

echo $array[$key][0];
echo $array[$key][1];
于 2012-09-03T05:27:46.103 に答える
0

Vinayのおかげで、私の配列は次のようになります。それはすばらしい :)

[{"vehilceId":"1",
"name":"AW55005",
"damages":{
    "damagesType":"Exterior",
    "damagesDescription":"Rust",
    "photoOfDamages":{
        "damagesPhotoUrl":"link to damagesPhoto 01"
        }
    }
},

{"vehilceId":"1",
"name":"AW55005",
"damages":{
    "damagesType":"Exterior",
    "damagesDescription":"Rust",
    "photoOfDamages":{
        "damagesPhotoUrl":"link to damagesPhoto 02"
        }
    }
},

{"vehilceId":"1",
"name":"AW55005",
"damages":{
        "damagesType":"Interior",
        "damagesDescription":"Scratch",
        "photoOfDamages":{
            "damagesPhotoUrl":"link to damagesPhoto 03"
            }
        }
}

ただし、最初の2つのオブジェクトは同じであることがわかるように、damagesPhotoUrlのみが異なります。これらの2つの配列をマージして、次のようにするにはどうすればよいですか。

{"vehilceId":"1",
"name":"AW55005",
"damages":{
    "damagesType":"Exterior",
    "damagesDescription":"Rust",
    "photoOfDamages":{
        {"damagesPhotoUrl":"link to damagesPhoto 01"},
        {"damagesPhotoUrl":"link to damagesPhoto 02"}
    }
    }
}, ...

/ Morten

于 2012-08-31T18:47:23.810 に答える
0

非常に遅いですが、PDOを使用している場合は、PDO::FETCH_COLUMNとPDO::FETCH_GROUPを組み合わせて3次元配列を作成できます。制限はあると思いますが、私はSQLの専門家ではありませんが、「mysqlから多次元配列を取得することはできません...またはSQL駆動型データベース-正確に2つの次元を持つことができます」とは言えません。

私の英語とオフトピックで申し訳ありません(この質問はmysqlに関するものであり、pdoに関するものではありません)

http://php.net/manual/en/pdostatement.fetchall.php

(疑似配列):

array(
  array(//group 1
    array(
      0=>item1,
      0=>item2...
      )
    array(
      0=>item1,
      0=>item2...
      )
    array(
      0=>item1,
      0=>item2...
      )
    array(
      0=>item1,
      0=>item2...
      )
  )...
  array(//group 2
    array(
      0=>item1,
      0=>item2...
      )
    array(
      0=>item1,
      0=>item2...
      )
   )...
) 
于 2013-08-10T20:58:49.277 に答える