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.SQLite3Stmt::bindValue
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
SQLite3Stmt::bindValue
Референца за `sqlite3stmt.bindvalue.php` со подобрена типографија и навигација.
SQLite3Stmt::bindValue
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
SQLite3Stmt::bindValue — Binds the value of a parameter to a statement variable
= NULL
Binds the value of a parameter to a statement variable.
Before PHP 7.2.14 and 7.3.0, respectively, once the statement has been executed, SQLite3Stmt::reset() needs to be called to be able to change the value of bound parameters.
Параметри
param-
Проверува го знакот на бројот. string (за именувани параметри) или int (за позициони параметри) што го идентификува променливата на изјавата на која треба да се поврзе вредноста. Ако именуван параметар не започнува со две точки (
:) или знакот за „at“ (@), две точки (:) автоматски се додава. Позициони параметри започнуваат со1. value-
The value to bind to a statement variable.
type-
The data type of the value to bind.
-
SQLITE3_INTEGER: Вредноста е потпишан цел број, зачуван во 1, 2, 3, 4, 6 или 8 бајти во зависност од големината на вредноста. -
SQLITE3_FLOAT: Вредноста е вредност со пловечка точка, зачувана како 8-бајтен IEEE број со пловечка точка. -
SQLITE3_TEXT: Вредноста е текстуална низа, зачувана со кодирањето на базата на податоци (UTF-8, UTF-16BE или UTF-16-LE). -
SQLITE3_BLOB: Вредноста е blob од податоци, зачувана точно како што е внесена. -
SQLITE3_NULL: Вредноста е NULL вредност.
Од PHP 7.0.7, ако
typeсе изостави, автоматски се открива од типот наvalue: bool and int се третираат какоSQLITE3_INTEGER, float asSQLITE3_FLOAT, null asSQLITE3_NULLа сите други какоSQLITE3_TEXT. Претходно, акоtypeе изоставен, стандардно е поставен наSQLITE3_TEXT.Забелешка:
Враќа
valueisnull, секогаш се третира какоSQLITE3_NULL, без оглед на даденотоtype. -
Вратени вредности
Патеката до PHP скриптата што треба да се провери. true if the value is bound to the statement variable, or false при неуспех.
Дневник на промени
| Верзија | = NULL |
|---|---|
| 7.4.0 |
param сега исто така поддржува @param
notation.
|
Примери
Пример #1 SQLite3Stmt::bindValue() example
<?php
$db = new SQLite3(':memory:');
$db->exec('CREATE TABLE foo (id INTEGER, bar STRING)');
$db->exec("INSERT INTO foo (id, bar) VALUES (1, 'This is a test')");
$stmt = $db->prepare('SELECT bar FROM foo WHERE id=:id');
$stmt->bindValue(':id', 1, SQLITE3_INTEGER);
$result = $stmt->execute();
var_dump($result->fetchArray(SQLITE3_ASSOC));
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
array(1) {
["bar"]=>
string(14) "This is a test"
}
Види Исто така
- SQLite3Stmt::bindParam() - Врзува параметар за променлива на изјавата
- SQLite3::prepare() - Подготвува SQL израз за извршување
Белешки од корисници 4 белешки
I just want to say again,
Numbering for parameters starts at ONE!
This has caught me out quite a few times!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));
}
}
?>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");
}
}
?>