0

我的 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' and Password ='Monhty'; 但这不会返回任何我可以使用的东西,我不明白返回结果的类型。当我在控制台中针对数据库运行此 SELECT COUNT 时,我得到了一个完全正确的结果。

请有人指出我可以使用的 SQL 字符串,让我在我的 PHP 脚本中将其结果视为布尔值?非常感谢。

Ninjaedit - ->numRows(); 也不起作用。也不认可。

4

3 回答 3

1

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

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

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

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

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

于 2013-06-18T15:57:09.187 回答
1

您的代码存在一些问题:

首先,您尝试sqlite_num_rows在 PDO 句柄上使用。 PDO是一个与许多底层数据库系统一起工作的数据库抽象层。 仅适用于 PHP中原生 SQLite 扩展sqlite_num_rows的句柄。所以你不能在这里使用。sqlite_num_rows

其次,SELECT COUNT(*) ...无论是否找到匹配项,都将始终返回 1 行,例如:

SELECT COUNT(*) AS MyCount FROM Users WHERE Name = 'Jeff'

将返回如下所示的结果集:

+---------+
| MyCount |
+---------+
| 1       |
+---------+

假设您在表中有一行具有列中的Users值。JeffName

相反,如果您要执行此操作:

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 注入

于 2013-06-18T16:01:19.717 回答
0

也许..

$existUser = $db->query("SELECT COUNT(*) as count FROM Users WHERE Name='" . $incomingusername . "' and Password ='" . $incomingpassword . "'");
$row = $existUser->fetchAll();
$numRows = $row[0]['count'];
于 2013-06-18T15:57:55.067 回答