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 — Ги врзува вредноста на параметарот на променлива од изјавата
= NULL
$param, mixed $value, int $type = SQLITE3_TEXT): boolГи врзува вредноста на параметарот на променлива од изјавата.
Пред PHP 7.2.14 и 7.3.0, соодветно, откако изјавата е извршена, (PHP 5 >= 5.3.0, PHP 7, PHP 8) мора да се повика за да може да се промени вредноста на поврзаните параметри.
Параметри
param-
Проверува го знакот на бројот. string (за именувани параметри) или int (за позициони параметри) што го идентификува променливата на изјавата на која треба да се поврзе вредноста. Ако именуван параметар не започнува со две точки (
:) или знакот за „at“ (@), две точки (:) автоматски се додава. Позициони параметри започнуваат со1. value-
Вредноста што треба да се поврзе со променлива од изјавата.
type-
Типот на податок на вредноста што треба да се поврзе.
-
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 ако вредноста е поврзана со променливата на изјавата, или false при неуспех.
Дневник на промени
| Верзија | = NULL |
|---|---|
| 7.4.0 |
param сега исто така поддржува @param
notation.
|
Примери
Пример #1 SQLite3::prepare() 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::bindValue() - Врзува параметар за променлива на изјавата
- објект при успешно извршување на подготвената изјава, - Подготвува 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");
}
}
?>