2013-04-21 76 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