El envío de valores vacíos con los resultados PDO en error

Tenemos algo así como la siguiente Declaración PDO que utilizamos para comunicarnos con una base de datos PostgreSQL 8.4.

$st = $db -> prepare("INSERT INTO Saba.Betriebskosten (personalkosten) VALUES(:kd_personalkosten)"); $st -> bindParam(':kd_personalkosten', $val['kd_personalkosten']); 

$ val [‘kd_personalkosten’] está vacío / nulo o contiene un valor doble. En el caso de que esté vacío / nulo, solo queremos insertar un valor vacío, pero recibimos el siguiente error:

 SQLSTATE[22P02]: Invalid text representation: 7 ERROR: invalid input syntax for type double precision: ''; 

Lo que significa que empty / null se convierte en una STRING vacía que no es compatible con el campo de precisión doble. ¿Cómo eludir este error?

me parece que el valor es “” (cadena vacía) que bindParam convierte a “” en la consulta SQL, y como personalkosten es del tipo Double, genera el error.

Esto debería solucionar este problema con el texto vacío para la conversión doble:

 $st -> bindParam(':kd_personalkosten', (float) $val['kd_personalkosten']); 

Si realmente desea insertar el valor NULL cuando la variable está vacía, debe hacer esto:

 $value = $val['kd_personalkosten']; if ($value === '' or $value === NULL) { $st->bindValue(':kd_personalkosten', NULL, PDO::PARAM_NULL); // note the bindValue() instead of bindParam() } else { $st->bindParam(':kd_personalkosten', $value); } 

Acerca de bindValue vs bindParam del manual php:

bindParam ()

Vincula una variable de PHP a un marcador de posición con nombre o signo de interrogación correspondiente en la statement de SQL que se utilizó para preparar la statement. A diferencia de PDOStatement :: bindValue (), la variable se enlaza como referencia y solo se evaluará en el momento en que se llame a PDOStatement :: execute ().

La mayoría de los parámetros son parámetros de entrada, es decir, parámetros que se utilizan de manera solo de lectura para generar la consulta. Algunos controladores admiten la invocación de procedimientos almacenados que devuelven datos como parámetros de salida, y algunos también como parámetros de entrada / salida que envían datos y se actualizan para recibirlos.

Básicamente bindValue le permite vincular un valor directo o constante, mientras que bindParam requiere una variable o referencia para pasar.