如何只使用PHP动态更改一个链接?

时间:2012-02-17 22:45:42

标签: php mysql

抱歉,我不确定如何真正说出我的问题。在这里。

如果您转到我的页面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 } ?>

3 个答案:

答案 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'");

如果我是黑客,我会添加id1' 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);