2013-10-07 32 views
1

PHP的登錄頁面,我有這些代碼和它給我一個錯誤 '警告:mysql_num_rows()預計參數1是資源':MySQL和與mysql_num_rows

PHP:

<?php 
@error_reporting(0); 
@session_start(); 
@include("sql.php"); 
$log_error = ""; 

if(isset($_POST['send'])) { 
$user = protect($_POST['username']); 
$pass = protect($_POST['password']); 
$q = mysql_query("SELECT * FROM login WHERE name = '".$user."' and pass = '".$pass."'",$sqlc); 
$count = mysql_num_rows($q); 

if($count > 0) { 
    $_SESSION['username'] == $user; 
    header('Location: index.php'); 
    $log_error = "0"; 
} else { 
    $log_error = "1"; 
} 
} 
?> 

HTML:

<table border="0"> 
     <form action="" method="post"> 
      <tr> 
       <td colspan="2" style="width:100%;"><span>Login</span></td> 
      <tr> 
      <tr> 
       <td>Username:</td> 
       <td><input type="text" name="username" value="" /></td> 
      </tr> 
      <tr> 
       <td>Password:</td> 
       <td><input type="password" name="password" value="" /></td> 
      </tr> 
      <tr> 
       <td colspan="2" style="width:100%;"><input type="submit" name="send" value="Login" /></td> 
      </tr> 
      </form> 
     </table> 

和SQL連接(sql.php):

<?php 
$Host = 'localhost'; 
$User = 'dash_sys1'; 
$Pass = '123456Ben'; 
$DB = 'dash_sys1'; 

$sqlc = mysql_connect($Host,$User,$Pass) or die(mysql_error()); 
mysql_select_db($DB) or die(mysql_error()); 
function protect($str) { 
return htmlspecialchars(mysql_real_escape_string(trim($str))); 
} 
?> 

它給了我一個錯誤:警告:mysql_num_rows()期望參數1是資源,布爾在第11行給出C:\ wamp \ www \ cms \ admin \ login.php

我做錯了什麼?

+0

這意味着mysql_query失敗。檢查查詢並嘗試添加'或die()'到它的末尾。您也應該遠離已棄用的mysql_ *函數,並切換到PDO或mysqli,因爲mysql_ *函數將在下一版本的PHP中刪除。 – aynber

+0

連接代碼似乎是正確的。必須是你的mysql連接設置不正確。無論如何,我注意到在$ _SESSION ['username'] == $ user;'行中設置會話變量時存在一個錯誤。應該是'$ _SESSION ['username'] = $ user;'。 – Rajesh

+0

@Rajesh - 這不是連接數據庫的問題;這是因爲mysql_query返回了一個布爾值,這通常意味着SQL中存在錯誤。但是OP沒有檢查返回值,或者查看是否有'mysql_error()' – andrewsi

回答

0

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given

這意味着您已將一個非資源傳遞給函數。那麼爲什麼$ q是一個非資源?如果您的SQL查詢中有錯誤或使用該函數,則mysql_query()函數返回一個布爾值false值。所以$ q被賦值爲false值,而不是查詢結果資源。然後你將$ q傳遞給mysql_num_rows(),這不會起作用。

您應該始終檢查mysql_query()的返回值false結果。

$q = mysql_query("SELECT * FROM login WHERE name = '".$user."' and pass = '".$pass."'",$sqlc); 
if ($q === false) { 
    trigger_error(mysql_error($sqlc), E_USER_ERROR); 
} else { 
    $count = mysql_num_rows($q); 
} 
0

我可以建議的唯一的事情是,切換到MySqli,它比普通的mysql更容易處理。

此外,它出現在您的查詢相反它應該是什麼,嘗試做如下:

$q = mysql_query($sqlc, "SELECT * FROM login WHERE name = '".$user."' and pass = '".$pass."'"); 

嘗試,如果它不工作,讓我知道!

+2

PDO甚至比'mysqli'更好,因爲它除了使用更通用的'?'命名之外,還命名了像':user'這樣的佔位符。 – tadman

+0

mysql_query()期望第一個參數是SQL字符串,第二個可選參數是連接資源。 –

+0

真的嗎?我將不得不更多地研究PDO,並且我將在普通MySQL中進行一次複習,顯然它已經有一段時間了,我已經忘記了!我的錯! –