2012-11-26 21 views
2

我想有在数据库端,而不是客户端这样一个循环:创建MySQL的功能,以取代PHP代码

while($result = mysql_fetch_array($exec)) { 
    $pitagoras = sqrt(($result['driverpoint_lat']-$lat1)*($result['driverpoint_lat']-$lat1)+($result['driverpoint_lng']-$lng1)*($result['driverpoint_lng']-$lng1)); 

    if($pitagoras < $distance_least) { 
     $distance_least = $pitagoras; 
     $closest_driver = $result['iddriver']; 
    } 
} 

有什么办法来取代mysql_fetch_array()如果我想从该行的一些数据,或者也许完全不同的方式来实现在MySQL端的这样的功能?

+3

有什么不对获取数组? –

+0

什么都没有,它的效果很好,但它的数据库类和我的导师想要尽可能多地在数据库端 - 他通过说这种语言的可移植性来说明它的可移植性。 –

+0

使用[PDO](http://php.net/manual/en/book.pdo.php)也许? –

回答

0

这里是你可以开始的地方。这不是一个存储过程,但我不觉得这有一个问题:

构建的查询,使其通过上述距离返回的距离,然后顺序:

SELECT iddriver, ..., 
(driver_lat - $lat) * (driver_lat - $lat) + 
(driver_lng - $lng) * (driver_lng - $lng) as dxd 
FROM ... WHERE ... 
ORDER BY dxd ASC 

我的名字导致DXD作为距离乘以距离,因为结果是相同的,并且您没有在每一行上运行SQRT。

结果是最先距离最短的司机列表。你也可以使用LIMIT。

注意:将其放入准备好的声明并/或通过PDO运行并不困难。底线要注意SQL注入。

+0

谢谢你,这是我以前没有想到的,但它很好用! 这是使用你的代码我的存储功能: “DELIMITER $$ CREATE FUNCTION sampleFunc9( \t \t \t纬度DOUBLE, \t \t \t LNG双 \t \t)返回值INT 确定性 BEGIN DECLARE结果DOUBLE; (driverpoint_lat - lat)*(driverpoint_lng - lng)*(driverpoint_lng - lng)*(driverpoint_lng - lng)ASC LIMIT 1); 返回结果; END $$' –

+0

很高兴看到它帮助:) – andreshernandez

0

在我看来,你想把它放到数据库的函数或存储过程中,而不是在应用程序端进行。我不会推荐这样做。数据库并不意味着要完成应用程序的工作。无论如何,既然你的导师已经要求这个,请看看MySQL的mathematical functions

看着你发布的代码,你有变量在应用程序端($lat1 & $lng1)。你会将这些传递给函数吗?

这个answer是一个很好的起点,它展示了MySQL函数中如何使用数学函数,然后由PHP调用。请注意,这是使用mysql_函数编写的,它们是being deprecated。您应该使用mysqli_PDO函数。

+0

我听说它更好地避免存储函数/过程,但正如你所说,我一定会使用它们。 是的,我希望函数被称为“CALL getLeastDistance($ lat,$ lng)”,并且返回值是最靠近经纬度和长点的驱动程序的ID。 我正在寻找你给的链接,谢谢你的回应。 –

+0

@DanielSzymatowicz你应该尝试一下,然后我们可以帮助你。无论如何,你需要一个功能,而不是一个存储过程。 – Kermit

+0

你给的答案可能也是我的答案,我会检查一下。 –

0

谢谢@andreshernandez为此,这是我以前没有想到的,但它很好用!我正在写在这里,因为我不能用'

格式文本这是使用你的代码我的存储功能:

DELIMITER $$ 
    CREATE FUNCTION sampleFunc9(lat DOUBLE, lng DOUBLE) 
    RETURNS INT 
    DETERMINISTIC 
    BEGIN 
    DECLARE result DOUBLE; 
    SET result = (SELECT iddriver FROM driver ORDER BY (driverpoint_lat - lat) * (driverpoint_lat - lat) + (driverpoint_lng - lng) * (driverpoint_lng - lng) ASC LIMIT 1); 
    return result; 
    END $$