PHP操作SQLite3存储十进制值失败:字段始终为0.0000000000000
看起来你碰到的问题很典型,我来帮你一步步排查和解决:
1. 先确认变量的实际值是否正确
首先要排除最基础的问题:你绑定的$final['price']、$final['oldprice']和$advert['average_rating']这些变量,本身是不是有正确的数值?
在绑定代码前加几行调试输出,看看变量的类型和值:
var_dump($final['price'], $final['oldprice'], $advert['average_rating']);
如果输出的是字符串(比如string(5) "19.99")或者是空值、非数字内容,那问题就出在变量本身,而不是SQLite绑定上。
2. 强制转换为浮点数再绑定
SQLite的SQLITE3_FLOAT绑定类型要求传入的是实际的PHP浮点数类型,如果你的变量是字符串形式的数字(比如从表单或API获取的"29.99"),直接绑定可能会被解析为0。解决办法是先强制转换类型:
// 用(float)强制转换,或者floatval()函数 $smtm->bindValue(':price', (float)$final['price'], SQLITE3_FLOAT); $smtm->bindValue(':oldprice', floatval($final['oldprice']), SQLITE3_FLOAT); $smtm->bindValue(':rating', (float)$advert['average_rating'], SQLITE3_FLOAT);
3. 试试不指定绑定类型
SQLite是动态类型数据库,有时候不手动指定类型,让它自动推断反而更可靠。你可以去掉SQLITE3_FLOAT参数,直接绑定转换后的数值:
$smtm->bindValue(':price', (float)$final['price']); $smtm->bindValue(':oldprice', (float)$final['oldprice']); $smtm->bindValue(':rating', (float)$advert['average_rating']);
4. 确认表结构确实修改成功
有时候我们以为修改了字段类型,但实际没生效。可以用SQL命令检查表结构:
PRAGMA table_info(ads);
查看price、oldprice、rating这三个字段的type列,确认是REAL类型。如果还是INTEGER,说明之前的ALTER TABLE操作没成功,需要重新执行修改语句:
ALTER TABLE ads MODIFY COLUMN price REAL; ALTER TABLE ads MODIFY COLUMN oldprice REAL; ALTER TABLE ads MODIFY COLUMN rating REAL;
5. 排查数组键名是否正确
最后检查一下:$final['price']的键名是不是正确?比如会不会是$final['Precio']或者其他拼写错误?如果键名不存在,PHP会返回null,绑定后就会变成0.0。可以用var_dump($final)查看整个数组的键值对,确认price、oldprice这些键存在且有值。
测试验证
你可以先手动执行一条SQL插入语句,验证数据库本身能不能存储小数:
INSERT INTO ads (price, oldprice, rating) VALUES (19.99, 29.99, 4.5);
如果这条语句能正确存储数值,说明数据库表结构没问题,问题肯定出在PHP代码的变量处理或绑定环节。
内容的提问来源于stack exchange,提问作者Erich García

