插入字符串时缺少前导零

时间:2015-11-16 13:29:50

标签: php sqlite


实际上我对PHP和SQLite3非常生气,以及我的一些字符串在那里表现的方式 我尝试保存开放时间,但是用字符串而不是数字来防止前导零的问题(现在还有它...哈哈... - .-)。
小时和分钟有自己的列,但是当我插入' 0x'零已经消失,无论x是什么,都留在数据库中。 :/
我确定我只是错过了某个地方的一些小部分...... 我已经检查过INSERT语句,但一无所获 插入字符串的示例:
INSERT INTO opening INSERT INTO opening (start_day, end_day, start_hour, start_minute, end_hour, end_minute) VALUES('Montag', 'Freitag', '00', '00', '01', '00')
但输出是:

11|Montag|Freitag|0|0|1|0

守则的一部分:

class Database_Opening_Hours extends SQLite3{
    function __construct() {
        if(!file_exists("../../data/opening_hours/opening_hours.sqlite")){
            $this->open("../../data/opening_hours/opening_hours.sqlite");
            $this->exec('CREATE TABLE opening (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, start_day STRING, end_day STRING, start_hour STRING, start_minute STRING, end_hour STRING, end_minute STRING)');
        }
        else{
            $this->open("../../data/opening_hours/opening_hours.sqlite");
        }
    }
}
$db = new Database_Opening_Hours();
$insert = "INSERT INTO opening (start_day, end_day, start_hour, start_minute, end_hour, end_minute) VALUES('".htmlspecialchars($_GET["start_day"])."','".htmlspecialchars($_GET["end_day"])."','".$start_hour."','".$start_minute."','".$end_hour."','".$end_minute."')";
if($db->exec($insert)){
    $db->close();
    unset($db);
    echo "Insert erfolgreich";
}else{
    $db->close();
    unset($db);
    echo "Nicht wirklich...";
}

4 个答案:

答案 0 :(得分:3)

请确保您的列类型设置为整数(或任何其他数字类型)而不是TEXT。

确保仔细检查列数据类型并实际转储表以供我们检查它是否真的设置为TEXT。

答案 1 :(得分:1)

这是由SQLite使用动态类型引起的。来自FAQ

  

这是一个功能,而不是一个bug。 SQLite使用dynamic typing。它不强制实施数据类型约束。任何类型的数据都可以(通常)插入任何列。您可以将任意长度字符串放入整数列,布尔列中的浮点数或字符列中的日期。您在CREATE TABLE命令中为列分配的数据类型不会限制可以将哪些数据放入该列。每列都能容纳一个任意长度的字符串。

从链接页面(强调我的):

  

为了最大化SQLite与其他数据库引擎之间的兼容性,SQLite支持"类型亲和力"在列上。列的类型亲缘关系是存储在该列中的数据的推荐类型。 这里的重要思想是建议使用该类型,而不是必需的。任何列仍然可以存储任何类型的数据。只是根据选择,某些列将优先使用一个存储类而不是另一个存储类。列的首选存储类称为" affinity"。

因此,SQLite会动态地将您的值转换为整数。

我建议将start_hourstart_minute合并到start_timeend_字段相同)并将值存储为00:00格式。< / p>

SQLite将按原样存储这个&#39;但足够智能识别时间值并允许您执行日期/时间操作:

select time(start_time, '+1 hour') from opening

答案 2 :(得分:0)

我在使用C / C ++时遇到了这个问题,因为我没有引用字符串:

insert into test values('aa', 'bb');

答案 3 :(得分:0)

使用varchar而不是字符串,我遇到了同样的问题,然后使用了varchar(length),并且效果很好