抱歉,我不确定如何真正说出我的问题。在这里。
如果您转到我的页面http://www.eveo.org/stack/view.php,您会在右侧看到有“恢复”和“删除”的链接。如果它表示恢复,则数据库中“已删除”表的值为“y”。
问题:当我点击链接时,所有这些都会改变,而不仅仅是一个。我需要做的是当我点击其中任何一个“删除”或“恢复”时,只有该行将删除并恢复,并且只有该行链接更新,而其他所有行保持不变。根据链接,数据库中的值必须从“y”更改为“n”,反之亦然。
目前更改所有链接的代码是:
echo "<td><a href='view.php?'>";
$y="$row[deleted]";
$x="$row[id]";
if ($y == 'n'){
mysql_query("UPDATE inventory SET deleted = 'y' WHERE id='$row[id]'");
echo "delete";
}
else if ($y == 'y'){
mysql_query("UPDATE inventory SET deleted = 'n' WHERE id='$row[id]'");
echo "restore";
}
echo"</a></td>";
我一直试图解决这个问题几个小时,而且它无法正常工作。
要求:它必须使用URL重写,所以我不能用javascript或其他东西做这个改变,我个人会这样做,但这些是我教授的要求。
源代码:
VIEW.PHP
<?php { ?>
<table border="0" cellpadding="0" cellspacing="0" id="table">
<thead>
<tr>
<th>ID</th>
<th>NAME</th>
<th>MANUFACTURER</th>
<th>MODEL</th>
<th>DESCRIPTION</th>
<th>ON HAND</th>
<th>REORDER</th>
<th>COST</th>
<th>PRICE</th>
<th>SALE</th>
<th>DISCOUNT</th>
<th>DELETE</th>
</tr>
</thead>
<tbody>
<?php } ?>
<?php
// while($r = mysql_fetch_array($resultDeleted))
// {
// echo $r[0];
// }
?>
<?php while($row = mysql_fetch_array($result)) {
echo "<tr>";
echo "<td>$row[id]</td>";
echo "<td>$row[name]</td>";
echo "<td>$row[manufac]</td>";
echo "<td>$row[model]</td>";
echo "<td>$row[descrip]</td>";
echo "<td>$row[onhand]</td>";
echo "<td>$row[reorder]</td>";
echo "<td>$row[cost]</td>";
echo "<td>$row[price]</td>";
echo "<td>$row[sale]</td>";
echo "<td>$row[discont]</td>";
echo "<td><a href='view.php?'>";
$y=$row[deleted];
$x=$row[id];
if ($y == 'n'){
mysql_query("UPDATE inventory SET deleted = 'y' WHERE id='$row[id]'");
echo "delete";
}
else if ($y == 'y'){
mysql_query("UPDATE inventory SET deleted = 'n' WHERE id='$row[id]'");
echo "restore";
}
echo"</a></td>";
echo "</tr>";
} ?>
<?php { ?>
</tbody>
</table>
<?php } ?>
答案 0 :(得分:0)
你想要的东西不会那样。每次刷新时,您的代码都会更改数据库条目。为了说明,如果您要继续刷新页面,链接将无限期地从已删除更改为已恢复,反之亦然。
你需要做的是从循环中取出这两个更新的clausules,给每个链接一个id。
的内容if ($y == 'n'){
echo "<a href='view.php?link_id=$row[id]&case=delete'>delete</a>";
}
else if ($y == 'y'){
echo "<a href='view.php?link_id=$row[id]&case=restore'>restore</a>";
}
然后在循环上方的某个位置进行实际更新。
if(!empty($_GET['link_id'])) {
if($_GET['case'] == 'restore') {
// udpate
} else {
// update
}
}
另一种方法是使用表格。然后你就会抓住帖子请求并做同样的事情。
if($_SERVER['REQUEST_METHOD'] == 'POST') {
// do stuff
}
或
if(!empty($_POST)) {
// do stuff
}
答案 1 :(得分:0)
您需要将id传递给查询,可能是这样的:
<?php while($row = mysql_fetch_array($result)) {
if($row['deleted']=='y'){$status='restore';}else{$status='delete';}
echo "<tr>";
echo "<td>{$row['id']}</td>";
echo "<td>{$row['name']}</td>";
echo "<td>{$row['manufac']}</td>";
...
echo "<td><a href='view.php?id={$row['id']}&do=$status'>".ucfirst($status)."</a></td>";
echo "</tr>";
?>
然后让脚本收到更改值的请求,这样的内容会出现在脚本的顶部:
<?php
if(isset($_GET['id']) && is_numeric($_GET['id']) && isset($_GET['do'])){
$set=null;
$id=(int)$_GET['id'];
if($_GET['do']=='delete'){$set='n';}
if($_GET['do']=='restore'){$set='y';}
if($set != null){
mysql_query("UPDATE inventory SET deleted = '$set' WHERE id='$id'");
}
}
?>
答案 2 :(得分:0)
您似乎正在尝试使用以下代码获取$_GET
变量:
$y="$row[deleted]";
$x="$row[id]";
这永远无法奏效。首先,您不需要在变量周围添加双引号。其次,获取$_GET
变量的正确语法是:
$delete = $_GET['delete'];
$id = $_GET['id'];
正如您所看到的,我已经为您的变量名称提供了更好的描述性名称。
其次,当您只是将这些变量添加到查询中时,您的应用程序中会有一个巨大的SQL injection hole:
mysql_query("UPDATE inventory SET deleted = 'y' WHERE id='$id'");
如果我是黑客,我会添加id
:1' or 1=1
,这将导致以下查询:
UPDATE inventory SET deleted = 'y' WHERE id='1' OR 1=1
然后突然我在表格中设置了所有记录的删除状态。我甚至可以使用这种攻击进入其他表,无论我想做什么。
所以你应该总是使用mysql_real_escape_string()
:
$id = mysql_real_escape_string($_GET['id']);
mysql_query("UPDATE inventory SET deleted = 'y' WHERE id='$id'");
所以您将获得以下内容:
$delete = mysql_real_escape_string($_GET['delete']);
$id = mysql_real_escape_string($_GET['id']);
mysql_query("UPDATE inventory SET deleted = '$delete' WHERE id='$id'");
另一件事是你不需要继续打开和关闭PHP标签。仅当您要添加一些HTML时。
下一步:
而不是回复所有内容,只需使用HEREDOC:
所以不要这样做:
echo "<tr>";
echo "<td>$row[id]</td>";
echo "<td>$row[name]</td>";
echo "<td>$row[manufac]</td>";
echo "<td>$row[model]</td>";
echo "<td>$row[descrip]</td>";
echo "<td>$row[onhand]</td>";
echo "<td>$row[reorder]</td>";
echo "<td>$row[cost]</td>";
echo "<td>$row[price]</td>";
echo "<td>$row[sale]</td>";
echo "<td>$row[discont]</td>";
echo "<td><a href='view.php?'>";
您可以这样做:
echo <<<HTML
<tr>
<td>{$row['id']}</td>
<td>{$row['name']}</td>
etc
FOOBAR;
正如您所看到的,它需要引号来获取数组元素。
之后你应该建立你的链接:
$delete = 'n';
if ($row['deleted'] == 'n') {
$delete = 'y';
}
echo '<a href="view.php?id=' . $row['id'] . '&delete=' . $delete . '">delete</a>';
作为一般性说明:
始终在设备环境中启用ERROR REPORTING ,这样您就可以看到f *&amp; k发生/错误的原因。所以把它放在脚本的顶部:
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);