¿El valor de enumeración no se actualiza en la tabla mysql?

estoy usando este script para actualizar las columnas en mi tabla.

la primera columna 'close_account' es un valor de enumeración '0' o '1' y estos aparecen como cuadros de radio en mi base de datos.

la segunda columna 'account_status' es un valor de enumeración 'Activo' o 'Desactivado' y esto aparece como una lista desplegable en mi base de datos.

No estoy seguro de si el hecho de que sean un cuadro desplegable o cuadros de radio importa en este caso.

sin embargo, mi problema es que estoy tratando de actualizar close_account y account_status ejecutando la siguiente consulta mysql, close_account necesita actualizarse a '1' y account_status debería actualizarse a 'Desactivado'. en este momento, por alguna razón, solo se está actualizando 'close_account' pero no account_status. ¿Puede alguien decirme por qué?

Gracias.

<? 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(); ?>

preguntado el 09 de marzo de 13 a las 14:03

Sabe que puede actualizar más de una columna a la vez en un UPDATE ¿declaración? "UPDATE ptb_users SET close_account='1', account_status='Deactivated' WHERE user_id=".$_SESSION['user_id'] - también, inspeccione el valor de mysql_error(), si una consulta no se ejecuta correctamente, hay muchas posibilidades de que esto le diga qué salió mal. Veo que se está muriendo con este mensaje, ¿le muestra algo? -

¿Qué sucede si descarga el texto de consulta de la página y lo ejecuta manualmente? -

También por favor, no uses mysql_* funciones en código nuevo. Ya no se mantienen y están oficialmente en desuso. Consulte las caja roja? Aprender acerca declaraciones preparadas en su lugar, y usa PDO or MySQLi - este artículo le ayudará a decidir cuál. Si elige DOP, aquí hay un buen tutorial. -

los valores numéricos enumerados son confusos. ¿Puedes probar lo que sucede cuando SET close_account='2' para una cuenta? ¿almacena close_account='1'? -

Primera pregunta aquí, por favor lea qué hacer cuando obtienes respuestas. -

2 Respuestas

Usar valores numéricos para datos enumerados siempre es confuso. Especialmente cuando los datos enumerados se superponen con los valores de índice de enumeración.

en tu caso aparentemente 1 enum-data se interpretó como enum-index (numérico). Utilice cadenas para datos de enumeración en su lugar para mejorar la legibilidad y el uso.

Considere un ejemplo:

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;

Salida:

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

¿sorprendente?

MySQL almacena los valores de enumeración reales cuando se pasa el índice. Los índices de enumeración comienzan desde 1 y en el índice de casos anterior 2 is small. también '5' fue considerado como índice de x-large.

respondido 09 mar '13, 15:03

La forma sistemática de abordar problemas como este es aislar primero el problema en PHP o en la base de datos. La forma más fácil de hacerlo es ir directamente a la base de datos sin usar PHP. Utilice la utilidad de línea de comandos de MySQL (mysql), o use una herramienta gráfica como phpmyadmin.

Utilice una de esas herramientas para conectarse a su base de datos de prueba. (No es su base de datos de producción. Practique siempre pruebas seguras). Ejecute esta consulta desde un indicador de SQL.

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

Reemplaza somenumber con un número de identificación de usuario real y existente.

Habiendo dicho eso, es inusual que una enumeración sea un número. no hace mucho más tiene sentido tener una enumeración declarada como esta.

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

Algo así es mucho más común.

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

Para actualizar dicha enumeración, use los valores de cadena.

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

Nuevamente, reemplace algún número con un número de identificación de usuario real.

respondido 09 mar '13, 14:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.