Domanda

Il PDOStatement :: bindValue () Offerte metodo un modo per specificare il tipo di variabile legata:

PDOStatement :: bindValue ($ parametro, $ value [, $ data_type = PDO :: PARAM_STR ])

mi chiedo, qual è lo scopo di specificare il tipo di dati, mentre quando leaved di default (PARAM_STR) alla fine del database sarà in ogni caso il cast del valore per il tipo corretto prima di utilizzarlo?

Ad esempio, se si dispone di queste query su un campo INTEGER:

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

E si legano un numero intero in PHP, PDO per impostazione predefinita si legano come una stringa, che è equivalente come:

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

che funziona perfettamente, perché il database SQL (MySQL, almeno, io non sono veramente consapevoli di come dovrebbe funzionare su altri RDBMS) sa come convertire la parte posteriore stringa in un intero prima di utilizzarlo.

Quali sono i casi d'uso in cui sarebbe fare la differenza per i parametri digitati legati vs stringhe?

È stato utile?

Soluzione

Non sono un PDO-esperto, ma mi viene in mente un paio di scenarioes dove il parametro data_type è utile e persino necessario.

parametri uscita

Quando si definisce parametri di ingresso / uscita o uscita, è necessario fornire sia il tipo e la lunghezza del parametro di uscita previsto.

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

Esempio # 4

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

Esempio # 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 senza fusione implicita

Ha spiegato in un'altra risposta a questa domanda ...

Quando il parametro non è vincolato a dati calcinabili

banche dati anche con capacità di fusione non sarà sempre in grado di lanciare voi variabile correttamente.

Rif: per digitare fortemente parametri DOP

$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..."

Altri suggerimenti

Questo è principalmente per interagire con i database che richiedono corretta digitazione. Ad esempio, se si attiva la modalità rigorosa in MySQL, si otterrà gli errori (query non) invece di avvisi quando ci sono di tipo mancate corrispondenze.

Per impostazione predefinita, MySQL fa del suo meglio per convertire i dati in modo corretto. Ma se avete mai visto 0000-00-00 in un campo data, che è molto probabilmente il risultato di mysql cercando di convertire una stringa in una data e in mancanza. In modalità rigorosa, la query non riuscirebbe invece di cercare di convertire e utilizzare qualunque sia il risultato è.

Il parametro di tipo di dati a PDOStatement :: bindValue () non è molto utile. In sostanza:

  • Se gli si dice PDO :: PARAM_STR, si converte il valore in una stringa.
  • Se gli si dice PDO :: PARAM_INT e si passa un valore booleano, lo converte in un lungo.
  • Se gli si dice PDO :: PARAM_BOOL e si passa un lungo, lo converte in un valore booleano.

Nient'altro sembra essere convertito. Vedere qui per un rapido sguardo al codice sorgente e una piccola spiegazione meglio. Forse ancora più importante, PDO non sarà un'eccezione o produrre un errore se si passa i dati con un tipo che non corrisponde il tipo di dati che avete passato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top