You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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)
1btc34
2usdt42
3dodge42
4xrp42
5ltc42
6eth42
7bnb42
8solona42

错误原因

你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:57:21