【问题标题】:MySQL: Is it possible to CASE a FIELD on an UPDATE?MySQL:是否可以在 UPDATE 上设置字段?
【发布时间】:2017-12-20 07:19:06
【问题描述】:

所以我可能只是忽略了一些愚蠢的简单事情,但本质上我正在尝试通过 PHP 页面在 MySQL 中为 UPDATE 设置字段。我也运行了大量的 IF 语句,但似乎无法使其正常工作。

<?php
include('config.php');
$username = $_POST['username'];
$charName = $_POST['charName'];
//ID MARKS
$idMarks = $_POST['IDmarks'];
//EXPERIENCE
$EXP = $_POST['EXP'];

$sql = "UPDATE characters 
            SET CASE 
                WHEN idMarks1 IS NULL THEN idMarks1 = '$idMarks' 
                WHEN idMarks2 IS NULL THEN idMarks2 = '$idMarks' 
                WHEN idMarks3 IS NULL THEN idMarks3 = '$idMarks' 
                WHEN idMarks4 IS NULL THEN idMarks4 = '$idMarks' 
                WHEN idMarks5 IS NULL THEN idMarks5 = '$idMarks' 
                WHEN idMarks6 IS NULL THEN idMarks6 = '$idMarks' 
                WHEN idMarks7 IS NULL THEN idMarks7 = '$idMarks' 
                WHEN idMarks8 IS NULL THEN idMarks8 = '$idMarks' 
                WHEN idMarks9 IS NULL THEN idMarks9 = '$idMarks' 
                WHEN idMarks10 IS NULL THEN idMarks10 = '$idMarks' 
                WHEN idMarks11 IS NULL THEN idMarks11 = '$idMarks' 
                WHEN idMarks12 IS NULL THEN idMarks12 = '$idMarks' 
                END

                totalEXP =  totalEXP + '$EXP', 
                remEXP =    remEXP + '$EXP'

            WHERE charName = '$charName' AND username = '$username';
        ";

if ($conn->query($sql) === TRUE) {
header("Location: ../lead.php");
} else {
    echo "Error updating record: " . $conn->error;
}
?>

这里的想法是更新会将新值 ($idMarks) 放在它找到的第一个空值中,然后滚动到下一个 EXP 列。由于我之前在 MySQL 上遇到的问题,我不能只使用一个数组,关键是 idMarks 列是一种流体,跟踪伤口,伤口愈合到疤痕或跛行,纹身是永久性的等等,这就是为什么它们是可调节的在另一页上。有人对如何实现这一点有任何想法吗?

【问题讨论】:

  • 实际上在测试中工作得很好,它滚动到一个 int 字段,但在文本字段中输入,因此它可以在其他地方解析
  • 从根本上说,这是一个糟糕的设计问题。每当您发现自己有枚举列时,警钟就应该开始响起。
  • 好的,如果我只是删除了其他列,我如何将多个值存储在 idMarks 中的一行上?
  • 您不会将它们存储在一行中。见规范化。

标签: php mysql sql-update case field


【解决方案1】:

你有 PHP,为什么要在 SQL 中做怪癖?

$error = false;
for($i=1; $i<12; $i++) {
    $sql = "UPDATE characters  SET idMarks$i = '$idMarks'"
        . " WHERE idMarks$i IS NULL AND charName = '$charName' AND username = '$username';";
    $sql2 = "UPDATE characters SET totalEXP =  totalEXP + '$EXP', remEXP =    remEXP + '$EXP'"
        . " WHERE charName = '$charName' AND username = '$username';";

    if ($conn->query($sql) !== TRUE) {
        $error = 'Failed with 1';
        break;
    } else if ($conn->query($sql2) !== TRUE) {
        $error = 'Failed with 2';
        break;
    }
}

 if (empty($error))
     header("Location: ../lead.php");

我将跳过“你从哪里得到那个糟糕的数据库方案”的问题,但仅此一项就应该使任何诸如“我想在一个请求中完成所有请求以“优化性能””的问题都不合理。

使用带有编号列的方案,您的 SQL 性能不会很好。 Normalization 优先,只有在极少数情况下您才需要非规范化。

【讨论】:

  • 目前无法正常工作,但我绝对认为您在这里有所作为!就像我说的那样,可能只是忽略了一些愚蠢的简单事情。谢谢...是的,您可能在数据库上是对的,但这只是一项正在进行的工作,也是我对任何如此复杂的事情的第一次尝试。事实是,我最初尝试将数组用于 idMarks,但一旦到了上传时间,我就无法终生使用它。无论哪种方式,仍在学习...钻石不是一天制成的
猜你喜欢
  • 2011-10-07
  • 2020-01-18
  • 1970-01-01
  • 2016-03-09
  • 2010-12-16
  • 2019-07-20
  • 2021-09-11
  • 2020-09-19
  • 1970-01-01
相关资源
最近更新 更多