3

私はいつも、特定のデータを追加してこのデータを編集するために、2つの別々のphpファイル/スクリプトを作成していることに気づきました。これらのファイルはそれほど違いがなかったので、1つのファイルにする方法があるはずだと思いました。

ここでは、私のポイントを説明するための非常に簡単な例を示します。

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は現在のデータベース値をフォームに挿入します(保存が完了してページが更新された後、フォームは現在のデータベース値)

これら2つをどういうわけか1つのファイル/コードにマージできるので、フォームの値を追加/変更する場合、2つのファイルを別々に編集する必要はありませんが、フォームは1回だけ変更されますか?

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

私はデータを挿入して更新するためのインターフェースを作る傾向があり、挿入と更新の方法は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ファイルのフォームには、デフォルト値(null、0、-1)または編集中のオブジェクトの有効なIDのいずれかが入力された<input type = hidden value = row.id name=DBID>が必要です。 。

基本的に、これは、ユーザーがテーブル内の任意の行を更新できることを意味しますが、ユーザーが自分自身を認証した場合、これは問題にはなりません。また、通常は、ID> 0をINSERTに、それ以外の場合はUPDATEを知っていれば十分です。挿入するときにIDを設定せず、DBに主キーを自動インクリメントさせるため、送信されるIDがデータベーステーブルにあることを確認する必要はありません。

たった3杯のビールの後、すごい多くのばかげたタイプミスを更新します。これが読めることを願っています

于 2012-10-06T16:43:06.593 に答える
1

GETとパラメータを組み合わせて使用​​することで、POST目的を達成できます。パラメータを使用して、と、つまりまたはGETを区別します。あなたの価値に基づいて、空のフォームを投稿にレンダリングするか、DBからのデータをフォームに入力するかがわかります。次に、フォームに非表示のフィールドを含めることができます。このフィールドにの値を入力すると、フォームを送信した後、フォームを処理する かどうか、またはいつ処理するかを知ることができます。editadd/post?action=add/post?action=edit$_GET['action']add$_GET['action']INSERTUPDATE

ただし、CakePHP、CodeIgniter、ZendFrameworkなどのフレームワークの使用を開始する価値があるかもしれません。

于 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();
}

次に、これらの両方の形式に共通するものは何ですか(たとえば、変更を禁止したい場合email)。を除くすべてFetchPostValues()

したがって、同様のすべてを実行する1つの純粋仮想メソッドを使用してクラスを構築します。

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

次に、投稿データをフェッチする方法を定義する2つの小さなクラスを作成します。

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

そしてもう1つのヒント(実際には2つ):

  • そのような抽象クラスを実装すると、、のようFormAbstractなすべてのジェネリックメソッドが提供されます。これにより、これらの一般的なメソッドを毎回コピーする必要がなくなりますが、最初から開始することもできます(データベースなどを直接使用してアイテムをキャッシュする場合)。AddElement()Display()
  • むしろ、フォームを再利用するためのモデルがすでにあるフレームワークを使用してください(Zend私の個人的なお気に入りです)。
于 2012-10-06T17:05:53.527 に答える