2011-06-07 95 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'])) {