2013-04-01 2 views
2

저는 완벽한 아약스/PHP 바보예요. - 지금 당장 나가주세요. 그러나 나는 도움이 필요한 시점에 도달했습니다. 나는 여기 저기에있는 다양한 자습서를 따라 왔으며 보고서를 작성하는 종류입니다.Ajax가있는 PHP 배열 - 데이터를 가져 오는 올바른 방법은 무엇입니까?

궁극적으로 필요한 모든 데이터가 포함 된 표가 있습니다. 그 데이터를 가져 와서 문제없이 테이블에 적절히 표시 할 수 있습니다. 나는 '드롭 다운'상자를 추가하여 기준에 따라 필터링을 허용하려고합니다.이 테이블에는 '세로 형'이라는 열이 있습니다. 따라서 드롭 다운에 데이터베이스 열과 다른 모든 '세로 형'이 포함될 것입니다.

client.php :

<head> 
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
<link rel="stylesheet" type="text/css" href="css/mediacallreport.css"> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Generic Title</title> 
</head> 



<body> 
    <h2> Generic Reports </h2> 
    <h3>Report Formatting: </h3> 
    <div id="instruction">Select how you would like the data selected using the dropdowns below</div> 

    <!--DROPDOWNS--> 
Vertical - 
<select name="station" id="station"> 
    <option value="all">All</option> 
    <script id="source" language="javascript" type="text/javascript"> 
     $(function() 
     { 
     $.ajax({          
      url: 'api.php', //the script to call to get data   
      data: "", //you can insert url argumnets here to pass to api.php 
      dataType: 'json', //data format  
      success: function(verticals) //on recieve of reply 
      { 
      for (var i in verticals) 
      { 
      var vertical = verticals[i]; 
      var verticalID = verticals[0]; 

     $('station').append("<option value=\""+verticalID+"\">"+verticalID+"</option>"); 
       } 

      } 
     }); 
     }); 
    </script> 
</select> 

<!--TABLE BEGINNING - TABLE HEADER ROW--> 
<table id="output"> 
<tr> 
<th>ID</th> 
<th>Station_Network</th> 
<th>Vertical</th> 
<th>Creative</th> 
<th>Tolls</th> 
<th>States</th> 
<th>Date Range</th> 
<th>Week</th> 
<th>Ordered</th> 
<th>Credits</th> 
<th>Credits Totals</th> 
<th>Not Used</th> 
<th>Cleared</th> 
<th>Total Uniques</th> 
<th>Cleared Each Unique</th> 
<th>Total Unique Connect</th> 
<th>Cleared Each Unique Connect</th> 
<th>Unique Connect 8am - 8pm</th> 
<th>Cleared Unique 8am - 8pm</th> 
<th>Calls over 10 Min</th> 
<th>Calls over 10 Min %</th> 
</tr> 

<!--JAVASCRIPT TO GET INFORMATION FROM DB, ASSIGN VARIABLES AND PUT INTO TABLE ROWS--> 
    <script id="source" language="javascript" type="text/javascript"> 
    $(function() 
    { 
    //----------------------------------------------------------------------- 
    // 2) SEND HTTP REQUEST WITH AJAX 
    //----------------------------------------------------------------------- 
    $.ajax({          
     url: 'api.php', //the script to call to get data   
     data: "", //you can insert url argumnets here to pass to api.php 
         //for example "id=5&parent=6" 
     dataType: 'json', //data format  
     success: function(rows) //on recieve of reply 
     { 
     for (var i in rows) 
     { 
     var row = rows[i]; 
     var id = row[0];    //get id 
     var station_network = row[1];  //get name 
     var vertical = row[2]; //get vertical 
     var creative = row[3]; //get creative 
     var tolls= row[4]; //get tolls 
     var states= row[5]; //get states 
     var date_range= row[6]; //get date_range 
     var week= row[7]; //get week 
     var ordered= row[8]; //get ordered 
     var credits= row[9]; //get credits 
     var credit_totals= row[10]; //get credit_totals 
     var not_used= row[11]; 
     var cleared= row[12]; 
     var total_uniques= row[13]; 
     var cleared_each_unique= row[14]; 
     var total_unique_connect= row[15]; 
     var cleared_each_unique_connect= row[16]; 
     var unique_connect_8am_to_8pm= row[17]; 
     var cleared_each_8am_to_8pm= row[18]; 
     var calls_over_10= row[19]; 
     var calls_over_10_pct= row[20]; 
     //-------------------------------------------------------------------- 
     // DISPLAY THE CONTENT 
     //-------------------------------------------------------------------- 
     //TABLES (ALTERNATING ROWS) 
     if (id % 2 == 0){ 
     $('#output').append("<tr id=\"evenrow\"> <td>"+id+"</td><td>"+station_network+"</td><td>"+vertical+"</td><td>"+creative+"</td><td>"+tolls+"</td><td>"+states+"</td><td>"+date_range+"</td><td>"+week+"</td><td>"+ordered+"</td><td>"+credits+"</td><td>"+credit_totals+"</td><td>"+not_used+"</td><td>"+cleared+"</td><td>"+total_uniques+"</td><td>"+cleared_each_unique+"</td><td>"+total_unique_connect+"</td><td>"+cleared_each_unique_connect+"</td><td>"+unique_connect_8am_to_8pm+"</td><td>"+cleared_each_8am_to_8pm+"</td><td>"+calls_over_10+"</td><td>"+calls_over_10_pct+"</td></tr>"); 
     } else { 
     $('#output').append("<tr id=\"oddrow\"> <td>"+id+"</td><td>"+station_network+"</td><td>"+vertical+"</td><td>"+creative+"</td><td>"+tolls+"</td><td>"+states+"</td><td>"+date_range+"</td><td>"+week+"</td><td>"+ordered+"</td><td>"+credits+"</td><td>"+credit_totals+"</td><td>"+not_used+"</td><td>"+cleared+"</td><td>"+total_uniques+"</td><td>"+cleared_each_unique+"</td><td>"+total_unique_connect+"</td><td>"+cleared_each_unique_connect+"</td><td>"+unique_connect_8am_to_8pm+"</td><td>"+cleared_each_8am_to_8pm+"</td><td>"+calls_over_10+"</td><td>"+calls_over_10_pct+"</td></tr>"); 
     } 

     } 

     } 
    }); 
    }); 
    </script> 

</body> 
</html> 
나는 다음과 같은 프론트 엔드 조각은 클라이언트로드 보고서를 얻을 수있는 것을 "client.php"라고 한 수직의 선택)

에 따라 테이블을 필터링

그게 내 api.php와 대화합니다. api.php :

<?php 
    //-------------------------------------------------------------------------- 
    // Connect to DB 
    //-------------------------------------------------------------------------- 
    include 'DB.php'; 
    $con = mysql_connect($host,$user,$pass) ; 
    $dbs = mysql_select_db($databaseName, $con); 
    //-------------------------------------------------------------------------- 
    // 2) Query database for data 
    //-------------------------------------------------------------------------- 
    //Rows of data in media-analysis 
    $result = mysql_query("SELECT * FROM $tableName");   //query 
    $data = array(); 
    while ($row = mysql_fetch_row($result)) 
    { 
    $data[] = $row; 
    } 



    //Dropdown for Verticals 
    $verticalSql = "SELECT VERTICAL FROM media_analysis GROUP BY VERTICAL"; 
    $verticalResult = mysql_query($verticalSql); 
    $verticalData = array(); 
    while ($verticalRow = mysql_fetch_row($verticalResult)){ 
     $verticalData[] = $verticalRow; 
    } 

    $finalarray = array ('rowdata' => $data, 'verticaldata' => $verticalData); 
    //-------------------------------------------------------------------------- 
    // 3) echo result as json 
    //-------------------------------------------------------------------------- 
    echo json_encode($finalarray); 
?> 
방화범

I 데이터가 건너 오는 것을 볼 수 있으며이 같은 같습니다

{"rowdata":[["1","canceled","canceled","canceled","canceled","canceled","03\/18\/2013-03-24\/2013","12","canceled","0","","","0.00","0","0.00","0","0.00","0","0.00","0","0.00"],["2","Station B","Vertical B","DEBIT","800-555-5555","CA","03\/18\/2013-03-24\/2013","12","$813.00","0","","","813.00","8","101.62","5","162.60","3","271.00","2","40.00"]],"verticaldata":[["canceled"],["Vertical B"]]} 

내가 '드롭 다운'을 포함하여 시작하기 전에, 난 그냥 한 간단한로 json_encode ($ 데이터); 그리고 그것은 잘 작동 할 것이고 테이블은 정확히 내가 원했던 방식으로 보여줄 것입니다. 지나가는 또 다른 배열을 추가 했으므로 상황이 미쳐서 완전히 잃어 버렸습니다.

필자의 코딩은 아마도 매우 열악한 것으로 알고 있지만이 문제를 해결하기 위해 노력하고 있습니다. 모든 도움을 주셨습니다.

답변

4

문제는 당신의 성공 처리기의 코드가 배열이 반환을 기대한다는 것입니다 :

{"rowdata":[[...],[...]],"verticaldata":[["canceled"],["Vertical B"]]} 

로 :

success: function(verticals) //on recieve of reply 
{ 
    for (var i in verticals) 
    { 
     var vertical = verticals[i]; 
     var verticalID = verticals[0]; 

     $('station').append("<option value=\""+verticalID+"\">"+verticalID+"</option>"); 
    } 

} 

그러나, 당신이 당신의 예에 가리 켰을 때, verticals은 다음과 같습니다 당신은 볼 수 있습니다, verticals은 두 개의 다른 객체 (rowdataverticaldata)를 포함하는 객체입니다.

현재 성공 처리기를 다시 작동 시키려면 먼저 AJAX 응답에서 verticaldata을 추출해야합니다. 이 코드를 변경하면 간단하게 작동합니다 :

success: function(response) //on recieve of reply 
{ 
    var verticals = response.verticaldata; 
    for (var i in verticals) 
    { 
     var vertical = verticals[i]; 
     var verticalID = verticals[0]; 

     $('station').append("<option value=\""+verticalID+"\">"+verticalID+"</option>"); 
    } 
} 
+1

이 그것을 할 것입니다! 엄청 고마워. 나는 여전히 멍청 하긴하지만 배우고 있고 당신의 설명이 정확히 내가 원하는 바야! 엄청 고마워! – Hanny

2

PHP와 jQuery를 사용하고 있기 때문에 내 라이브러리를 사용할 수 있습니다. 아웃 오브 더 박스 자바 스크립트로 PHP, 반대로에서 오는 데이터를 처리)

귀하의 경우 여기 http://phery-php-ajax.net

참조,이

<?php 
    include('Phery.php'); 

    Phery::instance()->set(array(
    'verticals' => function(data){ 
     $r = new PheryResponse; 

     $verticalResult = mysql_query("SELECT VERTICAL FROM media_analysis GROUP BY VERTICAL"); 

     $r->jquery('.station'); // Select it for subsequent chaining in the loop 
     $i = 0; 
     while ($verticalRow = mysql_fetch_row($verticalResult)){ 
      $r->append('<option value="'.($i++).'">'.$verticalRow['VERTICAL'].'</option>'); // What is VERTICAL? Is that query the real one? 
     } 
     // every "append" call will happen to .station jquery selector automatically 
     return $r; 
    } 
    ))->process(); 
?> 
같은 것

에서 자바 스크립트 코드

$(function(){ 
    phery.remote('verticals'); 
}); 

그게 전부입니다.왜 그냥 JSON을 반환하고 phery:json을 사용할 수 있습니다, 당신은 서버에 한 번 할 수있는 경우 (데이터 생성이 속하는 곳), 물론

데이터를 생성하는 (재),하지만 귀하의 경우 실용적이지의

return PheryResponse::factory()->json($verticalData); 

그리고 자바 스크립트 측

phery.remote('verticals', null, null, false).on('phery:json', function(data){ 
    for (var i in data){ 
    // do your append here 
    } 
}); 
+0

나는 이것이 훌륭한 해결책이라고 확신한다. 나는 당신의 도서관을 체크 아웃하고 그것을 미래에 사용할 것입니다! 감사! – Hanny

+0

아무런 문제가 없다. PHP에서 직접 HTML을 조작 할 때 클라이언트의 필수 코드를 줄여서 만들었다. – pocesar

관련 문제