PHP 7.4.22 Released!

SQLite3Stmt::bindValue

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SQLite3Stmt::bindValueLie la valeur d'un paramètre à une variable de déclaration

Description

public SQLite3Stmt::bindValue(string|int $param, mixed $value, int $type = SQLITE3_TEXT): bool

Lie la valeur d'un paramètre à une variable de déclaration.

Attention

Avant PHP 7.2.14 et 7.3.0, respectivement, une fois que la déclaration a été exécuté SQLite3Stmt::reset() doit être appelé pour pouvoir changer la valeur des paramètres liés.

Liste de paramètres

param

Soit une chaîne de caractères (pour les paramètres nommés) ou un entier (pour les paramètres positionnel) identifiant la variable de déclaration à laquelle la valeur doit être liée. Si un paramètre nommé ne débute pas avec un caractère "deux point" (:) ou un arobase (@), "deux point" (:) seront automatiquement préfixé. Les paramètres positionnels commencent avec 1.

value

La valeur à lier à la variable de déclaration.

type

Le type de données de la valeur à lier.

  • SQLITE3_INTEGER : La valeur est un entier signé, stocké sur 1, 2, 3, 4, 6, ou 8 octets, suivant la grandeur de la valeur.

  • SQLITE3_FLOAT : La valeur est un nombre à virgule flottante, stocké sur 8 octets.

  • SQLITE3_TEXT : La valeur est un texte, stocké en utilisant l'encodage de la base de données (UTF-8, UTF-16BE ou UTF-16-LE).

  • SQLITE3_BLOB : La valeur est un BLOB, stocké exactement de la façon dont il a été fourni.

  • SQLITE3_NULL : La valeur est la valeur NULL.

À partir de PHP 7.0.7, si type est omit, il est automatiquement détecté depuis le type de value : booléen et entier sont traités comme SQLITE3_INTEGER, nombre décimal comme SQLITE3_FLOAT, null comme SQLITE3_NULL et tous les autres comme SQLITE3_TEXT. Auparavant, si type était omit, il était par défaut SQLITE3_TEXT.

Note:

Si value est null, c'était toujours traité comme SQLITE3_NULL, peu importe le type fournie.

Valeurs de retour

Retourne true si la valeur a été liée à la variable de déclaration, ou false si une erreur survient.

Historique

Version Description
7.4.0 param supporte désormais la notation @param.

Exemples

Exemple #1 Exemple avec SQLite3Stmt::bindValue()

<?php
$db 
= new SQLite3(':memory:');

$db->exec('CREATE TABLE foo (id INTEGER, bar STRING)');
$db->exec("INSERT INTO foo (id, bar) VALUES (1, 'Ceci est un test')");

$stmt $db->prepare('SELECT bar FROM foo WHERE id=:id');
$stmt->bindValue(':id'1SQLITE3_INTEGER);

$result $stmt->execute();
var_dump($result->fetchArray(SQLITE3_ASSOC));
?>

L'exemple ci-dessus va afficher :

array(1) {
  ["bar"]=>
  string(16) "Ceci est un test"
}

Voir aussi

add a note add a note

User Contributed Notes 4 notes

up
31
zeebinz at gmail dot com
11 years ago
Note that this also works with positional placeholders using the '?' token:

<?php

$stmt
= $db->prepare('SELECT * FROM mytable WHERE foo = ? AND bar = ?');
$stmt->bindValue(1, 'somestring', SQLITE3_TEXT);
$stmt->bindValue(2, 42, SQLITE3_INTEGER);

?>

Positional numbering starts at 1.
up
10
andrevanzuydam at gmail dot com
6 years ago
I just want to say again,

Numbering for parameters starts at ONE!

This has caught me out quite a few times!
up
3
bohwaz
6 years ago
It might be a good idea to feed bindValue the type of the variable manually, or you might encounter weird stuff as the passed value is often treated as SQLITE3_TEXT and results in buggy queries.

For example:
<?php
$st
= $db->prepare('SELECT * FROM test WHERE (a+1) = ?');
$st->bindValue(1, 2);
?>

Will never return any result as it is treated by SQLite as if the query was 'SELECT * FROM test WHERE (a+1) = "2"'. Instead you have to set the type manually:

<?php
$st
= $db->prepare('SELECT * FROM test WHERE (a+1) = ?');
$st->bindValue(1, 2, \SQLITE3_INTEGER);
?>

And it will work. This bug is reported in https://bugs.php.net/bug.php?id=68849

Here is a simple function to help you make bindValue work correctly:

<?php
function getArgType($arg)
{
    switch (
gettype($arg))
    {
        case
'double': return SQLITE3_FLOAT;
        case
'integer': return SQLITE3_INTEGER;
        case
'boolean': return SQLITE3_INTEGER;
        case
'NULL': return SQLITE3_NULL;
        case
'string': return SQLITE3_TEXT;
        default:
            throw new \
InvalidArgumentException('Argument is of invalid type '.gettype($arg));
    }
}
?>
up
1
vaibhavatul47 at gmail dot com
5 years ago
I used following logic to prepare statements, It handles both Values and Arrays ( taking help from bohwaz note) :

<?php
   
function getArgType($arg) {
        switch (
gettype($arg)) {
            case
'double':  return SQLITE3_FLOAT;
            case
'integer': return SQLITE3_INTEGER;
            case
'boolean': return SQLITE3_INTEGER;
            case
'NULL':    return SQLITE3_NULL;
            case
'string':  return SQLITE3_TEXT;
            default:
                throw new \
InvalidArgumentException('Argument is of invalid type '.gettype($arg));
        }
    }

foreach (
$params as $index => $val) {
               
// indexing start from 1 in Sqlite statement
               
if (is_array($val)) {
                   
$ok = $stmt->bindParam($index + 1, $val);
                } else {
                   
$ok = $stmt->bindValue($index + 1, $val, getArgType($val));
                }
               
                if (!
$ok) {
                    throw new
Exception("Unable to bind param: $val");
                }
            }
?>
To Top