2016-05-28 44 views
0

我有下面的腳本,應該基本上從我的MySQL表中獲取包含經度和緯度的字段,然後計算行駛距離,然後將它作爲列表回顯給用戶。爲什麼我的腳本不斷重新聲明php函數?

出於某種原因,該腳本只打印從第一個結果,然後拋出一個錯誤Fatal Error: Cannot redeclare GetDrivingDistance()

mysqli_close($conn);    
$servername = "localhost"; 
$username = "user"; 
$password = "pwd"; 
$dbname = "buses"; 

// Create connection 
$conn = new mysqli($servername, $username, $password, $dbname); 
// Check connection 
if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 
$sql = "SELECT * 
        FROM matatus 
        JOIN registered_matatus 
        ON matatus.user_id=registered_matatus.user_id 
        ORDER BY matatus.vehicle_id 
        ASC LIMIT 4"; 
if ($result->num_rows > 0) { 
    // output data of each row 
    echo "CON Select a matatu\n"; 
    while($row = $result->fetch_assoc()) { 
//Start of calculate distance and time 
$lat1 = "-1.283180"; 
$long1 = "36.822462"; 
$lat2 = $row["lat"]; 
$long2 = $row["lng"]; 

function GetDrivingDistance($lat1, $lat2, $long1, $long2) 
{ 
    $url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=".$lat1.",".$long1."&destinations=".$lat2.",".$long2."&mode=driving&language=pl-PL"; 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_PROXYPORT, 3128); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
    $response = curl_exec($ch); 
    curl_close($ch); 
    $response_a = json_decode($response, true); 
    $dist = $response_a['rows'][0]['elements'][0]['distance']['text']; 
    $time = $response_a['rows'][0]['elements'][0]['duration']['text']; 
    return array('distance' => $dist, 'time' => $time); 
} 
    $dist = GetDrivingDistance($lat1, $lat2, $long1, $long2); 
    $distance = $dist['distance']; 
    $time = $dist['time']; 
//End of calculate distance and time 
     echo "". $row["id"]. " ". $row["reg_number"]. " (" . $row["sacco"] . ") -$time\n"; 
    } 
} else { 
    echo "0 results"; 
} 
$conn->close(); 

任何擡起頭對如何去解決這個可高度讚賞。

+0

嘗試移動功能圈外的...... –

+1

你要定義一個循環內的函數,這意味着它不會像平常那樣被掛起,並且每次循環結束時你都會嘗試重新聲明它。 –

+0

上面的代碼會很快失敗:SQL永遠不會執行,並且'$ result'不會被初始化。 – trincot

回答

1

試試這個:
環路你不能聲明功能

// Create connection 
$conn = new mysqli($servername, $username, $password, $dbname); 
// Check connection 
if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 
$sql = "SELECT * 
        FROM matatus 
        JOIN registered_matatus 
        ON matatus.user_id=registered_matatus.user_id 
        ORDER BY matatus.vehicle_id 
        ASC LIMIT 4"; 
if ($result->num_rows > 0) { 
    // output data of each row 
    echo "CON Select a matatu\n"; 

function GetDrivingDistance($lat1, $lat2, $long1, $long2) 
{ 
    $url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=".$lat1.",".$long1."&destinations=".$lat2.",".$long2."&mode=driving&language=pl-PL"; 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_PROXYPORT, 3128); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
    $response = curl_exec($ch); 
    curl_close($ch); 
    $response_a = json_decode($response, true); 
    $dist = $response_a['rows'][0]['elements'][0]['distance']['text']; 
    $time = $response_a['rows'][0]['elements'][0]['duration']['text']; 
    return array('distance' => $dist, 'time' => $time); 
} 
while($row = $result->fetch_assoc()) { 
//Start of calculate distance and time 
$lat1 = "-1.283180"; 
$long1 = "36.822462"; 
$lat2 = $row["lat"]; 
$long2 = $row["lng"]; 
$dist = GetDrivingDistance($lat1, $lat2, $long1, $long2); 
$distance = $dist['distance']; 
$time = $dist['time']; 
//End of calculate distance and time 
     echo "". $row["id"]. " ". $row["reg_number"]. " (" . $row["sacco"] . ") -$time\n"; 
    } 
} else { 
    echo "0 results"; 
} 
$conn->close(); 
+0

這工作就像一個魅力。謝謝 – nick

0

GetDrivingDistance函數在循環中。你不能在php中一次又一次地用相同的名字聲明函數。它會導致你遇到同樣的確切錯誤。

試試這個

mysqli_close($conn);    
$servername = "localhost"; 
$username = "user"; 
$password = "pwd"; 
$dbname = "buses"; 

// Create connection 
$conn = new mysqli($servername, $username, $password, $dbname); 
// Check connection 
    if ($conn->connect_error) { 
die("Connection failed: " . $conn->connect_error); 
    } 
    $sql = "SELECT * 
       FROM matatus 
       JOIN registered_matatus 
       ON matatus.user_id=registered_matatus.user_id 
       ORDER BY matatus.vehicle_id 
       ASC LIMIT 4"; 
    if ($result->num_rows > 0) { 
// output data of each row 
echo "CON Select a matatu\n"; 
while($row = $result->fetch_assoc()) { 
//Start of calculate distance and time 
$lat1 = "-1.283180"; 
$long1 = "36.822462"; 
$lat2 = $row["lat"]; 
$long2 = $row["lng"]; 


$dist = GetDrivingDistance($lat1, $lat2, $long1, $long2); 
$distance = $dist['distance']; 
$time = $dist['time']; 
//End of calculate distance and time 
    echo "". $row["id"]. " ". $row["reg_number"]. " (" . $row["sacco"] . ")   -$time\n"; 
} 
} else { 
    echo "0 results"; 
} 


function GetDrivingDistance($lat1, $lat2, $long1, $long2) 
{ 
$url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=".$lat1.",".$long1."&destinations=".$lat2.",".$long2."&mode=driving&language=pl-PL"; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_PROXYPORT, 3128); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
$response = curl_exec($ch); 
curl_close($ch); 
$response_a = json_decode($response, true); 
$dist = $response_a['rows'][0]['elements'][0]['distance']['text']; 
$time = $response_a['rows'][0]['elements'][0]['duration']['text']; 
return array('distance' => $dist, 'time' => $time); 
} 
$conn->close(); 
相關問題