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 を実行すると、正確に 1 つの結果が得られ、正しい動作が得られます。

PHPスクリプトでその結果をブール値として処理できるようにするために使用できるSQL文字列を誰かが示してもらえますか? どうもありがとう。

Ninjaedit - ->numRows(); どちらも機能しません。また、認識されていません。

4

3 に答える 3

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する場合は一致し、a の場合は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 インジェクションから保護されることです。

于 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 に答える