2011-06-07 94 views
2

HTML:PHP/SQL腳本增加一個記錄字段的值不更新記錄

<form> 
    <input type="radio" name="grade" value=95 /> A<br /> 
    <input type="radio" name="grade" value=85 /> B<br /> 
    <input type="radio" name="grade" value=75 /> C<br /> 
    <input type="radio" name="grade" value=65 /> D<br /> 
    <input type="radio" name="grade" value=50 /> F 
</form> 

PHP:

if (isset($_POST['grade'])) { 
        $name = $_POST['name']; 
        $grade = $_POST['grade']; 
        $sql = "UPDATE grade SET 
        total=total+'$grade', 
        numvotes=numvotes+1 WHERE 
        name='$name'"; 

大家好......我工作的一個項目,在菜單上添加與名稱關聯的等級。我的等級徑向菜單的HTML代碼位於上方,我的相關SQL也會顯示出來。我想從等級中添加一個NUMBER VALUE到我的SQL數據庫中的「total」,並將投票數增加1.我不確定我的語法是否正確,因爲數據庫沒有得到其投票或成績的增加總。 謝謝!

編輯:爲什麼我感到困惑,這不起作用的部分原因是b/c當我進入mySQL控制檯時,我可以做一個幾乎相同的命令(其中'$ grade'是一個數字),它的工作原理。至少我應該得到一個錯誤,或者numvotes應該增加,但沒有。

編輯2:信貸給拉杜捕捉此。我的名字菜單無法正常工作。在我的SQL語句後使用$ die之後,我發現從下拉菜單中選擇的名稱被解釋爲整數,而不是名稱。它將由數據庫中的SQL名稱填充。這是我的代碼。

<?php 
    $query = mysql_query("SELECT name, id FROM grade"); 
    echo "<select name='name'>"; 
     while ($temp = mysql_fetch_assoc($query)) { 
      echo "<option value='".$temp['name']."'>".$temp['name']." </option>"; 
     } 
    echo "</select>"; 
?> 

EDIT3:改變$temp['id']$temp['name']後,我發現我現在die($sql)讀取:

UPDATE grade SET total=total+'95', numvotes=numvotes+1 WHERE name='charlie' 

所以名字進去,但它仍然不會得到更新。想法?

+3

你的類將有直接與該代碼的A。 – 2011-06-07 19:37:29

+0

爲什麼不保存每個提交的名稱和分數,然後您可以計算按名稱提交的分數以及用一個簡單的查詢計算總分數。 – NightHawk 2011-06-07 19:41:41

+3

小調 - 應該引用''標記中的值屬性。實際上,所有的HTML屬性都會得到引號。 – 2011-06-07 19:42:46

回答

3

您在SQL查詢中使用名稱作爲字符串。所以改變如下:

echo "<option value='".$temp['id']."'>".$temp['name']."</option>"; 

到:

echo "<option>".htmlspecialchars($temp['name'])."</option>"; 

對於當前的一些項目,總是使用htmlspecialchars()echo()荷蘭國際集團的東西到瀏覽器,並總是使用mysql_real_escape_string()構成從用戶的SQL查詢時輸入。

例如,在一個實時項目中,您應始終使用$name = mysql_real_escape_string($_POST['name'])而不是簡單的$name = $_POST['name']

+0

這樣做。謝謝!!!!!! – tnw 2011-06-07 20:26:13

+1

不客氣。不要忘記在真實的活動項目中使用'htmlspecialchars()'和'mysql_real_escape_string()'。這樣做只會有好處。 – rid 2011-06-07 20:28:50

+0

@Tory @Radu:實際上,在實際的活動項目中,你不應該連接SQL字符串;您應該使用[準備好的語句](http://php.net/manual/en/pdo.prepared-statements.php)。那麼你沒有機會意外忘記逃離繩子。 – 2011-06-07 22:02:58

3

在查詢後

numvotes=numvotes+1 

刪除,

+0

這似乎應該工作,但我仍然得到相同的行爲。不過,我改變了這一點。謝謝。 – tnw 2011-06-07 19:44:52

1
USERS 
----- 
id AUTO_INCREMENT 
name 

VOTES 
----- 
id AUTO_INCREMENT 
user_id 
grade 

INSERT INTO votes (user_id, grade) VALUES (1, 95); 
INSERT INTO votes (user_id, grade) VALUES (1, 85); 
INSERT INTO votes (user_id, grade) VALUES (2, 75); 

然後讓計票的第一個用戶:

SELECT count(*) total_votes FROM votes WHERE user_id = 1; 

而得到的分數:

SELECT sum(grade) total_score FROM votes WHERE user_id = 1; 

這是未經測試的,但應該讓你在正確的軌道上。

+0

我有點困惑這.... USERS表實際上做了什麼? – tnw 2011-06-07 19:57:15

+0

它基本上存儲有關用戶的信息。然後,如果有關用戶的任何事情發生變化,例如姓名,您的查詢仍然有效,您將獲得該用戶的所有投票。它可以防止數據異常。 – NightHawk 2011-06-07 20:01:14

+0

這可能是一種更好的存儲數據的方式;不幸的是,它沒有解決OP的問題,即他的SQL似乎沒有在數據庫上執行。 – 2011-06-07 20:14:56

1

很可能就是你的榜樣監督,但標籤應該是

<form method="post"> 

否則這種情況將永遠不會觸發,如表單默認使用GET方法

if (isset($_POST['grade'])) {