2013-07-13 175 views
0

我在這裏有這個函數,這個函數全局變量$ con變量,這是mysql連接變量,主題名稱由參數獲取,如您所見。我創建了一個稱爲count的變量來計算語句返回的行數。準備好的語句,在結束語句之前返回

我的問題是,正在使用這個好嗎?或者有更好的方法呢?

function isTopic($topic_name){ 
    global $con; 

    $topic_name=$con->real_escape_string($topic_name); 
    $count = 0; 
    if($stmt = $con->prepare("SELECT topic_id FROM topics WHERE topic_name = ?")){ 
     $stmt->bind_param("s",$topic_name); 
     $stmt->execute(); 
     $stmt->store_result(); 
     $count = $stmt->num_rows; 
     $stmt->close(); 
    } 
    return ($count == 1); 
} 
+0

不要使用全局,因爲這使你的代碼難以讀書! – Perry

回答

2

這是非常錯誤的,因爲你並不需要在您使用prepared statements這defeates的使用預處理語句的目的使用real_escape_string()

其次,如評論部分所述,使用global來獲取資源對象並不鼓勵,原因很多。相反,如果您正在使用過程式樣式,則可以將該對象作爲參數傳遞給函數,否則,如果您正在編寫OO樣式,則可以應用DI(依賴注入)並獲取資源。

我會假設,您沒有使用OOP並在此處提供程序性答案。

如果您要綁定返回行數就行了。

function isTopic($conn, $topic_name){ 
    $stmt = $conn->prepare("SELECT topic_id FROM topics WHERE topic_name = ?"); 
       $stmt->bind_param("s", $topic_name); 
       $stmt->execute(); 
     return $stmt->rowCount(); 
} 
+0

是否需要關閉$ stmt? –

+0

@OrelBitton在'mysql'中關閉它是必要的。它是任意的,不是強制性的。 – samayo

+0

@Simon _eQ非常感謝您 –

3

爲什麼你會返回數據的實際行,只計算它們?

當MySQL可以爲你做到這一點:

// if you have uniques 
SELECT COUNT(`topic_id`) FROM `topics` WHERE `topic_name` = ?; 
// if you have duplicates 
SELECT COUNT(DISTINCT `topic_id`) FROM `topics` WHERE `topic_name` = ?; 

這是很容易和MySQL返回一個數字沒有記錄,這是一個整數,對數據結構的數組。

如果您需要計數,請使用COUNT()

PS字符串與準備語句轉義=冗餘+失敗。

UPDATE:

如果你只需要檢查該topic_name的存在:

SELECT `topic_id` FROM `topics` WHERE `topic_name` = ? LIMIT 1; // important! 

只需選擇topic_id和限制1場。仍然有1個整數返回。

+1

不是,他們不是 –

+1

@YourCommonSense太棒了!巨魔的攻擊...... – CodeAngry

+1

@YourCommonSense:他們不是什麼? –

0

您的代碼非常好。但是,我的口味中有太多無用的代碼。

如果我是你,我會做它至少

function isTopic($topic_name){ 
    global $con; 

    $stmt = $con->prepare("SELECT topic_id FROM topics WHERE topic_name = ?"); 
    $stmt->bind_param("s", $topic_name); 
    $stmt->execute(); 
    $stmt->store_result(); 
    return $stmt->num_rows; 
} 

但如果我自己,我會想辦法讓這

function isTopic($topic_name){ 
    global $con; 
    $sql = "SELECT topic_id FROM topics WHERE topic_name = ?" 
    return $con->getOne($sql, $topic_name); 
} 
+0

+1但是,在這種情況下,我不會建議使用'global'。 – samayo

+1

我懷疑OP是在使用單元測試。 AFAIK,這是唯一的原因(雖然我不是測試專家)不使用全局狀態。 –

+0

@YourCommonSense:這很混亂,是原因。 –