2013-02-21 149 views
0

我现在已经跑到了墙上,这段代码在每条记录的末尾带出一个带有按钮的表格。一旦按下此按钮,则会执行一个功能,以将健康记录更新为-5。更新单个记录通过ID = ID

这对工作很好,但它影响所有行,我试图让它只通过ID触摸一个记录,但没有运气!如果你能帮到那就太好了!

php的

$sql="SELECT `id` , `FirstName` , `Health` FROM ajax_demo WHERE `id` = `id` LIMIT 0 , 30"; 
$result = mysql_query($sql); 


if(isset($_REQUEST['submit'])) 
{ 
counterminus(); 
} 
    function counterminus() 
{ 
$cmeter = $cmeter - 1; 

$id = $_POST["id"]; 
$FirstName = $_POST["FirstName"]; 

mysql_query("UPDATE ajax_demo SET `Health` = `Health` - `Damage` WHERE id = {$id}"); 
Header("location:oo_test.php"); 
} 

这是PHP /形式

<?php 
echo 
"<table border='1'> 
<tr> 
<th>id</th> 
<th>Firstname</th> 
<th>health</th> 
</tr>"; 

while($row = mysql_fetch_row($result)) { 
    echo '<tr>'; 
    foreach($row as $cell) { 
     echo "\n<td>$cell</td>"; 
} 
echo '<td><form id="theForm" action="" method="POST" > 
<input type="submit" name="submit" id="submit" value="Attack" /> 
<input type="hidden" name="'.$row[1].'" /></form></td></tr>'; 
echo "\n\n"; 
}?> 
+0

“这是表单”不是表单,而是PHP代码。真正的形式在浏览器中呈现 – 2013-02-21 14:05:36

回答

-1

你为什么写{ID},而不是$ ID?

加上你的代码是完全不安全的,可以很容易地改变和黑客入侵。

您应该尝试使用PDO代替也折旧的mysql_query。 http://php.net/PDO

+0

'{$ id}'在字符串插值中是有效的PHP,并且对于使用下划线的情况非常有用。 ''foo_ $ bar_baz“'与''foo _ {$ bar} _baz”'有不同的含义。 – slugonamission 2013-02-21 14:04:08

+0

噢,我不知道。当我有更多时间时,我会深入研究它。感谢您的信息:) – 2013-02-21 14:07:59

+0

http://www.php.net/manual/en/language.types.string.php#language.types.string.parsing - 查看复杂/曲线语法。此外,我的例子可能是另一种方式,大括号内有'_baz',我不记得PHP中的字符串插值在哪里停止... – slugonamission 2013-02-21 14:10:10

0

这是可以通过$_POST['id']变量进行攻击的。使用mysql_real_escape_string或更好的方式,通过PDO或MySQLi准备好的查询,无论如何,这与您遇到的问题是正交的,只是知道它的一个好主意。

你永远不会提交一个名为id的HTML表单域。另外,在你的HTML中,$row将在你的while循环之外的地址是NULL,所以在第一个地方将会是undefined。这将意味着隐藏字段的名称将为空白,并且您的SQL正在说UPDATE WHERE id=,这是无效的并会导致错误。

要解决此问题,您需要提交一个名为“id”的表单字段,以便$_POST['id']实际上包含一个值。

+0

你可能给我一个使用mysql_real_escape_string的例子吗?我会尝试添加文本框或类似的内容,以便为我提供一个值得使用的值。 – user1284386 2013-02-21 14:20:13

+0

您是否阅读过手册? – slugonamission 2013-02-21 15:17:55