2013-04-02 40 views
0

還挺新,以MySQL和PHPHTML按鈕,使用PHP

我有我的網站上的每一頁,並且列出所有頁面和命中的私人頁面點擊計數器在MySQL數據庫重置場。 我有一個按鈕,將所有頁面重置爲零,並在每個頁面列表旁邊我有一個重置按鈕,將單獨重置每個頁面。這一切都使用文本文件,但現在我正在開發MySQL數據庫。我編寫了「重置所有」按鈕,但無法使單個頁面按鈕正常工作。

處理代碼爲:

if($_POST[ind_reset]) { 
$ind_reset = $_POST[ind_reset]; 
mysql_connect("server", "username", "password") or die(mysql_error()); 
mysql_select_db("database") or die(mysql_error()); 
    $sql = 'UPDATE counters SET Hits =\'0\' WHERE Page = \'$ind_reset\';'; 
     } 

和HTML表單代碼是一個字符串:

$page_reset = "<form id='Reset' action='counter_update.php' method='post'> 
    <button type='submit' name='ind_reset' value='$formPage'>RESET</button> 
    </form>"; 
+0

請在創建[SQL注入漏洞](http://bobby-tables.com/)之前閱讀[正確的SQL轉義](http://bobby-tables.com/php)巨大的它毀了你的一天。您必須轉義任何和用戶提供的所有輸入查詢的值,否則您將遇到麻煩。 – tadman

+0

..第一眼看到這個代碼產生像$ _POST [ind_reset]這樣的問題。也許是「ind_reset」? – 2013-04-02 18:56:21

+0

感謝您的快速響應! –

回答

0

讓我們先從第一件事:

if($_POST[ind_reset]) { 

應該

if($_POST['ind_reset']) { 

它沒有引號,因爲PHP默默地糾正了你的錯誤。如果您將錯誤報告轉換爲E_ALL,您將看到錯誤消息。

你需要考慮的一件事是你永遠不能相信POST數據是你認爲它應該是。也許你會輸入一個錯字。也許黑客向你發送虛假的POST數據。無論它是什麼,如果錯誤的東西被放入數據庫更新中,它會弄亂你的代碼。出於這個原因,不應該簡單地將POST值插入到數據庫中,而應該有一個檢查器來確保該值是有效的值。當我這樣做時,我會創建一組可能的值,並在更新或插入數據庫時​​僅使用這些值。例如:

$pages = array('value_on_page'=>'value_put_in_database', 
       'xyz'=>'thing_in_database_2'); 
//the valid things to post are either 'value_on_page' or 'xyz', 
//but what goes into the database are the values those keys point to 
//e.g. if $_POST['ind_reset'] == 'xyz', $ind_reset will be 'thing_in_database_2' 

$key = $_POST['ind_reset']; 
if(!isset($pages[$key])) { 
    //if that posted value isn't a key in the array, it's bad 
    error_log('Invalid posted page'.$key); 
} else { 
    //this is a valid posted page 
    $ind_reset = $pages[$key]; 

    //** do the database stuff right here in this spot **// 
} 

現在,您發佈的代碼不工作的原因,你缺少做一個數據庫查詢的最後,關鍵的部分:在您實際運行查詢的一部分。

$conn = mysql_connect("server", "username", "password") or error_log(mysql_error()); 
    mysql_select_db("database") or error_log(mysql_error()); 
    $sql = 'UPDATE counters SET Hits =\'0\' WHERE Page = \'$ind_reset\';'; 
    mysql_query($sql, $conn) or error_log(mysql_error()); 

我希望你已經注意到我用「error_log」替換了「死」。如果你做error_log(mysql_error(),1,'[email protected]'),它會通過電子郵件發送給你。否則,就像在我的例子中那樣,它會被放到你係統的錯誤日誌文件所在的位置。然後,您可以對數據庫錯誤有一個很好的記錄,這樣,當您不可避免地返回到StackOverflow並提出更多問題時,您可以準確告訴我們發生了什麼。如果您使用的是文件,請確保將錯誤日誌文件的名稱(我根據當天的日期命名)或定期清除它,否則它會變得非常長。

使用您在評論中發佈的mysqli代碼是比mysql_ *函數更好的主意,但是您並不完全正確。 「bind_param」部分將變量粘貼到問號所在的位置。如果你的變量是一個字符串,那麼你先輸入「s」,或者如果它是一個整數,那麼你先輸入「i」等。並且確保在完成之後關閉它們。

$db = new mysqli("server", "username", "password", "database"); 
    if(!$db->connect_errno) { 
     $stmt = $db->prepare("UPDATE counters SET Hits = '0' where Page = ?"); 
     $stmt->bind_param('s',$ind_reset); //assuming $ind_reset is a string 
     if(!$stmt->execute()) { 
      error_log($stmt->error); 
     } 
     $stmt->close(); 
    } else { 
     error_log($db->connect_error); 
    } 
    $db->close(); 
+0

非常感謝spsc_tech的解釋。我總是願意學習我做錯了什麼,而不是讓別人改正它!不勝感激!!還沒有嘗試過,但很快就會這樣做。只是爲了清除,這裏沒有用戶輸入,它只是我和按鈕的價值/名稱,但很好知道將來!很快就會回來! –

+0

嘗試了一些更改後,唯一有效的是你的mysqli代碼。我仍然在研究這個以找出原因,但問題解決了!再次感謝! –

+0

謝謝你接受我的回答,所以我得到了聲望點。 :)我強烈建議在學習時打開E_ALL錯誤報告,以便看到所有錯誤,然後在完成時關閉它。 – miyasudokoro