2014-03-04 25 views
0

我有這個變量來存儲函數的結果:$var check=mailExists($email,$link)。它應該是1或2,但總是會返回1 ... $email是要在DB處檢查的傳遞值,$link是一個mysqli處理程序。我也印刷的獲取結果在'rowsDEB',它總是顯示爲0。這裏是我的功能:爲什麼抓取不能在SQL中工作

function mailExists($email, $link){ 
    $stmt = ""; 
    $result = 1; //no such mail 
    $stmt = "SELECT email FROM users WHERE email = '$email'"; 
    mysqli_query($link,$stmt); 
    mysqli_stmt_store_result($stmt); 
    mysqli_stmt_bind_result($stmt); 

    $rows = 0; 
    while(mysqli_stmt_fetch($stmt)){ 
     $rows++;  
    } 
    $_SESSION['rowsDEB'] = $rows; 
    if(rows != 0) $result = 2; //mail exists in DB 

    mysqli_stmt_free_result($stmt); 
    mysqli_stmt_close($stmt); 
    discDB($link); 
    return $result; 
} 
+2

你需要重讀mysqli的手冊頁(見http://php.net/manual/en/mysqli- stmt.store-result.php) - $ stmt只是一個字符串,而不是一個mysqli_stmt - 看看手冊是如何創建它的。你不應該像這樣將一個變量傳遞給一個SQL語句;這是一個巨大的安全漏洞。 – OSborn

+0

我的電子郵件變量在另一個地方被檢查,安全性在這裏不是問題。 –

+0

請注意,您的函數會更好,更有效的計數查詢,而不是做一個選擇和迭代計數;爲你的方法返回1和2,而不是一個布爾值(或0和1) – Gorkk

回答

0

我不知道這個代碼是否有問題,但我已經改變了它,以及其他功能的一些其他修復,現在所有的作品都很好。另外我注意到我錯過了$if(rows != 0) $result = 2; //mail exists in DB所以這可能導致了這個問題。發現它後,我改變了一切......只發布功能代碼:

function mailExists($email, $link){ 
    $result = false; //no such mail 
    $query= "SELECT email FROM users WHERE email = '$email'"; 
    if($stmt = mysqli_prepare($link,$query)){ 
     mysqli_execute($stmt); 
     mysqli_stmt_store_result($stmt); 
     $rows = mysqli_stmt_num_rows($stmt); 
     mysqli_stmt_free_result($stmt); 
     mysqli_stmt_close($stmt); 
} 

$_SESSION['rowsDEB'] = $rows; 
if($rows > 0) $result = true; //mail exists in DB 

return $result; 

}

1

我假設你$link基本上是一個數據庫連接變量。這是簡單但有用的mysqli示例使用面向對象的方法。只在你的sql語句中使用select count,效率更高。

<?php 
function mailExists($email, $link){ 
    $sql= "SELECT COUNT(email) FROM users WHERE email = ? "; // use parameterized query 
    $stmt = $link-> prepare($sql); 
    $stmt -> bind_param('s',$email); // bind your variable to parameter 
    $stmt -> execute(); // execute the query 
    $stmt -> bind_result($CounterResult); // bind result into variable 
    $stmt -> store_result(); 
    $stmt -> fetch(); 
} 

return $CounterResult; // return total rows found 
?> 

我以here爲例。還有更多的例子可以幫助你。希望這可以幫助任何人,謝謝。

相關問題