如何从SELECT查询中获取布尔结果?

时间:2013-06-18 15:46:28

标签: php sqlite login

我的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();也不起作用。也未被承认。

3 个答案:

答案 0 :(得分:1)

您可以将“SELECT COUNT(*)FROM ...”更改为

"SELECT CAST((COUNT(*)=1) AS BOOLEAN) FROM..." 

如果您想检查是否只存在一个用户,或

"SELECT CAST((COUNT(*)>=1) AS BOOLEAN) FROM..." 

如果要检查是否存在一个或多个用户。

答案 1 :(得分:1)

您的代码存在一些问题:

首先,您尝试在PDO句柄上使用sqlite_num_rowsPDO是一个与许多底层数据库系统一起使用的数据库抽象层。 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表格中有多个行具有相同的NamePassword,那么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'];