2014-04-29 34 views
0

從PDO返回值我正在從基於mySQL的php遷移到PDO。我在做一個if語句。基本上,我想查詢數據庫中的值,並檢查是否有任何東西被返回。PHP:根據語句

與MySQL我會做這樣的:

//Query the entered data to see if it matches 
$myQuery = "SELECT * FROM $tbl_name WHERE myData ='$MyData'"; 
$myResult = mysql_query($myQuery); 

// If statement 
if(mysql_num_rows($myResult) >=1) { 
$result .= "The data matched and SQL query was successful"; 
} 

隨着PDO我有這個迄今爲止,雖然它不工作尚未:

//Query the entered data to see if it matches 
$myQuery = "SELECT myData FROM table_name WHERE myData = '$myData'"; 
$myResult = $db->single($myQuery); 

// If statement 
if($myResult == 1) { 
$result .= "The data matched and PDO query was successful"; 
} 

雖然,從我看到你不不需要將查詢和結果與PDO分開,並且可以將查詢和結果組合到一個語句中。

回答

1
$myQuery = $db->prepare("SELECT myData FROM table_name WHERE myData = ?"); 
$myQuery->execute(array($myData)); 
$myResult->rowCount($myQuery); 

// If statement 
if($myResult == 1) { 
$result .= "The data matched and SQL query was successful"; 
} 
1

在PDO你會做這樣的:

$data_exists = $dbh->prepare('SELECT 1 
           FROM `table_name` 
           WHERE `myData` = ?'); 

$data_exists->execute(array($myData)); 

if ($data_exists->rowCount() == 1) { 
    $result .= 'The data matched and PDO query was successful'; 
} 
1

要回答你的問題,你可以使用PDO的功能rowCount時()。

if ($myResult->rowCount() > 0) { 
    $result .= 'The data matched and PDO query was successful'; 
} 

但請注意,您的PDO查詢不安全。由於您直接在查詢中插入一個變量,因此它仍然容易受到MySQL注入的影響。改用PDO的功能bindParam()bindValue()

1

雖然從我看到的你不需要將查詢和結果與PDO分開,並且可以將查詢和結果組合到一個語句中。

它確實允許你不應該使用PDO的方式。但是,儘管如此,你的單一功能不是PDO,我懷疑它會允許你任何數量的行。但無論如何你並不需要這個號碼。

所以,把事情直

  1. 你單()函數應該有準備的發言。
  2. 有了結果,從這個功能,你需要在所有

這裏沒有NUM行不言而喻

public function single($myQuery, $params = NULL, $style = PDO::FETCH_ASSOC) 
{ 
    $stmt = $this->pdo->prepare($myQuery); 
    $stmt->execute($params); 
    return $stmt->fetch($style); 
} 

$myQuery = "SELECT myData FROM table_name WHERE myData = ?"; 
$myResult = $db->single($myQuery, [$myData]); 
if($myResult) { 
    $result .= "The data matched and PDO query was successful"; 
} 

,如果你不需要的結果本身,那麼你就可以縮短一點

$myQuery = "SELECT 1 FROM table_name WHERE myData = ?"; 
if($db->single($myQuery, [$myData])) { 
    $result .= "The data matched and PDO query was successful"; 
} 
-1

所有答案建議使用rowCount()是錯誤的,rowCount()返回一個非零值ONL y在影響行數的行爲中,而不是選定的行數,或者至少如PHP manual: PDO::Statement所述,這不是保證。

PDOStatement對象:: rowCount時()返回受 最後DELETE,插入或更新由相應 PDOStatement對象對象所執行的語句的行 數。 如果由關聯的PDOStatement執行的最後一條SQL語句是SELECT 語句,則某些數據庫可能會返回該語句返回的行數。 但是,對於所有數據庫,並不保證此行爲,對於便攜式應用程序不應該使用 。

更多文本從手動

例2計數SELECT語句

返回對於大多數數據庫行,PDOStatement對象:: rowCount時()不返回 數受SELECT語句影響的行。相反,使用 PDO :: query()發出一個SELECT COUNT(*)語句,其中含有與您預期的SELECT語句相同的 謂詞,然後使用 PDOStatement :: fetchColumn()檢索將返回 的行數。然後您的應用程序可以執行正確的 操作。

至少我知道我有很多問題。

的另一種方式是使用:

$rows = stmt->fetchAll(PDO::FETCH_ASSOC); 

if (count($rows)) 
{ 
    //Do something here 
} 
else 
{ 
    //Do something else here. 
} 

上面的代碼塊是好的,如果你希望小數據集返回。如果我們談論的巨大數據集,那麼你執行2個查詢,一用一COUNT在其與相同條件的SELECT語句,然後SELECT聲明是這樣的美好:

$sql = "SELECT COUNT(*) FROM $tbl_name WHERE myData ='$MyData"; 
$count = $db->query($sql)->fetch(); 

if ($count[0] > 0) 
{ 
    $myQuery = "SELECT * FROM $tbl_name WHERE myData ='$MyData'"; 
    //.... Continue your code here since now you know for sure that your 
    //query will return rows.... 
    //..... 
} 
else 
{ 
    //handle the case that no data were returned. 
} 

的上面的代碼塊只是爲了演示,所以你可以理解什麼以及如何做。 我不能保證這是做到這一點的最佳方式,這只是我做的方式。乾杯。

另外一個更好的方式來做你的事情是使用準備陳述作爲某人或某些建議。這與你在這裏處理你的問題的方式沒有任何關係,這只是一個更安全的做法,因爲如果不是完全的,那麼準備好的陳述會阻止SQL Injection到一個非常好的程度(不確定)。

+1

並非如此。這是我用於在使用PDO和MySQL時返回行計數的事實上的方法,它可以在100%的時間內運行。 – silkfire

+0

你正在與手冊爭論? Mkay,我只是把我的5美分放在那裏......而且顯然你甚至沒有閱讀完整的答案......或者去看手冊以查看那裏的相同文本......它爲你工作的事實並不意味着它適用於所有人。我已經在很多問題中看到過這個問題。 –

+0

它只需要一點谷歌搜索 - 像這樣一個:https://stackoverflow.com/questions/883365/row-count-with-pdo和這一個https://stackoverflow.com/questions/6041886/count-數 - 的 - 行 - 中 - 選擇 - 查詢與-PDO –

-1

你可以做這樣的事情:

$sql = "SELECT * FROM animals"; 
$stmt = $dbh->query($sql); 
$result_count = $stmt->fetch(PDO::FETCH_ASSOC); 

if($result_count == 1) 
{ 
    $result .= "The data matched and PDO query was successful"; 
} 
0

確定。謝謝大家的回答。考慮到他們並進行一些測試後,我想與你分享一些發現。

關於手頭的問題,即在使用PDO檢查數據庫值時設置if語句,我注意到了一些差異。這對你們中的一些人可能是顯而易見的,但對於來自mysql的人(像我)來說,事實並非如此。

做了一些測試之後,我發現我無法像使用mysql一樣查詢帶有PDO的字符串。此外,在MySQL中,您可以在查詢數據庫之前設置字符串值。

從我所看到的,PDO只會查詢並返回數組。所以你不能簡單地插入一個字符串值並檢查它。

在關於我的問題,我發現,使用:

  1. 我的查詢語法PDO是不正確的。

  2. 當它是正確的,我只能夠查詢返回數組的數組。

反正這是我做過什麼:

// Get's the entire column called "ColumnName" 
$getColumn = $db->column("SELECT columName FROM table_name "); 

// Check if the returned array contains a string. 
$myString = "matchThisString"; 
if (in_array($myString, $getColumn)) { 
    echo "A Match was found"; 
} 
else { 
    echo "No match was found"; 
} 

我建議閱讀以下內容:

http://www.php.net/manual/en/pdostatement.fetch.php

http://www.php.net/manual/en/language.types.boolean.php

http://www.php.net/manual/en/language.types.array.php