3

我总是发现自己创建了两个单独的 php 文件/脚本来添加某些数据和编辑这些数据。这些文件并没有太大的不同,所以我认为应该有一种方法可以将它们制作成一个文件。

在这里,我将举一个非常简单的例子来说明我的观点:

add.php

<?php

$title = $_POST['title']; // ignore the unescaped data, this is a simple example
$text = $_POST['text'];
mysqli_query($connection,
   "INSERT INTO `articles` (`title`, `text`) VALUES ('$title', '$text')");

echo'
<form>
   <input type="text" name="title" value="'.$_POST['title'].'" />
   <input type="text" name="text" value="'.$_POST['text'].'" />
   <input type="submit" value="Add" />
</form>
';

?>

edit.php

<?php

$id = $_GET['id'];
$title = $_POST['title']; // ignore the unescaped data, this is a simple example
$text = $_POST['text'];
// save data
mysqli_query($connection,
   "UPDATE `articles` SET `title` = '$title', `text` = '$text'
    WHERE `id` = $id");

// get current data
$q = mysqli_query($connection,"SELECT * FROM `articles` WHERE `id` = $id");
$d = mysqli_fetch_array($q);
$title = $d['title'];
$text = $d['text'];

echo'
<form>
   <input type="text" name="title" value="'.$title.'" />
   <input type="text" name="text" value="'.$text.'" />
   <input type="submit" value="Add" />
</form>
';

?>

如您所见,添加和编辑表单/代码非常相似,除了:

  • add 插入数据,而 edit 更新它
  • add 将 $_POST 值插入到表单中(如果有错误,使提交的数据保留在表单中,而 edit 将当前数据库值插入到表单中(保存完成并刷新页面后,使表单有当前的数据库值)

这两个是否可以以某种方式合并到一个文件/代码中,这样如果我想添加/更改表单值,我不需要分别编辑两个文件,而只会更改一次表单?

4

4 回答 4

3

您可以使用INSERT ON DUPLICATE KEY UPDATE大致给您:

<?php
$id = $_GET['id'];
$title = $text = '';

if ($_POST)
{
    $title = $_POST['title'];
    $text = $_POST['text'];
    // save data
    $query = "INSERT INTO `articles` (`id`, `title`, `text`)
              VALUES ('$id', '$title', '$text')
              ON DUPLICATE KEYS UPDATE title = title, text = text"
    mysqli_query($connection, $query);

}
else if ($id)
{
    // get current data
    $q = mysqli_query($connection, "SELECT * FROM `articles` WHERE `id` = $id");
    $d = mysqli_fetch_array($q);
    $title = $d['title'];
    $text = $d['text'];
}

echo '
<form>
   <input type="text" name="title" value="'.$title.'" />
   <input type="text" name="text" value="'.$text.'" />
   <input type="submit" value="Add" />
</form>';
  • 如果它是一个 POST 并且没有 $id 存在:插入一个新行,就像一个 INSERT 一样。
  • 如果它是 POST 并且存在 $id:如果 $id 已经存在于表中,则更新该行,否则它是一个 INSERT。
  • 如果您只有一个 $id :显示其中包含现有数据的表单。
  • 如果它不是 POST 并且 $id 未填充:显示一个空表单。
于 2012-10-06T17:42:14.660 回答
1

我倾向于制作一个用于插入和更新数据的接口,它只有一种插入和更新方法。关键是要提交的用户表单必须包含要更新的行的 id。

public method save( Object obj )
    if obj.id is in database
        query = "update table set attrA = obj.a, attrB = obj.b where id=obj.id" 
    else if obj.id < 1 
        query = "insert into table  (a,b,c) values (obj.a,obj.b,obj.c)"

这意味着当您创建要提交的新对象时,它的 id 必须初始化为 0 或 -1(1 是具有 int 主键的表的第一个键行)。同样,html 文件中的表单必须具有 <input type=hidden value=row.id name=DBID> 填充默认值(null、0、-1)或正在编辑的对象的有效 id .

从本质上讲,这意味着用户可以更新表中的任意行,但如果他们已经进行了身份验证,这应该不是问题。此外,通常知道 id > 0 到 INSERT 和 UPDATE 否则就足够了。不需要验证正在提交的 id 是否在数据库表中,因为插入时不会设置 id,而是让数据库自动增加主键。

只喝了 3 杯啤酒,就更新 了这么多愚蠢的错别字。我希望这是可读的

于 2012-10-06T16:43:06.593 回答
1

您可以使用GETPOST参数的组合来实现您想要的。使用GET参数来区分editand add,即/post?action=addor /post?action=edit。根据您的值,$_GET['action']您会知道是将空表单呈现给add帖子还是使用数据库中的数据填充表单。然后你可以在你的表单中有一个隐藏的字段,你可以填写它的值,$_GET['action']这样你就可以知道在提交表单后 是否INSERT或何时处理表单。UPDATE

开始使用一些框架可能是值得的,例如 CakePHP、CodeIgniter、Zend Framework 等。

于 2012-10-06T16:43:20.117 回答
0

这是一个使用 OOP 的想法(在我看来)。

假设您有一些表示表单元素的类,称为FormElement.

那么你有一些应该支持什么的通用形式?让我们假设 MVC:

  • 展示自己
  • 添加元素
  • 设置默认值
  • 解析请求值
  • 获取值
  • 验证值

因此,您将为自己构建一个界面,例如

interface IForm {
    public function Display();
    public function AddElement( FormElement $element);
    public function SetValues( array);
    public function FetchPostValues();
    public function GetValues();
    public function Validate();
}

那么,这两种形式的共同点是什么(假设您要禁止更改 of email)?一切除了FetchPostValues()

因此,您将使用一个纯虚拟方法构建一个类,该方法将执行类似的所有操作:

abstract class FormArticle implements IForm {
    // All methods implemented except FetchPostValues
    abstract public function FetchPostValues();
}

然后只需构建两个小类,它们将定义如何获取发布数据:

class FormArticleEdit extends FormArticle {
    public function FetchPostValues(){
        if( isset( $_POST['email'])){
            throw new Exception('What are you trying to achieve?');
        }
        // ...
    }
}

还有一个提示(实际上是两个):

  • 实现这样的抽象类FormAbstract将提供所有通用方法,如AddElement(), Display()。这将节省您每次复制这些通用方法的时间,但仍将为您提供从头开始的能力(当直接使用数据库或直接缓存项目时)。
  • 而是使用已经具有重用表单模型的框架(Zend我个人的最爱)。
于 2012-10-06T17:05:53.527 回答