Foros del Web » Programando para Internet » PHP »

Insertar valores NULL en BD MySQL

Estas en el tema de Insertar valores NULL en BD MySQL en el foro de PHP en Foros del Web. Hola a todos, tengo un problemilla que no consigo resolver. Lo he buscado por aquí pero es que la solución que la gente suele hacer ...
  #1 (permalink)  
Antiguo 26/08/2006, 13:24
Avatar de dayer  
Fecha de Ingreso: febrero-2004
Mensajes: 142
Antigüedad: 13 años, 9 meses
Puntos: 0
Insertar valores NULL en BD MySQL

Hola a todos, tengo un problemilla que no consigo resolver. Lo he buscado por aquí pero es que la solución que la gente suele hacer es dejar ese campo "vacío", pero eso a mi no me vale (creo :).

Este script recibe valores de un formulario.
Código PHP:
<?PHP
include("config.php"); //de ahí es donde vienen los datos de conexión a la BD

$titulo $_POST['titulo'];
$autor $_POST['autor'];
$campo $_POST['campo'];
$mes $_POST['mes'];
$year $_POST['year'];
$idioma $_POST['idioma'];
$rev_lib $_POST['rev_lib'];
$ed $_POST['ed'];
$vol $_POST['vol'];
$num $_POST['num'];
$pags $_POST['pags'];
$cong_simp $_POST['cong_simp'];
$lugar $_POST['lugar'];
$issn $_POST['issn'];
$isbn $_POST['isbn'];
$keywords $_POST['keywords'];
$abstract $_POST['abstract'];
$resumen $_POST['resumen'];
$privado $_POST['privado'];
$aportador $_SESSION['nombre'];
$fecha;

if(
get_magic_quotes_gpc==0){
    
$titulo addslashes($titulo);
    
$autor addslashes($autor);
    
$rev_lib addslashes($rev_lib);
    
$ed addslashes($ed);
    
$vol addslashes($vol);
    
$cong_simp addslashes($cong_simp);
    
$lugar addslashes($lugar);
    
$abstract addslashes($abstract);
    
$resumen addslashes($resumen);
    }
    
if(empty(
$titulo)) $titulo NULL;
if(empty(
$autor)) $autor NULL;
if(empty(
$campo)) $campo NULL;
    else 
$campo settype($campo,"INT");
if(empty(
$mes)) $mes NULL;
    else 
$mes settype($mes,"INT");
if(empty(
$year)) $year NULL;
if(empty(
$idioma)) $idioma NULL;
    else 
$idioma settype($idioma,"INT");
if(empty(
$rev_lib)) $rev_lib NULL;
if(empty(
$ed)) $ed NULL;
if(empty(
$vol)) $vol NULL;
if(empty(
$num)) $num NULL;
if(empty(
$pags)) $pags NULL;
if(empty(
$cong_simp)) $cong_simp NULL;
if(empty(
$lugar)) $lugar NULL;
if(empty(
$issn)) $issn NULL;
if(empty(
$isbn)) $isbn NULL;
if(empty(
$keywords)) $keywords NULL;
if(empty(
$abstract)) $abstract NULL;
if(empty(
$resumen)) $resumen NULL;
if(empty(
$privado)) $privado 0;
    else 
$privado 1;
$fecha date("Y-m-d");

$articulos mysql_pconnect($db_host$db_user$db_pwd) or trigger_error(mysql_error(),E_USER_ERROR);
mysql_select_db($database$articulos);

$valores =  "NULL ,'".$titulo."',NULL, '".$autor."','".$campo."','".$mes."','".$year."','".$idioma."','".$rev_lib."','".$ed."','".$vol."','".$num."','".$pags."','".$cong_simp."','".$lugar."','".$issn."','".$isbn."','".$keywords."','".$abstract."','".$resumen."','".$privado."','".$aportador."','".$fecha."'";

$query "INSERT INTO articulos (id, titulo, url, autor, campo_id, mes, year, idioma, rev_lib, ed, vol, num, pags, cong_simp, lugar, issn, isbn, keywords, abstract, resumen, privado, aportador, fecha) VALUES (".$valores.")";

$resultado mysql_query($query,$articulos) OR die(mysql_error());

if(
$resultado) echo '<br>'.mysql_affected_rows().' art&iacute;culo insertado en la base de datos.';


?>
El código es muy optimizable, pero lo que me sucede no creo que tenga que ver con eso.

La tabla en cuestión:
Código:
CREATE TABLE `articulos` (
  `id` mediumint(9) NOT NULL auto_increment COMMENT 'identificador',
  `titulo` tinytext collate utf8_spanish2_ci COMMENT 'titulo',
  `url` tinytext collate utf8_spanish2_ci,
  `autor` tinytext collate utf8_spanish2_ci,
  `campo_id` tinyint(4) default NULL COMMENT 'campo del articulo',
  `mes` tinyint(4) default NULL,
  `year` year(4) default NULL,
  `idioma` tinyint(4) default NULL,
  `rev_lib` tinytext collate utf8_spanish2_ci,
  `ed` tinytext collate utf8_spanish2_ci,
  `vol` tinyint(4) default NULL,
  `num` tinyint(4) default NULL,
  `pags` smallint(6) default NULL,
  `cong_simp` tinytext collate utf8_spanish2_ci,
  `lugar` tinytext collate utf8_spanish2_ci,
  `issn` tinytext collate utf8_spanish2_ci,
  `isbn` tinytext collate utf8_spanish2_ci,
  `keywords` tinytext collate utf8_spanish2_ci,
  `abstract` tinytext collate utf8_spanish2_ci,
  `resumen` text collate utf8_spanish2_ci,
  `privado` binary(1) default '0',
  `aportador` tinytext collate utf8_spanish2_ci,
  `fecha` date default NULL,
  PRIMARY KEY  (`id`),
  KEY `mes` (`mes`),
  KEY `year` (`year`),
  KEY `idioma` (`idioma`),
  KEY `privado` (`privado`),
  KEY `fecha` (`fecha`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci AUTO_INCREMENT=17 ;
Entonces el problema me viene con cuando hay un campo del formulario que no se rellena, como por ejemplo el correspondiente a "mes". En este caso el script recibe el valor de "mes", y como está vacío lo pone a NULL. Pero claro, luego recibo este error:
Código:
Incorrect integer value: '' for column 'mes' at row 1
que creo que se debe porque al poner $mes = NULL; lo que hace es vaciar el contenido de la variable y la base de datos necesita recibir un entero, para esecaso en concreto, o NULL. Y si hago $mes = "NULL"; también me da error pero diciéndome:
Código:
Incorrect integer value: 'NULL' for column 'mes' at row 1
Yo creo que el problema está en hacer algún apaño en el script para que si $mes tiene un contenido que se lo mande a la BD en la forma 'número' y que si no tiene nada se lo mande en la forma NULL, sin comillas, pero no se me ocurre nada muy concreto para hacerlo.

Agradecería alguna idea o si es un fallo tonto que alguien me lo comentara

Un saludo.
__________________
No Ðejes Para Mañana Monte Que Puedas Escalar Hoy
Cartagena
El Historias
  #2 (permalink)  
Antiguo 26/08/2006, 14:19
Avatar de bitbow  
Fecha de Ingreso: julio-2006
Ubicación: Distrito Federal
Mensajes: 635
Antigüedad: 11 años, 5 meses
Puntos: 34
De acuerdo Posible Solucion

En caso de que se el campo sea entero o double en lugar de asignarle NULL que tal si le asignas "0" asi si te lo debe aceptar a menos que esto afecte la forma en que utilizaras esa informacion despues.

Saludos.
__________________
El ego es el mayor enemigo de un hombre inteligente.
  #3 (permalink)  
Antiguo 26/08/2006, 14:32
Avatar de dayer  
Fecha de Ingreso: febrero-2004
Mensajes: 142
Antigüedad: 13 años, 9 meses
Puntos: 0
Muchas gracias por la rápida respuesta y como no por la solución, la he probado y me sirve a las mil maravillas, ya que además cualquiera de los campos de valores enteros si están a "0" no es un dato que sea válido, así que genial para luego identificar que es que no se han rellenado.

Un saludo
__________________
No Ðejes Para Mañana Monte Que Puedas Escalar Hoy
Cartagena
El Historias
  #4 (permalink)  
Antiguo 26/08/2006, 15:08
Avatar de juaniquillo
Colaborador
 
Fecha de Ingreso: noviembre-2005
Ubicación: San Juan, Puerto Rico
Mensajes: 5.745
Antigüedad: 12 años
Puntos: 281
sip, gracias tambien de mi parte. yo tambien tenia esa duda desde hace mucho tiempo.
__________________
Por fin.. tengo algo parecido a un blog
Y por lo visto ya estoy escribiendo...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 15:20.