枚举值没有在mysql表中更新?

时间:2013-03-09 14:42:28

标签: php mysql

我正在使用此脚本更新到我的表中的列。

第一列'close_account'是枚举值'0'或'1',它们在我的数据库中显示为单选框。

第二列'account_status'是枚举值'Active'或'Deactivated',这在我的数据库中显示为下拉框列表。

在这种情况下,我不确定它们是下拉盒还是收音机盒的事实。

但我的问题是我试图通过运行以下mysql查询来更新close_account和account_status,close_account需要更新为'1'而account_status应更新为'Deactivated'。目前由于某种原因只有'close_account'正在更新但不是account_status有人可以告诉我为什么?

感谢。

<? ob_start(); ?>
<?php

require_once('includes/session.php');
require_once('includes/functions.php');
require('includes/_config/connection.php');

session_start();

    confirm_logged_in();

    if (isset ($_GET['to'])) {
    $user_to_id = $_GET['to'];


}


if (!isset($_GET['to']))
    exit('No user specified.');

$user_id = $_GET['to'];


$result = mysql_query("SELECT * FROM ptb_users WHERE user_id ='".$_SESSION['user_id']."' ");

if($result) 
{ 
mysql_query("UPDATE ptb_users SET close_account='1' WHERE user_id=".$_SESSION['user_id']."") 
or die(mysql_error());

mysql_query("UPDATE ptb_users SET account_status='Deactivated' WHERE user_id=".$_SESSION['user_id']."") 
or die(mysql_error());

header("Location: dashboard.php");

}
?>
<? ob_flush(); ?>

2 个答案:

答案 0 :(得分:3)

对枚举数据使用数值总是令人困惑。特别是当枚举数据与枚举索引值重叠时。

在您的情况下,显然1枚举数据被解释为枚举索引(数字)。将字符串用于枚举数据,以获得更好的可读性和用法。

考虑一个例子:

DROP TABLE enum_tb;

CREATE TABLE enum_tb (size ENUM('x-small', 'small', 'medium', 'large', 'x-large') NOT NULL);

INSERT INTO enum_tb
VALUES ('x-small'), (2), ('5');

SELECT * FROM enum_tb;

输出:

mysql> select * from enum_tb;
+---------+
| size    |
+---------+
| x-small |
| small   |
| x-large |
+---------+
3 rows in set (0.00 sec)

令人惊讶?

MySQL在传递索引时存储实际的枚举值。枚举索引从1开始,在上面的情况下,索引2small。此外,'5'被视为x-large的索引。

答案 1 :(得分:1)

解决此类问题的系统方法是首先将问题隔离到PHP或数据库。最简单的方法是在不使用PHP的情况下直接访问数据库。使用MySQL命令行实用程序(mysql),或使用phpmyadmin等图形工具。

使用其中一个工具连接到测试数据库。 (不是您的生产数据库。始终执行安全测试。)从SQL提示符运行此查询。

UPDATE ptb_users 
SET close_account='1', 
    account_status = 'Deactivated'
WHERE user_id = somenumber

somenumber替换为实际的现有用户ID号。

话虽如此,枚举成为一个数字是不寻常的。如果像这样声明枚举,那么很多感觉就好了。

create table foo (
  user_id integer not null,
  bar enum('0', '1')
);

这样的事情更为常见。

create table foo (
  user_id integer not null,
  bar enum('open', 'closed')
);

要更新此类枚举,请使用字符串值。

update foo
set bar = 'closed'
where user_id = somenumber and bar = 'open';

再次,将一些数字替换为实际的用户ID号。