我創建一個表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();
我認爲,必須有一些做準備語句。
謝謝!這回答了我的問題。順便說一下,您是否知道如何讓SQLite拒絕空字符串? – jsmith6 2013-04-21 21:45:39
@ jsmith6我已經更新了我的答案,包括使用CHECK約束來停止插入到用戶名和密碼列中的零長度字符串的示例。爲了便於閱讀,我已將該聲明拆分爲多個。 – 2013-04-21 21:51:23
啊,我試過了,但是因爲我準備了聲明而失敗了。有沒有辦法在那裏有CHECK,但也有pepare語句? – jsmith6 2013-04-23 00:34:05