0

mysqlデータベースの行を更新しようとしています。これを行うには、次のような簡単なクエリを使用します。

    "UPDATE  `contactinfo` SET  `Company` =  'Google', WHERE `id` =  '1';"

問題は、データベースが動的であり、ユーザーがいつでも列を追加できることです。だから私は列の名前を知りません。名前を見つけて、実際にmysqlの作業を行うページに投稿するフォームを作成するには、次のコードを使用します。

    <?php
            $result = mysql_query("select * from contactinfo WHERE `id` = '".$rid."';");

            if (!$result) {
                die('Query failed: ' . mysql_error());
            }
            $i = 0;
            while ($i < mysql_num_fields($result)) {
                $meta = mysql_fetch_field($result, $i);
                if (!$meta) {
                    echo "ERROR";
                }
                $name = $meta->name;

                $r = mysql_fetch_array(mysql_query("select * from contactinfo WHERE `id` = '".$rid."';"));
                $content = $r[$name];

                if($name != 'id') {
                    echo "<tr><td align='center'><div align='left'>Edit ".$name."</div></td></tr>";
                    echo "<tr><td align='center'><input type='text' value='" . $content . "' /></td></tr>";
                }
                $i++;
            }
            mysql_free_result($result);
        ?>

これにより、ユーザーが選択された行のコンテンツを編集できるようにする入力ボックスを備えた素敵な小さなテーブルが作成されます。行ID番号($ rid)は、変更する必要のある行を識別するために使用されます。

私の質問は、投稿されたフォームから行の新しいコンテンツを取得し、それを更新するためのクエリを作成するにはどうすればよいですか?フォームの名前と、クエリを作成するための新しいコンテンツを動的に取得する方法がわからないようです。

何か説明が必要な場合は、私に知らせてください。すべての助けをいただければ幸いです。

ありがとう。

4

3 に答える 3

2

最も簡単な方法は、データベース内のフィールドの名前とまったく同じ形式でフィールドに名前を付けることです。あなたがこのフォームを持っているとしましょう

<form action="">
   <input name="field[firstname]">
   <input name="field[lastname]">
   <input name="field[address]">
</form>

おそらく、フィールド名にも基づいてフォームを作成できるはずです。おそらく、すでにこれを行っています。応答を処理するファイルでは、次のようなことができます。

foreach($_POST['field'] as $field_name => $field_value) {
   $sql_str[] = "{$field_name} = '{$field_value}'";
}

これは、postからの「field」配列を通過し、適切な更新テキストを別の配列に配置します。次に、

mysql_query("UPDATE contactinfo SET ".implode(',', $sql_str)." WHERE `id` = '".$rid."';")

それをデータベースに入れること。

于 2012-12-05T23:02:42.393 に答える
0

できることは、ビットフラグを使用してデータベースに列を追加することです。ユーザーが新しいか古い場合、フラグはそれを反映します。そうすれば、ユーザーを更新して、新しいか古いかを言うことができます。

お役に立てれば。

于 2012-12-05T22:44:05.353 に答える
0

使用できるORMフレームワークがあるかどうかを調査することをお勧めします。

とにかく、あなたが望むことをする最も簡単な方法は、フィールドのフィールドの名前を渡すことですINPUT

$content = AddSlashes($content); // You may need HTMLEntities() here

$field = <<<FIELD
    <input type="text" value="$content" />
FIELD;

また、使用するもう1つの便利なトリックは、「保護された」フィールドの配列を指定するか、フィールドを変更できないようにするプレフィックスを指定することです。たとえば、ユーザーが主キーを変更できるようにしたくないことはほぼ間違いありません。

したがって、次のフォームを生成できます

if ('id' == $meta->name or 'pk' == $meta->name or (0 === strpos($meta->name, 'pk_')))
{
    // This is a primary key field
    $html .= <<<PKFIELD
    <input type="hidden" name="{$meta->name}" value="{$contents}" />
PKFIELD;
    continue;
}
if (0 === strpos($meta->name, 'hf_'))
{
    // hidden field, ignored (can't be changed)
    continue;
}
if (0 === strpos($meta->name, 'ro_'))
{
    // read-only field, shown but without even the name
    $html .= <<<ROFIELD
    <input type="text" readonly="readonly" class="readonly" value="{$contents}" />
ROFIELD;
    continue;
}

または、固定サイズのプレフィックスとテンプレートの配列を使用することもできます。

$fieldtpls = array(
    'pk_' => '<input type="hidden" name="{NAME}" value="{VALUE}" />',
    'ta_' => '<textarea name="{NAME}">{VALUE}</textarea>',
    'ro_' => '<input type="text" value="{VALUE}" readonly="readonly" />',
);

次に、各フィールドを分析し、既知のプレフィックスが使用されていない限り、デフォルトを適用します。

その後、ユーザーはそれに応じてフィールドに名前を付ける必要があります。もう1つの可能性は、「メタテーブル」が各テーブルとフィールドのタイプと処理を保持できるようにすることですが、その場合、メタ用の一種の「管理エディター」を作成して、ユーザーインターフェイスを少し複雑にする必要があります。テーブル:

table  field  type   rw   parameters
users  name   text   yes  
users  id     hidden no
users  role   text   no
users  notes  area   yes  class:"widearea"

...そしてそのようにしてドラゴンのORMフレームワークになります。

于 2012-12-05T23:16:57.280 に答える