Contamos con tu apoyo para extender nuestras secciones con relación a las ciencias informáticas.
Solución:
Ahí está el NULLIF()
función:
SELECT NULLIF(var, '');
Si var
tiene el valor en $2, obtienes NULL
en lugar de.
En el ejemplo reemplazo el vacío string: ''
con NULL
.
Hay sin vacío string para el tipo entero. Simplemente no es posible. Ya que NULLIF()
no puede cambiar el tipo de datos, debe desinfectar su entrada en PHP.
Si no definió un valor predeterminado de columna, también puede solo omite la columna en el INSERT
comando y se llenará con NULL
(que es el predeterminado DEFAULT
).
Compruebe si el parámetro está vacío en PHP y no incluya la columna en el INSERT
comando si lo es.
O usa el PHP literal NULO en cambio, como demuestra Quassnoi aquí.
El resto solo tiene sentido para string tipos
Para estar absolutamente seguronadie puede entrar en un vacío string Agrega un CHECK
restricción a la tabla:
ALTER TABLE tr_view
ADD CONSTRAINT tr_view_age_not_empty CHECK (age <> '');
Para evitar excepciones causado por esto, puede agregar un disparador que corrija la entrada automáticamente:
CREATE OR REPLACE FUNCTION trg_tr_view_avoid_empty()
RETURNS trigger AS
$func$
BEGIN
IF NEW.age = '' THEN
NEW.age := NULL;
END IF;
IF NEW.month = '' THEN
NEW.month := NULL;
END IF;
RETURN NEW;
END
$func$ LANGUAGE plpgsql
CREATE TRIGGER tr_view_avoid_empty
BEFORE INSERT OR UPDATE ON tr_view
FOR EACH ROW
WHEN (NEW.age = '' OR NEW.month = '')
EXECUTE PROCEDURE trg_tr_view_avoid_empty();
Mientras que la respuesta de Erwin sobre NULLIF
es increíbleno aborda su error de sintaxis.
Echemos un vistazo a la consulta:
$query="Insert Into tr_view(name,age,month,year) values (toDB($name),toDB($age),toDB($month),toDB($year))
Anteriormente definiste una función llamada toDB
. Lamentablemente, la sintaxis que está utilizando aquí es no cómo llamar a una función desde dentro de una comilla doble stringasí que los rizos y toDB(
los bits todavía se están pasando. Hay dos alternativas:
-
concatenación usando
.
:$query='insert Into tr_view(name,age,month,year) values (' . toDB($name) . ',' . toDB($age) . ',' . toDB($month) . ',' . toDB($year) . ')')
-
Puede interpolar un invocable variable entre comillas dobles string así:
$fn = 'toDB'; $query="Insert Into tr_view(name,age,month,year) values ($fn($name),$fn($age),$fn($month),$fn($year))";
El primero es claro y cuerdo, el segundo es vago para lo desconocido y francamente loco.
Sin embargo, aún no debería ensamblar una entrada como esta. Todavía puede ser vulnerable a los ataques de inyección SQL. Debería usar declaraciones preparadas con marcadores de posición parametrizados.
La extensión de Postgres utiliza pg_prepare
para esto. Tienen la clara ventaja de, por ejemplo, permitirle pasar un PHP null
en vez de tener que preocuparte por todo eso null-detección y cotización.
Si insistes en mantener toDB
como está, considere agregar uno de los pg_escape_
funciones, como pg_escape_string
a lo que construye cadenas entre comillas.
Recuerda algo, que te concedemos agregar una reseña .