如何使用PHP PDO语句更新wallet表中多行的不同值?
问题:无法正确更新多行钱包地址数据
尝试更新多行钱包数据时失败,使用UPDATE语句的方式有误,错误代码如下:
$sql3 = "UPDATE wallet SET btc = :btc, usdt = :usdt, dodge = :dodge, xrp = :xrp, ltc = :ltc, eth = :eth, bnb = :bnb, solona = :solona "; $stmt3 = $pdo->prepare($sql3); $stmt3->execute(array( ':btc' => $_POST['btc'], ':usdt' => $_POST['usdt'], ':dodge' => $_POST['dodge'], ':xrp' => $_POST['xrp'], ':ltc' => $_POST['ltc'], ':eth' => $_POST['eth'], ':bnb' => $_POST['bnb'], ':solona' => $_POST['solona'] ));
对应的wallet表结构:
| 钱包ID(wallet_id) | 名称(name) | 地址(address) |
|---|---|---|
| 1 | btc | 34 |
| 2 | usdt | 42 |
| 3 | dodge | 42 |
| 4 | xrp | 42 |
| 5 | ltc | 42 |
| 6 | eth | 42 |
| 7 | bnb | 42 |
| 8 | solona | 42 |
错误原因
你的SQL逻辑完全错误:你试图更新btc、usdt这类不存在的列,但实际表结构中,每个币种对应一行数据——name字段存储币种标识,address才是需要更新的字段。正确逻辑应该是根据name匹配每行,更新对应的address值。
解决方案
方案1:循环逐个更新(简单直观,适合少量数据)
遍历币种列表,逐个执行UPDATE语句:
// 定义需要更新的币种列表 $currencies = ['btc', 'usdt', 'dodge', 'xrp', 'ltc', 'eth', 'bnb', 'solona']; // 预编译通用更新语句 $sql = "UPDATE wallet SET address = :address WHERE name = :name"; $stmt = $pdo->prepare($sql); // 遍历执行更新 foreach ($currencies as $currency) { if (isset($_POST[$currency])) { $stmt->execute([ ':address' => $_POST[$currency], ':name' => $currency ]); } }
方案2:批量更新(减少数据库请求,效率更高)
用SQL的CASE语句一次性完成所有行更新,降低数据库交互次数:
$currencies = ['btc', 'usdt', 'dodge', 'xrp', 'ltc', 'eth', 'bnb', 'solona']; $caseParts = []; $params = []; // 构建CASE分支和参数数组 foreach ($currencies as $currency) { if (isset($_POST[$currency])) { $caseParts[] = "WHEN name = :name_{$currency} THEN :addr_{$currency}"; $params[":name_{$currency}"] = $currency; $params[":addr_{$currency}"] = $_POST[$currency]; } } // 有需要更新的字段时才执行SQL if (!empty($caseParts)) { // 构建IN条件的参数占位符 $inPlaceholders = implode(', ', array_map(function($c) { return ":name_{$c}"; }, array_keys(array_filter($_POST, function($k) use ($currencies) { return in_array($k, $currencies); }, ARRAY_FILTER_USE_KEY)))); $sql = "UPDATE wallet SET address = CASE " . implode(' ', $caseParts) . " END WHERE name IN ({$inPlaceholders})"; $stmt = $pdo->prepare($sql); $stmt->execute($params); }
内容的提问来源于stack exchange,提问作者Hades_says
相关产品推荐
相关产品推荐

