Hola, somos Arume

Desarrollamos páginas web, aplicaciones para móviles, capas de realidad aumentada y aplicaciones para Facebook. Nos apasiona la informática y somos unos perfeccionistas incurables; por eso en nuestros proyectos utilizamos estándares.

tel. 625 519 694

Mendaña de Neyra, 34, 3º B, 15008, A Coruña

Autenticarse

Registrarse. ¿Has olvidado tu contraseña?

Etiquetas

Saltar las etiquetas

Suscríbete a las RSS

Estás en:

  • Inicio >
  • Blog >
  • mssql_bind convierte las cadena vacías en nulos

mssql_bind convierte las cadena vacías en nulos

17 Ago 2011 por Luis

Comentarios: 1

PHP + SQL Server

mssql_bind es una función de PHP que sirve para enviar parámetros a procedimientos almacenados (stored procedures) en Microsoft SQL Server. Con ella podemos enviar al procedimiento almacenado todo tipo de variables: enteros, reales, cadenas, ... y, si es necesario, nulos. Pero esta función tiene un problema y, cuando intentas pasarle una cadena vacía como parámetro al procedimiento almacenado, mssql_bind lo convierte en nulo, lo cual puede provocar errores si ese parámetro no acepta nulos.

mssql_bind tiene seis posibles parámetros:

mssql_bind($stmt, $nombre_param, $valor_param, $tipo, $es_salida, $es_nulo, $caracteres);
  1. $stmt: recurso devuelto por mssql_init()
  2. $nombre_param: nombre del parámetro en el procedimiento almacenado
  3. $valor_param: valor del parámetro a enviar al procedimiento almacenado
  4. $tipo: tipo de dato del parámetro (SQLTEXT, SQLVARCHAR, SQLCHAR, SQLINT1, SQLINT2, SQLINT4, SQLBIT, SQLFLT4, SQLFLT8, SQLFLTN)
  5. $es_salida: si este parámetro será modificado y reenviado por el procedimiento almacenado (por defecto: falso)
  6. $es_nulo: si enviar un valor nulo al procedimiento almacenado (por defecto: falso). Esta es la forma de enviar valores nulos. Poner null en $valor_param no funcionará.
  7. $caracteres: para valores de tipo SQLVARCHAR o SQLCHAR, el tamaño del campo como está declarado en el procedimiento almacenado (por defecto: -1)

Una vez visto esto, se supone que la única forma de enviar nulos al procedimiento almacenado sería poniendo el parámetro $es_nulo a true, pero el error del que estamos hablando, hace que una instrucción como esta también envíe un nulo:

mssql_bind($stmt, '@param_1', '', SQLVARCHAR, false, false, 10);

Solución (parche, en realidad)

Para poder enviar cadenas vacías a los procedimientos almacenados con mssql_bind, podemos hacer lo siguiente:

mssql_bind($stmt, '@param_1', ' ', SQLVARCHAR, false, false, 0);

Atención al valor del parámetro: no es cadena vacía sino un espacio.

La solución se basa en enviar al procedimiento almacenado un valor que no sea cadena vacía (por ejemplo, un espacio) para que la función no lo convierta en nulo, pero decirle que el tamaño del parámetro es cero, de forma que coja una cadena de cero caracteres (o cadena vacía).

Comentarios

1 comentarios. Comentar.

1. diegofc84 el 06 Nov 2011 a las 19:08:24

Excelente y rápida solución. Gracias.

Comentar

Comentar de forma anónima

Puedes comentar poniendo cualquier nombre o apodo, exceptuando los nombres de usuarios registrados. Máximo de 50 caracteres.

Comentar como usuario registrado

Registrarse. ¿Has olvidado tu contraseña?