Pregunta

los PDostatement :: BindValue () El método ofrece una forma de especificar el tipo de variable límite:

PDostatement :: BindValue ($ parámetro, $ valor [, $ data_type = pdo :: param_str ] )

Me pregunto, ¿cuál es el propósito de especificar el tipo de datos, mientras que cuando se veía como predeterminado (PARAM_STR) Eventualmente la base de datos de todos modos arrojará el valor al tipo adecuado antes de usarlo?

Por ejemplo, si tiene estas consultas sobre un INTEGER campo:

INSERT INTO table (integerField) VALUES (?) ;
SELECT * FROM table WHERE integerField = ?  ;

Y une un entero en PHP, PDO lo vinculará por defecto como una cadena, que es equivalente como:

INSERT INTO table (integerField) VALUES ("1") ;
SELECT * FROM table WHERE integerField = "1"  ;

Eso funcionará sin problemas, porque la base de datos SQL (al menos MySQL, no soy realmente consciente de cómo funcionaría en otros RDBMS) sabe cómo convertir la cadena de nuevo a un entero antes de usarla.

¿Cuáles son los casos de uso en los que marcaría la diferencia con los parámetros escritos con un límite frente a las cadenas?

¿Fue útil?

Solución

No soy PDO-Expert, pero puedo pensar en algunos escenarios en los que el parámetro data_type es útil e incluso necesario.

Parámetros de salida

Cuando define los parámetros de salida o entrada/salida, debe proporcionar tanto el tipo como la longitud del parámetro de salida esperado.

Árbitro: http://www.php.net/manual/en/pdo.prepared-statements.php

Ejemplo #4

$stmt = $dbh->prepare("CALL sp_returns_string(?)");
$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); 

Ejemplo #5

$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
$value = 'hello';
$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); 

DBMS sin casting implícito

Explicado en otra respuesta a esta pregunta ...

Cuando el parámetro no está vinculado a los datos fundibles

Incluso las bases de datos con habilidades de lanzamiento no siempre podrán proyectar su variable correctamente.

Árbitro: ¿Razones para escribir parámetros fuertemente en PDO?

$limit = 1;

$dbh->prepare("SELECT * FROM items LIMIT :limit");
$dbh->bindParam(":limit", $limit, PDO::PARAM_STR); 
// Will throw "You have an error in your SQL syntax..."

Otros consejos

Eso es principalmente para interactuar con bases de datos que requieren una tipificación correcta. Por ejemplo, si habilita el modo estricto en MySQL, obtendrá errores (consultas fallidas) en lugar de advertencias cuando hay desajustes de tipo.

Por defecto, MySQL hace todo lo posible para convertir los datos correctamente. Pero si alguna vez ha visto 0000-00-00 en un campo de fecha, es muy probable que el resultado de MySQL intente convertir una cadena en una fecha y falla. En modo estricto, la consulta fallaría en lugar de tratar de convertir y usar cualquiera que sea el resultado.

El parámetro de tipo de datos para PDostatement :: bindValue () no es terriblemente útil. Esencialmente:

  • Si le dice pdo :: param_str, convierte su valor en una cadena.
  • Si lo dice pdo :: param_int y pasa un booleano, lo convierte en mucho.
  • Si lo dice pdo :: param_bool y lo pasa por mucho tiempo, lo convierte en un booleano.

Nada más parece convertirse. Ver aquí Para ver rápidamente el código fuente y una explicación un poco mejor. Quizás lo más importante es que PDO no lanzará una excepción ni producirá un error si pasa los datos con un tipo que no coincide con el tipo de datos que pasó.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top