首先,我很抱歉这个问题的措辞。
我在SQLite数据库中Testing
了下表:
| id | name | something_numerical |
|----|-------|---------------------|
| 1 | test1 | 100 |
| 2 | test2 | 500 |
| 3 | test3 | 1000 |
| 4 | test4 | 5000 |
| 5 | test5 | 10000 |
| 6 | test6 | 25000 |
所有查询都从7.3.12-1+0~20191128.49+debian9~1.gbp24559b
执行
查询中使用以下别名(这似乎是问题所在(
something_numeric+100 AS modified_column
通过不带占位符的 PDO 进行查询按预期工作,并返回第 3 行和第 4 行。
SELECT *, something_numerical+100 AS modified_column
FROM Testing
WHERE modified_column BETWEEN 750 AND 7500
使用占位符通过PDO 进行查询不会返回行和错误。(我还尝试使用?
来转换参数,结果相同(
SELECT *, something_numerical+100 AS modified_column
FROM Testing
WHERE modified_column BETWEEN :min_modified_column AND :max_modified_column
值
$parameters = [
':min_modified_column'=>750,
':max_modified_column'=>7500
];
如果不+100
列something_numerical
,两个查询都按预期工作并返回 3 和 4。
这是SQLite数据库,以帮助重现(如有必要(
DROP TABLE IF EXISTS "Testing";
CREATE TABLE "Testing" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"name" text NOT NULL,
"something_numerical" integer NOT NULL
);
INSERT INTO "Testing" ("id", "name", "something_numerical") VALUES (1, 'test1', 100);
INSERT INTO "Testing" ("id", "name", "something_numerical") VALUES (2, 'test2', 500);
INSERT INTO "Testing" ("id", "name", "something_numerical") VALUES (3, 'test3', 1000);
INSERT INTO "Testing" ("id", "name", "something_numerical") VALUES (4, 'test4', 5000);
INSERT INTO "Testing" ("id", "name", "something_numerical") VALUES (5, 'test5', 10000);
INSERT INTO "Testing" ("id", "name", "something_numerical") VALUES (6, 'test6', 25000);
感谢您的回答。
好的,所以这是一个类型转换问题。
用正确的类型(PDO::PARAM_INT
(绑定这些参数中的每一个可以解决这个问题。
$prepared_statement->bindValue(
':min_modified_column',
750,
PDO::PARAM_INT
);
$prepared_statement->bindValue(
':max_modified_column',
7500,
PDO::PARAM_INT
);
似乎,在没有任何操作的情况下,SQLite/PDO 可以从列类型推断出类型,但在对其内容进行操作后无法再这样做。
以下问题让我走上了正确的轨道
Android/SQLite - WHERE 子句上的位操作