用html格式编辑mysql表

时间:2009-10-08 21:51:35

标签: php mysql forms content-management-system login

我的目标是拥有一个简单的基于表单的CMS,以便客户端可以通过html表单登录和编辑MySQL表数据。登录工作正常,但编辑页面没有返回MySQL表中的值,也没有出现任何错误。

我仍然是业余爱好者,我首先为类项目启动了以下代码,但现在计划为实时站点实现它。根据我的理解,我不应该声明下一个/上一个/等。顶部的变量,无论如何我尝试这样做都没有成功。有什么特别突出的吗?:

<?php

echo "<h2>Edit Special Offer</h2><hr>";

if (isset($_COOKIE["username"]))
    {
    echo "Welcome " . $_COOKIE["username"] . "!<br />";
    include "login.php";
    }
else
  echo "You need to log in to access this page.<br />";


if(isset($previous))
{
$query = "SELECT id, specialtitle, specialinfo
FROM special WHERE id < $id ORDER BY id DESC";
$result = mysql_query($query);
check_mysql();
$row = mysql_fetch_row($result);
check_mysql();
if ($row[0] > 0)
{
$id = $row[0];
$specialtitle = $row[1];
$specialinfo = $row[2];
}
}


elseif (isset($next))
{
$query = "SELECT id, specialtitle, specialinfo
FROM special WHERE id > $id ORDER BY id ASC";
$result = mysql_query($query);
check_mysql();
$row = mysql_fetch_row($result);
check_mysql();
if ($row[0] > 0)
{
$id = $row[0];
$specialtitle = $row[1];
$specialinfo = $row[2];
}
}



elseif (isset($add))
{
$query = "INSERT INTO special (specialtitle, specialinfo)
VALUES ('$specialtitle', '$specialinfo')";
$result = mysql_query($query);
check_mysql();
$id = mysql_insert_id();
$message = "Special Offer Added";
}


elseif (isset($update))
{
$query = "UPDATE special
SET specialtitle='$specialtitle', specialinfo='$specialinfo'
WHERE id = $id";
$result = mysql_query($query);
check_mysql();
$id = mysql_insert_id();
$message = "Monthly Special Updated";
}


elseif (isset($delete))
{
$query = "DELETE FROM special WHERE id = $id";
$result = mysql_query($query);
check_mysql();
$specialtitle = "";
$specialinfo = "";
$message = "Special Offer Deleted";
}
$specialtitle = trim($specialtitle);
$specialinfo = trim($specialinfo);
?>



<form method="post" action="editspecial.php">
<p><b>Special Offer</b>
<br><input type="text" name="specialtitle" <?php echo "VALUE=\"$specialtitle\"" ?>> </p>

<p><b>Special Info/Description</b>
<br><textarea name="specialinfo" rows="8" cols="70" >
<?php echo $specialinfo ?>
</textarea> </p>

<br>
<input type="submit" name="previous" value="previous">
<input type="submit" name="next" value="next">
<br><br>
<input type="submit" name="add" value="Add">
<input type="submit" name="update" value="Update">
<input type="submit" name="delete" value="Delete">
<input type="hidden" name="id" <?php echo "VALUE=\"$id\"" ?>>
</form>
<?php
if (isset($message))
{
echo "<br>$message";
}
?>

的login.php:

<?php

function check_mysql()
{
if(mysql_errno()>0)
{
die ("<br>" . mysql_errno().": ".mysql_error()."<br>");
}
}
$dbh=mysql_connect ("xxxxxxxxxxxxxxxxx","xxxxxxxx","xxxxxxxx");
if (!$dbh)
{
die ("Failed to open the Database");
}
mysql_select_db("xxxxxx");
check_mysql();
if(!isset($id))
{
$id=0;
}

?>

4 个答案:

答案 0 :(得分:3)

请在尝试构建这个东西之前请多做一点学习。 你可以按照你的方式去做,但只需要一些小的关于面向对象编程的额外知识,也许关于Pear db类你将拥有3x更干净的代码。

如果您真的选择不至少将每个保存,更新,删除等程序拉出到函数中,而不是仅仅在代码中内联它们。将它们放在一个单独的文件中,并将其包含在该页面中。

它可能对您没用,但我将在页面中为您转储通用表访问类。它需要一个简单的db类API,但如果你使用它或类似的东西,你的生活将会轻松5倍。

如果您在查看时不理解此代码,那没关系,但请回过头来询问有关您不理解的内容的问题。这就是stackoverflow的用途。 这是一个老班,应该做基本的东西。对不起,这不是更好我只是想为你简单地挖掘出一些简单的东西。

<?php
// Subclass this class and implement the abstract functions to give access to your table
class ActiveRecordOrder
{

    function ActiveRecordOrder()
    {
    }

    //Abstract function should return the table column names excluding PK
    function getDataFields()
    {}

    //Abstract function should return the primary key column (usually an int)
    function getKeyField()
    {}

    //abstract function just return the table name from the DB table
    function getTableName() 
    {}

    /*
    This function takes an array of fieldName indexed values, and loads only the
    ones specified by the object as valid dataFields.
    */
    function loadRecordWithDataFields($dataRecord)
    {
        $dataFields = $this->getDataFields();
        $dataFields[] = $this->getKeyField();
        foreach($dataFields as $fieldName)
        {
            $this->$fieldName = $dataRecord[$fieldName];
        }
    }

    function getRecordsByKey($keyID, &$dbHandle)
    {
        $tableName = $this->getTableName();
        $keyField  = $this->getKeyField();
        $dataFields = $this->getDataFields();
        $dataFields[] = $this->getKeyField();

        $results = $dbHandle->select($tableName, $dataFields, array($keyField => $keyID));

        return $results;
    }

    function search($whereArray, &$dbHandle)
    {
        $tableName = $this->getTableName();
        $dataFields = $this->getDataFields();
        $dataFields[] = $this->getKeyField();
        return  $dbHandle->select($tableName, $dataFields, $whereArray);
    }

    /**
    * Since it is *hard* to serialize classes and make sure a class def shows up
    * on the other end. this function can just return the class data.
    */
    function getDataFieldsInArray()
    {
        $dataFields = $this->getDataFields();
        foreach($dataFields as $dataField)
        {
            $returnArray[$dataField] = $this->$dataField;
        }
        return $returnArray;
    }

    /**
    * Added update support to allow to update the status
    * 
    * @deprecated - use new function saveObject as of 8-10-2006 zak
    */
    function updateObject(&$dbHandle)
    {

        $tableName = $this->getTableName();
        $keyField = $this->getKeyField();
        $dataArray = $this->getDataFieldsInArray();

        $updatedRows = $dbHandle->updateRow(
            $tableName,
            $dataArray, 
            array( $keyField => $this->$keyField )
        );

        return $updatedRows;
    }   

    /**
    * Allows the object to be saved to the database, even if it didn't exist in the DB before.
    * 
    * @param mixed $dbhandle
    */
    function saveObject(&$dbhandle)
    {
        $tableName = $this->getTableName();
        $keyField = $this->getKeyField();
        $dataArray = $this->getDataFieldsInArray();

        $updatedRows = $dbHandle->updateOrInsert(
            $tableName,
            $dataArray, 
            array( $keyField => $this->$keyField )
        );

        return $updatedRows;
    }   
}

答案 1 :(得分:1)

我不知道login.php中发生了什么,但是在设置之前你使用的是$ id。这只是第一部分。

编辑:为了澄清,您在每个查询语句中使用$ id并在之后设置它,我的猜测是$ id为null,这就是为什么没有返回的原因。

编辑2: login.php还发生了什么?如果你从未读过$ _POST变量,那么什么都不会发生。

编辑3:就像我在评论中已经部分说过的那样,你的 if(isset($ previous))部分, elseif(isset($ update) )部分和 elseif(isset($ delete))部分永远不会做任何事情,因为$ id总是为0。

在对用户进行身份验证后,您需要并过滤已发布的变量,$ _POST ['id'],$ _POST ['previous']等。

答案 2 :(得分:1)

小心你的代码。您没有过滤您的cookie值,您不应该直接在那里存储用户名,因为访问者可以轻松更改。您应该查看filter_input以过滤cookie数据和正在提交的eany表单数据 - 尤其是您的$ _POST ['id']

这将为您免受攻击后的许多心痛。

你的if else语句正在检查是否设置了变量,但你没有设置next,previous,add etc

您正在使用包含这些值的提交按钮,因此您需要检查

if(isset($_POST['previous']))

而不是你的

if(isset($previous))

我无法看到您在何处设置数据库详细信息,除非您有一个尚未发布的包含文件。 (当然不发布真实的但我看不到任何东西)

答案 3 :(得分:1)

"Welcome " . $_COOKIE["username"] . "!<br />"; [and many other places]

HTML注入导致跨站点安全漏洞。每次输出文本值到HTML时都需要使用htmlspecialchars

"INSERT INTO special (specialtitle, specialinfo) VALUES ('$specialtitle'  [and many other places]

SQL注入导致数据库故意破坏。每次将文本值输出到SQL字符串文字时,都需要使用mysql_real_escape_string

if (isset($_COOKIE["username"]))

Cookie不安全,任何人都可以在客户端设置username Cookie。不要将其用作访问控制,仅作为存储或会话用户标识符的密钥。

您似乎也使用register_globals来访问$ _REQUEST值作为直接变量。这是另一个极端的禁忌。

在所有这些安全问题之间,对于俄罗斯黑客来说,你是一个坐着的人,他们会接管你的网站来推送病毒和垃圾邮件。