从FORM转换到PHP的变量

时间:2013-05-12 07:16:41

标签: php html mysql forms

我的形式如下:

<form action="del.php" method="post" enctype="multipart/form-data">
Number of field to show:<input type="text" name="limit" /><br /><br /> 
Top category: 
<select name="topcat"> 
<option>tech</option>
<option>automobile</option>
</select><br /><br />
Base category: 
<select name="cat"> 
<option>mobile</option>
<option>computer</option>
</select> 

<input type="submit" />
</form>

我试图编写代码来从页面中选择的数据库中删除特定的id: del.php:

<head>
<?php
require_once('globals.php');// for database connection
?>
</head>
<body>
<?php

        $cat = $_POST['cat'];
    $topcat = $_POST['topcat'];
    $limit = $_POST['limit'];

if(isset($_GET['delete']))
{

    $query = 'DELETE FROM '.$cat.' WHERE id = '.(int)$_GET['delete'];
    echo $query;
    $result = mysql_query($query);
}



$query = 'select id,headline from '. $cat.' order by date DESC limit 0,'.$limit;
$result = mysql_query($query);
while($row = mysql_fetch_assoc($result))
{

$headline=$row['headline'];

    echo '<div class="record" id="record-'.$row['id'].'">
                <a href="?delete='.$row['id'].'" class="delete">Delete</a>
                <strong>'.$headline.'</strong>
            </div>';
}
?>

</body>

问题:当isset($_GET['delete']执行时,它表示未定义的变量cat。 但$cat定义为从以前的表单解析。 任何解决方案?

2 个答案:

答案 0 :(得分:2)

这是一个简短的课程

第一课

关于HTTP GET请求的课程:
从不永远永远不会......使用GET请求执行任何更新/删除操作请求滥用者搞砸您的应用程序,例如:SQL注入 POST请求比GET更安全,但这并不意味着无懈可击..总是消毒!

  

的htt://yourunsecureedwebsite/del.php删除= 10

滥用者将此请求发送到网页:

  

htt://yourunsecureedwebsite/del.php?delete = 10'或1 = 1'

你被搞砸了。整个表格被删除。因此,永远不要永远不要使用GET请求对数据库进行任何修改。

第2课:
始终始终总是逃避/清理GET和POST请求 在古代,我们曾经依靠mysql_real_escape_string()来保护恶意恶意请求。但是任何mysql_ *都有自己的漏洞,所以PHP守护者不赞成这个功能。

所以MysqliPDO来到我们的救援行程,其prepare()功能处理此恶意代码。不用担心注射了。 (我个人会加上更多的消毒)

现在您的代码:

正如我在评论部分中提到的,它看起来不像是不打算删除任何看起来只是一个搜索查询表单的表单,您可以在其中选择字段数和类别,并且使用POST请求提交from时显示数据根据查询。您实际上并未发送有关删除类别的任何请求。

以下是实现您想要的步骤: 首先,当您发布帖子请求时,请始终检查该页面是否已加载帖子请求。在您的情况下,您的第一行应该是:

if($_isset["submit"]){
    $cat = sanitize($_POST['cat']);
    $topcat = sanitize($_POST['topcat']);
    $limit = sanitize($_POST['limit']);
}

sanitize您必须创建的自定义函数来清理POST数据。 (something to get you started)。

现在数据库部分:通过一个关于如何实现MySQLi或PDO的小教程(nice tutorial and some knowledge about PDO

如果您还想删除类别以及表单,那么您将找到一种方法来检索该类别的ID,而不是将其删除: 你可以通过两种方式做到这一点: 1 GT;你可以发一个隐藏的id字段(不安全) 2 - ;根据您选择的类别从数据库中检索id。

注意:您一次只能执行GET请求或POST请求。有一些方法可以将值附加到URL,这可以模仿GET请求,但这是您学习过程中的另一个重要教程。

我建议在创建安全应用程序的教程之前,先在网上制作任何内容,因为有人喜欢乱搞。

的Dinesh

答案 1 :(得分:-3)

对所有发布的内容使用if(isset())结构,如果遇到问题,请使用else显示相关的疑难解答通知。

大概是$ delete是从表单复选框发送的,所以应该保存一个整数值并通过POST而不是通过GET。我会留给你的。