当数据库为空时,numColumns返回1(PHP)

当数据库为空时,numColumns返回1(PHP),php,sql,database,sqlite,Php,Sql,Database,Sqlite,首先,我要说我对SQLite非常陌生(这基本上是我第一次正确地尝试它),但我熟悉通过MySQL使用SQL,并且已经使用了很多 我已经使用一个名为“SQLite数据库浏览器”的程序验证了我的SQLite 3数据库是否正常工作。现在它是空的,我正在测试一个用户注册系统。我正试图通过计算返回的行来检查提供的电子邮件和用户名,并对照数据库进行检查,以确认它们尚未被使用。由于我的数据库目前是空的,所以无论我提交什么,我都希望结果是0,但我一直得到结果1 $db = new SQLite3('databas

首先,我要说我对SQLite非常陌生(这基本上是我第一次正确地尝试它),但我熟悉通过MySQL使用SQL,并且已经使用了很多

我已经使用一个名为“SQLite数据库浏览器”的程序验证了我的SQLite 3数据库是否正常工作。现在它是空的,我正在测试一个用户注册系统。我正试图通过计算返回的行来检查提供的电子邮件和用户名,并对照数据库进行检查,以确认它们尚未被使用。由于我的数据库目前是空的,所以无论我提交什么,我都希望结果是0,但我一直得到结果1

$db = new SQLite3('database.db');

$email = SQLite3::escapeString($_POST['email']);
$username = SQLite3::escapeString($_POST['username']);

// check if email already exists
$email_query = $db->query("SELECT email FROM users WHERE email='$email' LIMIT 1;");
$email_exists = $email_query->numColumns();

// check if username already exists
$username_query = $db->query("SELECT username FROM users WHERE username='$username' LIMIT 1;");
$username_exists = $username_query->numColumns();

当我在“SQLite数据库浏览器”中运行这些查询时,我得到了预期的结果。我也没有收到任何PHP错误。我的一个理论是,由
numColumns()
返回的
1
实际上是错误代码1,但当我使用
SQLite3::lastErrorCode()
时,我得到0,这意味着没有错误。我迷路了…我真的很喜欢这里的一些见解

当没有行时,
numColumns()
将返回1。解决方案是:

if ($username_query->numColumns() && $username_query->columnType(0) != SQLITE3_NULL) {
    // Rows exist
} else {
    // No data
}
功劳归于我

但是,其他注释表明,
columnType
可能总是返回
SQLITE3\u NULL
,而是执行此操作以确定是否存在行:

if ($result->fetchArray()[0] == null) {
   // No rows
}

列数就是您请求的字段数。如果您选择了
用户名、电子邮件…
,它将返回
2
,因为您选择了2列

如果您想知道是否有匹配项,那么应该计算行数,而不是列数。但是
SQLite3
扩展没有提供
numRows
方法。您可以更改查询,以便执行以下操作:

SELECT COUNT(*) AS count FROM users WHERE email = '$email'
然后查看
$row['count']
是否大于0。或者,您可以使用现有查询并尝试获取结果

$email_exists = !empty($email_query->fetchArray());

所以,获取结果并查看它您应该计算行数,而不是列数。列数就是您在
SELECT
列表中指定的字段数。我想这可能已经解决了,至少现在我得到了不同的行为。我不能马上检查,但是谢谢你提供的信息!numColumns()是一个元数据函数,它的值由查询代码决定,而不是由查询结果决定。原始答案(文章顶部)具有误导性,应删除。之后我会删除我的评论。有道理。解释了为什么
fetchArray
是判断是否有行的更好方法。哇,我是个白痴。我一直在寻找与mysqli_num_rows等价的代码,我看到了“num”,甚至没有意识到它一直在说“column”。我太笨了-非常感谢!
$email_query = $db->query("SELECT email FROM users WHERE email='$email' LIMIT 1;");
if($email_query->fetchArray(SQLITE3_ASSOC)){
    //email exists
}