2015-11-16 26 views
0


我實際上對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..."; 
} 
+0

看到http://stackoverflow.com/questions/6873354/storing-leading-zeros-of-integers-in-mysql-database-as-integer和http:// DBA。 stackexchange.com/a/15054/ –

+1

你正在插入整數,所以01(成爲)> 1 ..不要生氣的PHP,它是你自己的代碼.. – Svetoslav

+0

還使用準備的語句和查詢參數,而不是查詢的字符串操作。 'htmlspecialchars'甚至不能正確清理SQL。 –

回答

2

相當肯定,你列的類型設置爲整數(或任何其他數字類型)而不是TEXT。

請務必仔細檢查列數據類型,然後爲我們轉儲表以檢查它是否真的設置爲TEXT。

0

這是由SQLite使用動態類型引起的。來自FAQ

這是一個功能,而不是一個錯誤。 SQLite使用dynamic typing。它不強制數據類型約束。任何類型的數據都可以(通常)插入到任何列中。您可以將任意長度的字符串放入整數列,布爾列中的浮點數或字符列中的日期。您在CREATE TABLE命令中分配給列的數據類型不限制可將哪些數據放入該列。每列可以容納任意長度的字符串。

並從鏈接頁面(重點煤礦):

爲了最大化SQLite和其它數據庫引擎之間的兼容性,SQLite支持列上「式的親和」的概念。列的類型親緣關係是存儲在該列中的數據的推薦類型。 這裏的重要想法是該類型是推薦的,不是必需的。任何列都可以存儲任何類型的數據。只是有些列在給出選擇的情況下會傾向於使用一個存儲類而不是另一個存儲類。列的首選存儲類稱爲其「親和性」。

因此,SQLite將動態地將您的值轉換爲整數。

我建議組合start_hourstart_minutestart_time(同爲end_字段),並在格式存儲00:00的值。

的SQLite存儲此「原樣」,但很聰明,認識的時間值,並允許您執行日期/時間操作:

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

我有這個問題,C/C++,因爲我做了亂猜字符串:

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