Come definire il tipo di variabile in PDOStatement :: bindValue ()?
-
27-10-2019 - |
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?
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 ??strong>
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 ??strong>
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 / p>
$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.