【问题标题】:How to update data as null in mysql using php loop?如何使用php循环在mysql中将数据更新为null?
【发布时间】:2017-05-21 22:12:38
【问题描述】:

我有一个名为 users 的表,其中包含一个名为 user_subs 的列。看起来像这样。

在 user_subs 中我存储了特定的用户会话用户名。假设这个特定的用户名为 James。

现在我将如何遍历特定的 user_subs 来寻找“James”并将他从特定的 user_subs 中删除而不删除所有其他名称。

这是我目前所拥有的,唯一的问题是,它删除了 user_subs 中的所有用户名,而不仅仅是“James”。

if(isset($_GET['p_id'])) {
  $the_post_id = $_GET['p_id'];
  $the_post_author = $_GET['author'];
}

if(isset($_POST['delete_sub'])) {
  $username = $_SESSION['username'];

  $query = "SELECT user_subs FROM users WHERE username = '{$username}' ";
  $select_users_by_id = mysqli_query($connection, $query); 

  while ($row = mysqli_fetch_array($select_users_by_id)) {
    $user_subs = explode(',', $row['user_subs']);

    foreach($user_subs as $out) {

      $query = "UPDATE users SET user_subs = null WHERE username = '{$the_post_author}' ";

       $unsubscribe_user = mysqli_query($connection, $query);

       echo "Unsubscribed";
    }
  }
}

这只是在测试中,准备好的声明将在上线前使用

感谢您的宝贵时间。

【问题讨论】:

  • 您要覆盖该行还是删除它?
  • 理想情况下,您可能会将用户 subs 放在另一个表中,并且只删除特定的人。否则,您必须解析该数据,删除不需要的数据并将其余数据放回原处。
  • @tereško 好吧,如果您使用 delete,它将删除整个列,这就是您必须使用 update 和 null 的原因
  • 您是否检查过此列可以包含NULL 值?有可能,该表是在 user_subs 列上使用 NOT NULL 约束创建的。
  • 您的第一个查询完全没有必要。其实适得其反!

标签: php mysql database mysqli


【解决方案1】:

我同意其他用户关于将此列移至其他表格的评论。同时,如果您想实现您的要求,您可以尝试从列值中删除用户名并使用剩余的文本进行更新。

if(isset($_POST['delete_sub'])) {
  $username = $_SESSION['username'];

  $query = "SELECT user_subs FROM users WHERE username = '{$username}' ";
  $select_users_by_id = mysqli_query($connection, $query); 

  while ($row = mysqli_fetch_array($select_users_by_id)) {
    $user_subs = str_replace($username . ',', '', $row['user_subs']);

$query = "UPDATE users SET user_subs = '{$user_subs}' WHERE username = '{$the_post_author}' ";

       $unsubscribe_user = mysqli_query($connection, $query);
       echo "Unsubscribed";

  }
}

OPTION-2

$user_subs = explode(',', $row['user_subs']);
$user_subs_new = [];
foreach($user_subs as $out) {
    if ($out !== $username) {
        $user_subs_new[] = $out;
    }
}
$user_subs = implode(',',user_subs_new);
  $query = "UPDATE users SET user_subs = '{$user_subs}' WHERE username = '{$username}' ";

   $unsubscribe_user = mysqli_query($connection, $query);

   echo "Unsubscribed";
}

【讨论】:

  • 感谢您的回复,但它仍在删除所有名称
  • 可以在查询前打印$user_subs吗?
  • 如果我打印 $user_subs 什么都不会打印,但如果我打印 $row 它会输出“array”
  • 查看$row['user_subs'] 中的内容以及$username 是否与其中的任何值匹配。我没有在您的表结构中看到用户名,因此不确定它是否与 user_subs 列中的内容完全相同。您最好的选择是尝试在每一步打印这些变量中的每一个的值,以了解缺少的内容。我的答案背后的想法是从数据库中获取给定用户的 user_subs 值,并使用 php 更新该字符串以删除您不需要的任何内容,然后使用更新查询为该用户设置新的 user_subs 字符串。跨度>
  • 是的,我明白你想要做什么,我很欣赏不同的方法。对于我上面的代码,如果我在它输出的爆炸线之后 var_dump $user_subs -- array(3) { [0]=> string(6) "BSmyth" [1]=> string(5) "James" [2]= > string(5) "Sally" } 所以它似乎在循环。是的,用户名在左边一点,它等于 user_subs 中的内容。
【解决方案2】:

让我们重新开始。让我们从这里开始,事实上......

DROP TABLE IF EXISTS users;

CREATE TABLE users
(user_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,email VARCHAR(20) NOT NULL UNIQUE
);

DROP TABLE IF EXISTS user_subs;

CREATE TABLE user_subs
(user_id INT NOT NULL
, sub_id INT NOT NULL
, active TINYINT NOT NULL DEFAULT 1
, PRIMARY KEY(user_id,sub_id)
);

INSERT INTO users VALUES 
(1,'b.smyth634@gmail.com'),
(2,'james@gmail.com'),
(3,'f@gmail.com'),
(4,'sally@gmail.com'),
(5,'thomas@gmail.com');

INSERT INTO user_subs (user_id,sub_id) VALUES
(1,5),
(1,2),
(1,1),
(1,4),
(2,1),
(2,2),
(2,4);


SELECT * FROM users;
+---------+----------------------+
| user_id | email                |
+---------+----------------------+
|       1 | b.smyth634@gmail.com |
|       2 | james@gmail.com      |
|       3 | f@gmail.com          |
|       4 | sally@gmail.com      |
|       5 | thomas@gmail.com     |
+---------+----------------------+

SELECT * FROM user_subs;
+---------+--------+--------+
| user_id | sub_id | active |
+---------+--------+--------+
|       1 |      5 |      1 |
|       1 |      2 |      1 |
|       1 |      1 |      1 |
|       1 |      4 |      1 |
|       2 |      1 |      1 |
|       2 |      2 |      1 |
|       2 |      4 |      1 |
+---------+--------+--------+

SELECT u.*
     , GROUP_CONCAT(us.sub_id) subs 
  FROM users u 
  JOIN user_subs us 
    ON us.user_id = u.user_id 
 GROUP 
    BY u.user_id;
+---------+----------------------+---------+
| user_id | email                | subs    |
+---------+----------------------+---------+
|       1 | b.smyth634@gmail.com | 1,2,4,5 |
|       2 | james@gmail.com      | 1,2,4   |
+---------+----------------------+---------+

从这里我们有一个选择。我们可以DELETE我们不再希望考虑的订阅者,或者干脆UPDATE他们为“不活跃”。

无论哪种方式,我们只需要DELETEUPDATE。所以不需要SELECT。事实上,正如我所提到的,SELECT 会适得其反——因为用户可能会在执行SELECT 和执行UPDATE/DELETE 之间修改数据集。这被称为“竞争条件”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多