2014-07-15 55 views
-1
<?php 
$link = mysqli_connect('localhost','root','root'); 
$link->query('CREATE DATABASE IF NOT EXISTS users'); 
$link->Select_db('users'); 

$sql='SELECT id FROM users WHERE email = '.$useremail.' AND username = '.$username; 
$results = $link->query($sql); 
$numrows = $results->num_rows; 

if ($numrows == 1) { 
    #update user information 
} else { 
    #failed to update 
} 
?> 

它只適用於部分時間,我無法從這種或那種方式找出錯誤。我可以確認錯誤在$ numrows = $ results-> num_rows中彈出;行,但至於爲什麼,我迷路了。偶爾它會按預期工作,所以任何和所有的建議,我可以做些什麼來解決它,或者至少幫助我更好地理解它是非常感謝。謝謝!我的num_rows在哪裏失敗?

回答

1

使用雙引號查詢和varchar /字符串傳遞用單引號

$sql="SELECT id FROM users WHERE email = '".$useremail."' AND username = '".$username."'"; 
$results = $link->query($sql); 
$numrows = $results->num_rows(); 
+0

這也經過測試,並沒有任何明顯的問題通過。在原來的代碼中,我們確實使用了'「。$ var ...等等。問題在於num_rows失敗。在它引發致命錯誤之後放置一個開放/關閉括號115.雖然我很欣賞輸入,你的建議並沒有改善num_rows的情況,抱歉。 – user3757125

0

,你對num_rows呼叫產生的錯誤是,你的查詢有一個錯誤,並且query()返回,而不是原因一個有效的結果資源。因爲嘗試以錯誤值調用方法是致命錯誤,所以在使用它之前,應始終檢查返回值query()。例如:

if (!($result = $link->query($sql))) { 
    die($link->error); 
} 

問題與您的查詢:

  • 您創建一個名爲users數據庫並默認數據庫,然後運行從名爲users SELECT查詢。您剛剛創建的數據庫中不會有表格。在SQL中,我們對錶而不是數據庫使用SELECT(這是兩種不同的東西,類似於文件系統目錄中包含的文件)。

  • 您不會在您的SQL語句中引用字符串參數。例如,該SQL將是一個錯誤:

    SELECT id FROM users WHERE email = [email protected] AND username = bill 
    

    它應該是這個:

    SELECT id FROM users WHERE email = '[email protected]' AND username = 'bill' 
    

    我知道行情會比較混亂,因爲你有PHP字符串引號,然後SQL字符串引號,但這裏是完成它的幾種方法:

    $sql='SELECT id FROM users WHERE email = \''.$useremail.'\' AND username = \''.$username.'\''; 
    $sql="SELECT id FROM users WHERE email = '".$useremail."' AND username = '".$username."'"; 
    $sql="SELECT id FROM users WHERE email = '{$useremail}' AND username = '{$username}'"; 
    
  • 我不知道你是否有適當的保護你的PHP變量。您必須從不將PHP變量內插到SQL字符串中,除非您已經轉義了變量的內容。

    $useremail_esc = $link->real_escape_string($useremail); 
    $username_esc = $link->real_escape_string($username); 
    $sql="SELECT id FROM users WHERE email = '{$useremail_esc}' AND username = '{$username_esc}'"; 
    
  • 但它會更好地使用與參數佔位符的預處理語句。這比轉義變量更容易使用,並且更可靠。這裏有一個例子:

    $sql="SELECT id FROM users WHERE email = ? AND username = ?"; 
    $stmt = $link->prepare($sql); 
    $stmt->bind_param("ss", $useremail, $username); 
    $stmt->execute(); 
    $result = $stmt->get_result(); 
    

    請注意,您在使用參數,你不把周圍的?佔位符SQL報價不使用逃逸。

+0

從那裏,我只使用$ result-> num_rows? (對於引語感到抱歉,我從記憶中輸入了這些信息,並且有些細節往往會滑落,所涉及的數據庫完全充實,並且條目已存在,但無論返回的是0還是0.) – user3757125

+0

對不起,我這仍然有一些麻煩。 $ stmt-> get_resut()返回一個未定義函數的錯誤。 – user3757125

+0

'get_result()'函數僅在您有mysqlnd時可用,默認情況下應該在PHP 5.4.0及更高版本中啓用。請參閱http://us1.php.net/manual/en/mysqlnd.install.php –

相關問題