2010-10-19 63 views
0

我正在使用一個簡單的PHP腳本來激活我的某個應用程序的一部分。應用程序向頁面發佈一個變量(http://validate.zbrowntechnology.info/WebLock.php?method=validate)。變量是序列號,發佈爲'Serial'。每次發佈到此頁面時,它都會返回無效。下面是代碼:發佈變量返回無效

<?php 

$serial = $_POST['Serial']; 
$method = $_GET['method']; 

$con = mysql_connect("HOSTHERE", "USERHERE", "PASSHERE"); 
if(!$con) { 
    die('Unable to connect to MySQL: ' . mysql_error()); 
} 


if($method == "validate") { 

    mysql_select_db("zach_WebLock", $con); 

    $query = "SELECT Key, Status FROM Validation WHERE Key='".mysql_real_escape_string($serial)."'"; 
    $result = mysql_query($query); 
    if(mysql_num_rows($result) > 0) { 
    echo "Valid"; 
    } else { 
    echo "Invalid"; 
    } 
} else { 
    echo "Unkown Method"; 
} 
?> 

以下是錯誤從PHP,

PHP的警告:)mysql_num_rows(預計參數1是資源,布爾給

+0

嘗試增加一個else語句。如果($方法==「驗證」){//這裏的代碼}其他{回聲「無法」; } – mellowsoon 2010-10-19 04:56:45

+2

在詢問腳本有什麼問題之前,您應該嘗試直接在MySQL中發出查詢。 「SELECT鍵,狀態FROM驗證WHERE鍵='123'」或任何你認爲串行值。 – mellowsoon 2010-10-19 05:03:18

+0

@mellowsoon,試過了,它正常返回。 – 2010-10-19 05:05:42

回答

3

在查詢之後使用mysql_error()來查看發生了什麼。而Key對於列名是個不好的選擇,因爲它是SQL中的保留字。你可以把它放在``中告訴MySQL它是一個標識符。做一些更多的調試是這樣的:

... 
if (!mysql_select_db("zach_WebLock", $con)) die('mysql_select_db failed'); 

$query = "SELECT `Key`, Status FROM Validation WHERE `Key`='".mysql_real_escape_string($serial)."'"; 
print "query=$query<br>\n"; 
$result = mysql_query($query, $con); 
print "error=" . mysql_error($con); 
... 
+0

爲你+1!這就是問題所在!謝謝! – 2010-10-19 05:29:04

+0

鍵列名稱?我討厭什麼時候發生。我最近接管了一個數據庫,在幾個表中有一個名爲'date'的列。 – gregjor 2010-10-19 05:32:43

+1

爲了公平起見,下面的一些人告訴你在30分鐘前做同樣的事情;) – mellowsoon 2010-10-19 05:33:05

0

嘗試喜歡這個
$query = "SELECT Key, Status FROM Validation WHERE Key='".$serial."'";

+0

這沒有什麼區別。如果您使用雙引號將字符串中的變量替換爲其值。 – Mischa 2010-10-19 04:52:51

+0

謝謝,現在它返回一些東西。但是,無論我POST什麼密鑰,它都會返回無效。臨時密鑰是_2772_。 – 2010-10-19 04:55:08

0

如果在最後一行添加了這個,會發生什麼?

else echo 'Unknown method'; 

什麼可能發生的情況是沒有得到填充的$ _ POST和$ _GET,這是在php.ini中的設置,如果我沒有記錯(搜索在PHP的文檔「超全局變量」)。

編輯:另外,您的安全風險非常糟糕,谷歌「SQL注入」。基本上問題是你可以直接將任何SQL直接加入到你的數據庫中,並且如果php用戶擁有足夠的權限,這意味着任何人都可以從你的驗證表中刪除所有的數據。你至少應該做這樣的事情:

$query = "SELECT Key, Status FROM Validation WHERE Key='".addslashes($serial)."'"; 
+0

它仍然返回_Invalid_。 – 2010-10-19 04:57:47

+1

使用mysql_real_escape_string()代替addslashes() – mellowsoon 2010-10-19 04:58:26

+0

@mellowsoon,謝謝!我完全忘記了SQL注入。 – 2010-10-19 05:00:25

1

你錯過了這條線一個右括號:

if(mysql_num_rows($result) > 0 { 

是缺少您的代碼或只是你的問題?

您可能還需要查詢

+0

對不起,更正了。 – 2010-10-19 04:55:42

+0

是的,很好看! – Mischa 2010-10-19 04:56:34

+0

@Zach,這是否意味着它現在有效? – Mischa 2010-10-19 04:56:58

0

後添加

if (!$result) { 
    print mysql_error(); 
} 

這可能是一個錯字,但你在這裏缺少一個右括號:

if(mysql_num_rows($result) > 0 { 
          ^ 

,你可能已經轉向關閉你的錯誤報告,在這種情況下,你會得到一個空白頁面。

0

嘗試呼應$串行:

echo $serial; 

而且是你在表單輸入的內容?

+0

是的,它返回正確的密鑰。 – 2010-10-19 05:18:59

+0

好的,但你確定你選擇了正確的數據庫與驗證表嗎?我知道這是一個愚蠢的問題,但這種事情有時候會發生。 – Winis 2010-10-19 05:27:46

+0

嘗試回顯mysql_real_escape_string($ serial)的值。它仍然是一樣的嗎? – mwotton 2010-10-19 05:28:32