php实现网约车代码
以下是一个基于PHP的网约车系统核心功能实现示例,包含关键模块的代码片段:

数据库设计
创建MySQL数据库表结构:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
password VARCHAR(255) NOT NULL,
user_type ENUM('driver', 'passenger') NOT NULL,
current_lat DECIMAL(10, 8),
current_lng DECIMAL(11, 8)
);
CREATE TABLE rides (
id INT AUTO_INCREMENT PRIMARY KEY,
passenger_id INT NOT NULL,
driver_id INT,
start_lat DECIMAL(10, 8) NOT NULL,
start_lng DECIMAL(11, 8) NOT NULL,
end_lat DECIMAL(10, 8) NOT NULL,
end_lng DECIMAL(11, 8) NOT NULL,
status ENUM('requested', 'accepted', 'completed', 'cancelled') DEFAULT 'requested',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (passenger_id) REFERENCES users(id),
FOREIGN KEY (driver_id) REFERENCES users(id)
);
用户注册与登录
// 用户注册
function registerUser($username, $password, $userType) {
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
$stmt = $pdo->prepare("INSERT INTO users (username, password, user_type) VALUES (?, ?, ?)");
return $stmt->execute([$username, $hashedPassword, $userType]);
}
// 用户登录
function loginUser($username, $password) {
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);
$user = $stmt->fetch();
if ($user && password_verify($password, $user['password'])) {
$_SESSION['user_id'] = $user['id'];
$_SESSION['user_type'] = $user['user_type'];
return true;
}
return false;
}
行程请求处理
// 乘客发起行程请求
function requestRide($passengerId, $startLat, $startLng, $endLat, $endLng) {
$stmt = $pdo->prepare("INSERT INTO rides (passenger_id, start_lat, start_lng, end_lat, end_lng) VALUES (?, ?, ?, ?, ?)");
$stmt->execute([$passengerId, $startLat, $startLng, $endLat, $endLng]);
return $pdo->lastInsertId();
}
// 司机接单
function acceptRide($driverId, $rideId) {
$stmt = $pdo->prepare("UPDATE rides SET driver_id = ?, status = 'accepted' WHERE id = ? AND status = 'requested'");
return $stmt->execute([$driverId, $rideId]);
}
位置更新与匹配
// 更新用户位置
function updateLocation($userId, $lat, $lng) {
$stmt = $pdo->prepare("UPDATE users SET current_lat = ?, current_lng = ? WHERE id = ?");
return $stmt->execute([$lat, $lng, $userId]);
}
// 查找附近司机
function findNearbyDrivers($lat, $lng, $radius = 5) {
$stmt = $pdo->prepare("SELECT id, username, (6371 * acos(cos(radians(?)) * cos(radians(current_lat)) * cos(radians(current_lng) - radians(?)) + sin(radians(?)) * sin(radians(current_lat)))) AS distance FROM users WHERE user_type = 'driver' HAVING distance < ? ORDER BY distance");
$stmt->execute([$lat, $lng, $lat, $radius]);
return $stmt->fetchAll();
}
价格计算
function calculateFare($startLat, $startLng, $endLat, $endLng, $baseFare = 5, $perKm = 1.5) {
// 使用Haversine公式计算距离(km)
$earthRadius = 6371;
$latDiff = deg2rad($endLat - $startLat);
$lngDiff = deg2rad($endLng - $startLng);
$a = sin($latDiff/2) * sin($latDiff/2) + cos(deg2rad($startLat)) * cos(deg2rad($endLat)) * sin($lngDiff/2) * sin($lngDiff/2);
$c = 2 * atan2(sqrt($a), sqrt(1-$a));
$distance = $earthRadius * $c;
return $baseFare + ($distance * $perKm);
}
安全注意事项
- 所有数据库操作应使用预处理语句防止SQL注入
- 密码必须加密存储
- 敏感API端点需要身份验证
- 实现输入验证和过滤
- 考虑使用HTTPS传输数据
实际开发中还需要考虑:
- 支付系统集成
- 实时通信(WebSocket)
- 司机评分系统
- 行程历史记录
- 移动端API接口
完整实现需要根据具体业务需求扩展上述基础功能。







