【问题标题】:Using multiple where clauses to check two tables使用多个 where 子句检查两个表
【发布时间】:2019-08-29 01:07:49
【问题描述】:

所以我在一个 php 文件中有一个 sql 语句,它与从用户那里获取输入的表单相关。当他们输入一种类型时,它会更新该列中的所有记录,而不是他们选择的特定记录。

我得到的原始语句是第一个代码,但它编辑了整个列。所以我一直在尝试其他子句,所以它只改变了匹配的album_id但没有任何运气的子句。 Sample Table data

$sql = "UPDATE album 
    SET genre_id = (SELECT genre_id
    FROM genre
    WHERE genreName='" . $_POST['lstGenre'] . "'
    )";

以上是我开始并继续返回的内容。 Result from code above changes genre in entire column

$sql = "UPDATE album 
    SET genre_id = (SELECT genre_id
    FROM genre
    WHERE genreName='" . $_POST['lstGenre'] . "'
    )
        FROM album
        WHERE album_id='" . $_POST['album_id'] . "'";

这是我尝试过的一个版本,但它没有更新任何内容。 这就是我要找的: Different genre for each case

我解决了这个问题:

$sql = "UPDATE album 
        SET genre_id = (SELECT genre_id
        FROM genre
        WHERE genreName='" . $_POST['lstGenre'] . "'
        )
        FROM album
        WHERE album_id='" . $thisAlbum['album_id'] . "'";

【问题讨论】:

  • 您至少能解释一下缺少的内容,而不是仅仅发布。我已经解释了这个问题。显示了导致问题的代码以及我尝试解决问题的尝试之一。
  • 样本表数据和预期结果会有很大的改进。
  • 你应该阅读SQL injection
  • 用您正在使用的数据库标记您的问题!

标签: sql adminer


【解决方案1】:

几乎,但Update ... From ... Where ... 无效,您只需在第二部分中去掉 From 部分。应该是这样的

$sql = "UPDATE album 
SET genre_id = (SELECT genre_id
    FROM genre
    WHERE genreName='" . $_POST['lstGenre'] . "'
)
WHERE album_id='" . $_POST['album_id'] . "'";

编辑:另外,像这样的子查询只需要拉一行。确保流派表中没有多行与提供的流派名称匹配。虽然如果是这种情况,你应该会收到一个 sql 错误。

【讨论】:

  • 您是否遇到 sql 错误?您是否尝试过打印 $sql 字符串以确保 sql 语句实际上看起来像您期望的那样?
  • 不,我没有收到错误消息。我已经打印了它,它显示它正在获取所有正确的值,但它实际上并没有更新数据库。
【解决方案2】:

您的查询应如下所示:

UPDATE album a       
    SET genre_id = (SELECT g.genre_id
                    FROM genre g
                    WHERE g.genreName = ?
                   )
    WHERE a.album_id = ?;

?参数 的占位符。您应该使用参数将值传递给查询,而不是使用值修改查询字符串。

【讨论】:

  • 所以我这周学习了准备好的语句,所以从现在开始我将使用它。我是一名学生,所以当你发表评论时没有意识到这一点。
猜你喜欢
  • 2015-12-28
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多