Php 缺少前导零';在插入字符串时使用

Php 缺少前导零';在插入字符串时使用,php,sqlite,Php,Sqlite,实际上,我对PHP和SQLite3以及我的一些字符串的行为方式非常着迷。 我试图用字符串而不是数字来节省开放时间,以防止前导零出现问题(现在仍然有,哈哈…-。-)。 小时和分钟都有自己的列,但当我插入“0x”时,零就消失了,不管x是什么,都会留在数据库中:/ 我肯定我只是在某个地方错过了一些该死的小部分… 我已经检查了INSERT语句,但没有找到任何内容。 插入字符串的示例: 插入期初插入期初(开始日、结束日、开始小时、开始分钟、结束小时、结束分钟)值('Montag','Freitag','0


实际上,我对PHP和SQLite3以及我的一些字符串的行为方式非常着迷。
我试图用字符串而不是数字来节省开放时间,以防止前导零出现问题(现在仍然有,哈哈…-。-)。
小时和分钟都有自己的列,但当我插入“0x”时,零就消失了,不管x是什么,都会留在数据库中:/
我肯定我只是在某个地方错过了一些该死的小部分…
我已经检查了INSERT语句,但没有找到任何内容。
插入字符串的示例:
插入期初插入期初(开始日、结束日、开始小时、开始分钟、结束小时、结束分钟)值('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...";
}

非常确定列的类型设置为整数(或任何其他数字类型),而不是文本


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

请确保列的类型设置为整数(或任何其他数字类型),而不是文本


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

这是由于SQLite使用动态类型造成的。从:

这是一个特性,不是bug。SQLite使用。它不强制数据类型约束。任何类型的数据(通常)都可以插入到任何列中。您可以将任意长度的字符串放入整数列、布尔列中的浮点数或字符列中的日期。在CREATETABLE命令中指定给列的数据类型不限制可以将哪些数据放入该列。每列都可以容纳任意长度的字符串

从链接页面(我的重点):

为了最大限度地提高SQLite与其他数据库引擎之间的兼容性,SQLite支持列上的“类型关联”概念。列的类型关联是存储在该列中的数据的建议类型这里的重要思想是推荐类型,而不是必需类型。任何列仍然可以存储任何类型的数据。只是如果有选择,某些列更喜欢使用一个存储类而不是另一个存储类。列的首选存储类称为“关联”

所以SQLite动态地将您的值转换为整数

我建议将
start\u hour
start\u minute
组合成
start\u time
(与
end\u
字段相同)并以
00:00
格式存储值

SQLite将按“原样”存储此数据,但足够智能,可以识别时间值,并允许您执行日期/时间操作:

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

这是由SQLite使用动态类型造成的。从:

这是一个特性,不是bug。SQLite使用。它不强制数据类型约束。任何类型的数据(通常)都可以插入到任何列中。您可以将任意长度的字符串放入整数列、布尔列中的浮点数或字符列中的日期。在CREATETABLE命令中指定给列的数据类型不限制可以将哪些数据放入该列。每列都可以容纳任意长度的字符串

从链接页面(我的重点):

为了最大限度地提高SQLite与其他数据库引擎之间的兼容性,SQLite支持列上的“类型关联”概念。列的类型关联是存储在该列中的数据的建议类型这里的重要思想是推荐类型,而不是必需类型。任何列仍然可以存储任何类型的数据。只是如果有选择,某些列更喜欢使用一个存储类而不是另一个存储类。列的首选存储类称为“关联”

所以SQLite动态地将您的值转换为整数

我建议将
start\u hour
start\u minute
组合成
start\u time
(与
end\u
字段相同)并以
00:00
格式存储值

SQLite将按“原样”存储此数据,但足够智能,可以识别时间值,并允许您执行日期/时间操作:

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

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

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

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

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

使用varchar代替字符串,我遇到了同样的问题,然后我使用varchar(长度),效果很好

使用varchar代替字符串,我遇到了同样的问题,然后我使用varchar(长度),效果很好

请参见,您正在插入整数,因此01(变成)>1。。不要对PHP发火,它是你自己的代码。还要使用准备好的语句和查询参数,而不是对查询进行字符串操作
htmlspecialchars
甚至不适用于清理SQL。请参阅,您正在插入整数,因此01(变成)>1。。不要对PHP发火,它是你自己的代码。还要使用准备好的语句和查询参数,而不是对查询进行字符串操作
htmlspecialchars
甚至不适用于清理SQL。