Php SQLite将空值添加到非空列中

Php SQLite将空值添加到非空列中,php,sqlite,null,Php,Sqlite,Null,我正在创建一个包含非空列的表,如下所示: 如果不存在用户,则创建表(Id整数主键,用户名文本不为NULL,密码文本不为NULL) 但是SQLite很乐意为这些列添加空值: <?php error_reporting(E_ALL); date_default_timezone_set('Europe/Helsinki'); ini_set('default_charset', 'UTF-8'); mb_internal_encoding("UTF-8"); header('Content-

我正在创建一个包含非空列的表,如下所示:

如果不存在用户,则创建表(Id整数主键,用户名文本不为NULL,密码文本不为NULL)

但是SQLite很乐意为这些列添加空值:

<?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;

?>
但不是这些:

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

我认为这一定与准备声明有关。

用户名和密码不为空;它们是零长度字符串:

CREATE TABLE IF NOT EXISTS Users 
(
  Id INTEGER PRIMARY KEY, 
  Username TEXT UNIQUE NOT NULL CHECK(Username<>''), 
  Password TEXT NOT NULL CHECK(Password<>'')
);
这就是它们被插入的原因

为了响应您的评论,您可以使用如下所示的检查约束来停止插入零长度字符串

如果用户不存在,则创建表
(
Id整数主键,
用户名文本唯一非空检查(用户名“”),
密码文本非空检查(密码“”)
);

在这里。语句:
插入用户(用户名、密码)值(“”)失败,错误为:由于约束失败(19约束失败),无法执行语句,而语句:
插入用户(用户名、密码)值('a','aa')成功。

谢谢!这回答了我的问题。顺便问一下,你知道我如何告诉SQLite拒绝空字符串吗?@jsmith6我更新了我的答案,加入了一个使用检查约束阻止将零长度字符串插入用户名和密码列的示例。为了便于阅读,我将语句拆分为多个。啊,我尝试过,但失败了,因为我准备了语句。有没有一种方法既可以检查,又可以查看pepare报表?
$username = '';
$password = '';
CREATE TABLE IF NOT EXISTS Users 
(
  Id INTEGER PRIMARY KEY, 
  Username TEXT UNIQUE NOT NULL CHECK(Username<>''), 
  Password TEXT NOT NULL CHECK(Password<>'')
);