2013-03-08 51 views
0

我有一个数据库中有几个数据,但它们当然是唯一的。这些数据在每个表格内,telcoCall,telcoData,telcoSMS,取决于它的类别。我使用json_encode将这些数据合并到一个单一的数组中。在telcoCall内,数据在适当的地方。但是,telcoDatatelcoSMS是凌乱。这些表格中的数据正在被复制。这是它的外观,重复JSON数据编码

enter image description here

下面的代码:

<?PHP 
include '../initialization.php'; 

$mysqli = @mysqli_connect($host, $username, $password, $db); 

$query = 'SELECT t.*, c.*, d.*, s.* '. 
     'FROM telco t '. 
      'INNER JOIN telcoCall c ON t.telcoId = c.telcoId '. 
      'INNER JOIN telcoData d ON t.telcoId = d.telcoId '. 
      'INNER JOIN telcoSMS s ON t.telcoId = s.telcoId '. 
       'ORDER BY t.telcoName, c.callName, d.dataName, s.smsName'; 

//setup array to hold information 
$telcos = array(); 

//setup holders for the different types so that we can filter out the data 
$telcoId = 0; 
$callId = 0; 
$dataId = 0; 
$smsId = 0; 

//setup to hold our current index 
$telcoIndex = -1; 
$callIndex = -1; 
$dataIndex = -1; 
$smsIndex = -1; 

if ($result = mysqli_query($mysqli, $query)) { 
    //go through the rows 
    while($row = mysqli_fetch_assoc($result)) { 
     if($telcoId != $row['telcoId']) { 
      $telcoIndex++; 
      $callIndex = -1; 
      $dataIndex = -1; 
      $smsIndex = -1; 
      $telcoId = $row['telcoId']; 

      //add the console 
      $telcos[$telcoIndex]['Telco'] = $row['telcoName']; 

      //setup the information array 
      $telcos[$telcoIndex]['Call Promo'] = array(); 
      $telcos[$telcoIndex]['Data Promo'] = array(); 
      $telcos[$telcoIndex]['SMS Promo'] = array(); 
     } 

     if($callId != $row['callId']) { 
      $callIndex++; 
      $callId = $row['callId']; 

      //add the model to the console 
      $telcos[$telcoIndex]['Call Promo'][$callIndex]['Call Name'] = $row['callName']; 

      //setup the title array 
      $telcos[$telcoIndex]['Call Promo'][$callIndex]['Call'] = array(); 

      //add the game to the current console and model 
      $telcos[$telcoIndex]['Call Promo'][$callIndex]['Call'][] = array(
       'Keyword'  => $row['callKeyword'], 
       'Description' => $row['callDescription'], 
       'Number'  => $row['callNumber'], 
       'Validity' => $row['callValidity'], 
       'Price'  => $row['callPrice'] 
       ); 
     } 

     if($dataId != $row['dataId']) { 
      $dataIndex++; 
      $dataId = $row['dataId']; 

      //add the model to the console 
      $telcos[$telcoIndex]['Data Promo'][$dataIndex]['Data Name'] = $row['dataName']; 

      //setup the title array 
      $telcos[$telcoIndex]['Data Promo'][$dataIndex]['Data'] = array(); 

      //add the game to the current console and model 
      $telcos[$telcoIndex]['Data Promo'][$dataIndex]['Data'][] = array(
       'Keyword'  => $row['dataKeyword'], 
       'Description' => $row['dataDescription'], 
       'Number'  => $row['dataNumber'], 
       'Validity'  => $row['dataValidity'], 
       'Volume'  => $row['dataVolume'], 
       'Price'  => $row['dataPrice'] 
      ); 
     } 

     if($smsId != $row['smsId']) { 
      $smsIndex++; 
      $smsId = $row['smsId']; 

      //add the model to the console 
      $telcos[$telcoIndex]['SMS Promo'][$smsIndex]['SMS Name'] = $row['smsName']; 

      //setup the title array 
      $telcos[$telcoIndex]['SMS Promo'][$smsIndex]['SMS'] = array(); 

      //add the game to the current console and model 
      $telcos[$telcoIndex]['SMS Promo'][$smsIndex]['SMS'][] = array(
       'Keyword'  => $row['smsKeyword'], 
       'Description' => $row['smsDescription'], 
       'Number'  => $row['smsNumber'], 
       'Validity'  => $row['smsValidity'], 
       'Price'  => $row['smsPrice'] 
      ); 
     } 
    } 

    mysqli_free_result($result); 
} 

echo json_encode($telcos); 

mysqli_close($mysqli); 
?> 

我真的不知道为什么会这样。

+0

请提供数据。例如,在“CREATE TABLE ...'形式最好和'INSERT INTO ... VALUES ... 'sql语句 – VolkerK 2013-03-08 13:44:30

+0

我编辑了我的文章。 – Jahm 2013-03-08 13:51:55

+0

Thx,但对于此示例数据,查询返回零记录。 – VolkerK 2013-03-08 14:25:47

回答

0

看起来telcoId在电信表中是主要唯一的,但在其他表中可以是多个(这很有意义),不幸的是,如果尝试将单个(1)加入到multiple1(2)到multiple2(2) 3),它会创建1 * 2 * 2 * 3 = 12行,这解释了凌乱的multiple2和multiple3。

因此,通过运行单独的查询,首先获取电信公司信息,然后在telcoCall,telcoData,telcoSMS上为每个电信公司进行单独的数据库调用,而不是进行单一的数据库调用。

或者,如果你只是想速度和不关心干净的代码,你可以用你所拥有的权利,但堆起来的,如果条件:

编辑1:编辑修复逻辑漏洞,由于某种原因,高斯消想到

// Stacking order determined by your SQL ORDER BY: t.telcoName, c.callName, d.dataName, s.smsName 

if($telcoId == $row['telcoId']) continue; 
//telco stuff... 

if($callId == $row['callId']) continue; 
//call stuff... 

if($dataId == $row['dataId']) continue; 
//data stuff... 

if($smsId == $row['smsId']) continue; 
//sms stuff... 

编辑2:只需要较少的脑力劳动

if($telcoId != $row['telcoId']) { 
    //telco stuff... 
    callArrayTemp = array(); 
    dataArrayTemp = array(); 
    smsArrayTemp = array(); 
} 
if(!in_array($row['callId'], callArrayTemp[])) { 
    callArrayTemp[] = $row['callId']; 
    //call stuff... 
} 
if(!in_array($row['dataId'], dataArrayTemp[])) { 
    dataArrayTemp[] = $row['dataId']; 
    //data stuff... 
} 
if(!in_array($row['smsId'], smsArrayTemp[])) { 
    smsArrayTemp[] = $row['smsId']; 
    //sms stuff... 
} 
+0

我试过你的建议,但每个只有一个数据。 – Jahm 2013-03-12 11:32:25

+0

你是对的,逻辑失败了,我会通过引入一个数组来修复它。 – 2013-03-12 20:16:46