2013-06-18 75 views
0

我在我的PHP腳本如下SQLite的查詢:如何從SELECT查詢中獲得布爾結果?

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 WHERE Name ='Jeff'和Password ='Monhty';但是這不會返回任何我能夠使用的東西,我不明白返回結果的類型。當我在控制檯對數據庫運行這個SELECT COUNT時,我得到一個結果,正確的行爲。

請有人指出一個我可以使用的SQL字符串,讓我可以在我的PHP腳本中將其結果視爲布爾值嗎?非常感謝。

Ninjaedit - - > numRows();也沒有工作。也不承認。

回答

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表中具有Name列中值爲Jeff的行。

相反,如果你要執行此:

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保護。

+0

這使我開始運行。非常感謝這個肖恩。它不僅可以工作,而且可以幫助我理解原因。你死了我有PDO和SQLite混淆。 – KolKurtz

1

你可以改變 「SELECT COUNT(*)FROM ...」 到

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

如果要檢查,如果只有一個用戶是否存在,或

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

,如果你想查詢如果有一個或多個用戶存在。

+0

只是爲了澄清,這將設置$ existUser爲布爾值。另外,我所知道的關於SQL的所有東西都希望將其轉換爲一點,但似乎在SQLite中,該類型被稱爲BOOLEAN。 – BryPie

0

也許..

$existUser = $db->query("SELECT COUNT(*) as count FROM Users WHERE Name='" . $incomingusername . "' and Password ='" . $incomingpassword . "'"); 
$row = $existUser->fetchAll(); 
$numRows = $row[0]['count']; 
+0

致命錯誤:調用第23行C:\ wamp \ www \ LoginSystemLive \ dbmanip.php中的未定義函數sqlite_fetch_array() – KolKurtz

+0

然後查看我更新的答案。 –

相關問題