我的PHP脚本中有以下SQLite QUERY:
try
{
//open the database
$db = new PDO('sqlite:users.sqlite');
//create the database or view existing
$db->exec("CREATE TABLE USERS (Id INTEGER PRIMARY KEY, Type TEXT, Name TEXT, Password TEXT)");
//select records with username and password match
$existUser = $db->query("SELECT COUNT(*) FROM Users WHERE Name='" . $incomingusername . "' and Password ='" . $incomingpassword . "'");
//check that either the result string isn't empty or somehow count rows
$result = sqlite_num_rows($existUser);
print $result;
echo "Done output from SQL<BR>";
// close the database connection
$db = NULL;
}
catch(PDOException $e)
{
print 'Exception : '.$e->getMessage();
}
我从这里得到一个错误:致命错误:调用未定义的函数sqlite_num_rows()
所以我做了一些搜索,结果证明语言规范是谎言而且这种方法不存在。我只需要测试我的sqlite数据库是否包含用户名和密码。我也试过SELECT COUNT(*)FROM Users WHERE Name ='Jeff'和Password ='Monhty';但是这不会返回我能够使用的任何内容,我不理解返回结果的类型。当我在控制台中针对数据库运行此SELECT COUNT时,我得到了一个完全正确的行为。
请有人指出我可以使用的SQL字符串,让我在PHP脚本中将其结果视为布尔值吗?非常感谢。
Ninjaedit - - &gt; numRows();也不起作用。也未被承认。
答案 0 :(得分:1)
您可以将“SELECT COUNT(*)FROM ...”更改为
"SELECT CAST((COUNT(*)=1) AS BOOLEAN) FROM..."
如果您想检查是否只存在一个用户,或
"SELECT CAST((COUNT(*)>=1) AS BOOLEAN) FROM..."
如果要检查是否存在一个或多个用户。
答案 1 :(得分:1)
您的代码存在一些问题:
首先,您尝试在PDO句柄上使用sqlite_num_rows
。 PDO是一个与许多底层数据库系统一起使用的数据库抽象层。 sqlite_num_rows
仅适用于PHP中native SQLite extension的句柄。所以你不能在这里使用sqlite_num_rows
。
其次,SELECT COUNT(*) ...
将始终返回1行,无论是否找到匹配项,例如:
SELECT COUNT(*) AS MyCount FROM Users WHERE Name = 'Jeff'
将返回如下所示的结果集:
+---------+
| MyCount |
+---------+
| 1 |
+---------+
假设Users
表中有一行Jeff
列中的值为Name
。
相反,如果您要执行此操作:
SELECT COUNT(*) AS MyCount FROM Users WHERE Name = 'ThisDoesNotExist'
你会得到一个看起来像的结果集:
+---------+
| MyCount |
+---------+
| 0 |
+---------+
所以你仍然有1行,但结果集中MyCount
列的值会告诉你是否找到了匹配项。所以即使你可以在这里使用sqlite_num_rows
,它也无济于事,因为它总会返回1
。
您真正想要做的是检查结果集中MyCount
的值,如果是1
则匹配,如果是0
那里不是一场比赛。
请注意,如果您的Users
表格中有多个行具有相同的Name
和Password
,那么COUNT(*)
会返回一些行数,发生了匹配。
以下代码可为您提供所需内容:
$existUser = false;
//select records with username and password match
$stmt = $db->prepare("SELECT COUNT(*) AS MyCount FROM Users WHERE Name = ? AND Password = ?");
if ($stmt->execute(array($incomingusername, $incomingpassword))) {
$rows = $stmt->fetchAll();
$existUser = ($rows[0]['MyCount'] == 1);
}
if ($existUser) {
/* Found a matching user */
} else {
/* Did NOT find a matching user */
}
此方法的副作用是您受SQL injection保护。
答案 2 :(得分:0)
也许..
$existUser = $db->query("SELECT COUNT(*) as count FROM Users WHERE Name='" . $incomingusername . "' and Password ='" . $incomingpassword . "'");
$row = $existUser->fetchAll();
$numRows = $row[0]['count'];