2013-04-21 64 views
0

我創建一個表NOT NULL列如下:SQLite的補充NULL值到NOT NULL列

CREATE TABLE IF NOT EXISTS Users (Id INTEGER PRIMARY KEY, Username TEXT UNIQUE NOT NULL, Password TEXT NOT NULL);

但SQLite是高興NULL值添加到這些列:

<?php 

error_reporting(E_ALL); 
date_default_timezone_set('Europe/Helsinki'); 
ini_set('default_charset', 'UTF-8'); 
mb_internal_encoding("UTF-8"); 
header('Content-Type: text/html; charset=UTF-8'); 

// --- 

const DB_FILE = "auth.db"; 
//$username = "john"; 
//$password = "secret"; 
$username = ''; 
$password = ''; 

// --- 

// open db 
//$db = new PDO('sqlite:'.DB_FILE); 
$db = new PDO('sqlite::memory:'); 

// set attributes 
$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 

// create the table 
$db->exec("CREATE TABLE IF NOT EXISTS Users (Id INTEGER PRIMARY KEY, Username TEXT UNIQUE NOT NULL, Password TEXT NOT NULL);"); 

$statement = "INSERT INTO Users (Username, Password) VALUES (:Username,:Password);";  
$query = $db->prepare($statement); 
$query->bindValue(':Username', $username, SQLITE3_TEXT); 
$query->bindValue(':Password', $password, SQLITE3_TEXT); 
$ok = $query->execute(); 

$result = $db->query('SELECT * FROM Users'); 
if (!$result) die ("oops!"); // will not produce anything when errormode is on 

echo "<pre>\n"; 

foreach($result as $row) 
{ 
    echo "Id: " . $row['Id'] . "\n"; 
    echo "Username: " . $row['Username'] . "\n"; 
    echo "Password: " . $row['Password'] . "\n"; 
} 

$db = NULL; 

?> 

SQLite不應該允許這樣做。我究竟做錯了什麼?

更新在2013年4月23日〜00:35個ž

下面的擔憂從鑽石古怪的答案評論。

的SQLite停止這些語句的執行:

$db->exec("INSERT INTO Users (Username, Password) VALUES ('','');"); 
$db->exec("INSERT INTO Users (Username, Password) VALUES ('a','aa');"); 
$db->exec("SELECT * FROM Users;"); 

但不是這些的:

$username = ''; 
$password = ''; 
$statement = "INSERT INTO Users (Username, Password) VALUES (:Username,:Password);";  
$query = $db->prepare($statement); 
$query->bindValue(':Username', $username, SQLITE3_TEXT); 
$query->bindValue(':Password', $password, SQLITE3_TEXT); 
$ok = $query->execute(); 

我認爲,必須有一些做準備語句。

回答

2

用戶名和密碼不爲NULL;它們是零長度字符串:

$username = ''; 
$password = ''; 

這就是它們被插入的原因。

作爲對您的評論的迴應,您可以通過使用CHECK約束來停止插入零長度的字符串,如下所示。

CREATE TABLE IF NOT EXISTS Users 
(
    Id INTEGER PRIMARY KEY, 
    Username TEXT UNIQUE NOT NULL CHECK(Username<>''), 
    Password TEXT NOT NULL CHECK(Password<>'') 
); 

這裏是在SQL Fiddle。聲明:INSERT INTO Users (Username, Password) VALUES ('','');因錯誤而失敗:由於約束失敗(19約束失敗)而無法執行語句,而聲明:INSERT INTO Users (Username, Password) VALUES ('a','aa');成功。

+0

謝謝!這回答了我的問題。順便說一下,您是否知道如何讓SQLite拒絕空字符串? – jsmith6 2013-04-21 21:45:39

+0

@ jsmith6我已經更新了我的答案,包括使用CHECK約束來停止插入到用戶名和密碼列中的零長度字符串的示例。爲了便於閱讀,我已將該聲明拆分爲多個。 – 2013-04-21 21:51:23

+0

啊,我試過了,但是因爲我準備了聲明而失敗了。有沒有辦法在那裏有CHECK,但也有pepare語句? – jsmith6 2013-04-23 00:34:05