我的目标是拥有一个简单的基于表单的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;
}
?>
答案 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值作为直接变量。这是另一个极端的禁忌。
在所有这些安全问题之间,对于俄罗斯黑客来说,你是一个坐着的人,他们会接管你的网站来推送病毒和垃圾邮件。