php实现取款功能
数据库设计
创建一个包含用户账户信息的表,至少包含字段:id(主键)、user_id(用户ID)、balance(账户余额)、updated_at(更新时间)。
CREATE TABLE accounts (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
balance DECIMAL(10, 2) DEFAULT 0.00,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
取款逻辑实现
通过PHP处理用户取款请求,需验证余额是否充足并更新数据库。

<?php
// 假设已建立数据库连接 $pdo
function withdrawMoney($userId, $amount) {
$pdo->beginTransaction();
try {
// 检查账户余额
$stmt = $pdo->prepare("SELECT balance FROM accounts WHERE user_id = ? FOR UPDATE");
$stmt->execute([$userId]);
$account = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$account) {
throw new Exception("账户不存在");
}
if ($account['balance'] < $amount) {
throw new Exception("余额不足");
}
// 更新余额
$updateStmt = $pdo->prepare("UPDATE accounts SET balance = balance - ? WHERE user_id = ?");
$updateStmt->execute([$amount, $userId]);
// 记录交易(可选)
$txnStmt = $pdo->prepare("INSERT INTO transactions (user_id, amount, type) VALUES (?, ?, 'withdrawal')");
$txnStmt->execute([$userId, $amount]);
$pdo->commit();
return true;
} catch (Exception $e) {
$pdo->rollBack();
return $e->getMessage();
}
}
?>
安全性处理
防止SQL注入和并发问题:

- 使用预处理语句绑定参数
- 事务处理确保数据一致性
FOR UPDATE锁定行防止并发修改
前端交互示例
HTML表单提交取款请求:
<form action="withdraw.php" method="post">
<input type="hidden" name="user_id" value="123">
<label>取款金额:<input type="number" name="amount" min="0.01" step="0.01"></label>
<button type="submit">提交</button>
</form>
错误处理
返回友好的错误信息给用户:
$result = withdrawMoney($_POST['user_id'], $_POST['amount']);
if ($result === true) {
echo "取款成功";
} else {
echo "取款失败:" . htmlspecialchars($result);
}






