1

テーブルの内容を表示する関数を作成しました。これは機能です:

function query_tabel ($sql){
    $query = $sql;
    $result = mysql_query($query);
    $kolomen_tellen = mysql_num_fields($result);
    if (!$result) {
        die("Error Query: " . mysql_error());
    }
    print "<table border=1>\n";

        print "<tr>";
            for ($column_num = 0; $column_num < $kolomen_tellen; $column_num++)
            {
                $fieldname = mysql_field_name($result, $column_num);
                print "<TH>$fieldname</TH>";
            }
            print "</tr>";

    while ($row = mysql_fetch_row($result)) {
        print ("<TR>");
        for     ($column_num = 0; $column_num < $kolomen_tellen; $column_num++)
            print ("<TD>$row[$column_num]</TD>\n");
        print ("</TR>\n");
    }
    print "</table>";

それは機能し、任意のファイルでいつでも関数を呼び出すことができます。しかし、入力フィールドを持つ編集フォームを作成する別の関数が必要です。

これは私の最初のドラフトです:

function query_tabel_edit ($sql, $filename){
    $query = $sql;
    $result = mysql_query($query);
    $kolomen_tellen = mysql_num_fields($result);
    if (!$result) {
        die("Error Query: " . mysql_error());
    }
    print "<table class=edit>\n";

        print "<tr>";
            for ($column_num = 0; $column_num < $kolomen_tellen; $column_num++)
            {
                $fieldname = mysql_field_name($result, $column_num);
                print "<TH class=edit>$fieldname</TH>";
            }
            print "</tr>";

    while ($row = mysql_fetch_row($result)) {
        print "<form action=$filename method=post>";
        print ("<TR>");
        for     ($column_num = 0; $column_num < $kolomen_tellen; $column_num++)
            print ("<TD class=edit> <input class=edit type=text name=$row[$column_num] value=$row[$column_num] </TD>\n"); 
            print ("<TD class=edit> <input class=edit type=submit name=update value=edit> <TD>\n");
        print ("</TR>\n");
    }
    print "</table>";
}

だから私は編集リンクを追加しました、魅力のように機能しますが、レコードを変更するSQL行を作成してどこに置くのですか?

このedit sqlステートメントを作成する方法と、関数または関数を呼び出すPHPファイルのどこかにdata sql行を配置する必要がありますか?

4

1 に答える 1

0

多かれ少なかれこのようにすることができます。update ステートメントの作成方法を知る必要があるため、これを完全に柔軟にするのは困難です。つまり、更新するテーブルとフィールドを知る必要があります。誰かが偽のフォームを偽造して不正なフィールド名を投稿し、攻撃を受けやすくする可能性があるため、HTML フォームの内容に依存することはできません。

これを行う最善の方法は、ユーザーのセッションで更新されるテーブルとフィールドに関する情報を保存することだと思いますが、セッションについて知っているかどうかわからないので、ここでは省略します。

mysqlあなたがそれらを使用していて、それを強制的に変更したくないので、私は関数を使用したことに注意してください。ただし、それらは非推奨であり、mysqli または PDO に変更することを強くお勧めします。

mysqli を使用すると、準備済みステートメントも使用できます。しかし、それはドキュメントで読むために残しておくものでもあります。

あなたのコードと比較した最も重要な変更はmysql_fetch_array、キーとしてフィールド名も含む値の配列を返す を使用したことです。そうすれば、これらの名前を編集に使用でき、データ内でそれらの名前を見つけることができます$_POST。そこから、それを機能させるためにもう少しパズルを解くことができるはずです.

<?php

// This is how to do it in a single script: Check if a value is posted and 
// act on it.
// If you have separate scripts, you don't actually need this, although it's 
// still a good idea to thoroughly check the input to your scripts to prevent
// attacks from malicious users.

if (array_key_exists('id', $_POST)
{
  // Post data found. Update record.

  // Assuming id is an integer, I int-cast it. If it's not, make sure to 
  // properly escape it or you'll be vulnerable to SQL injection attacks!
  $id = (int)$_POST['id'];

  // You will need to validate if the posted field names are valid. You can
  // do this by specifying a list of updatable fields and then check if the 
  // posted values are in that list. 
  // You could also run query to get the field names from the database, so
  // so you will have more flexibility.
  // You can also store the fields to be updated in the session of the user
  // That will save you a query, but you'll have to read about sessions as well.
  $updatableFields = array('firstname', 'lastname');

  foreach ($_POST as $fieldname => $value)
  {
    // Validate the field names! You don't want field names that don't 
    // exist, or your query will break. Also, it will make you vulnerable 
    // to SQL injection attacks.
    if (array_search($fieldname, $updatableFields) !== false)
    {
      $value = mysql_real_escape_string($value);
      $update[] = "$fieldname = '$value'";
    }
  }
  $sql = 'UPDATE YourTable SET ' . implode($update) . " WHERE id = $id";
  // Execute statement.
}
else
{
  // Query your database here
  // <<code omitted>> 

  // Show edit form
  while ($row = mysql_fetch_array($result))
  {
    foreach ($row as $fieldname => $value)
    {
      $value = htmlspecialchars($value);
      $type = 'text';
      // Store the id in an hidden input, so you know which row to update.
      if ($fieldname == 'id')
      {
        $type = 'hidden';
      }
  ?>
    <label for="<?=$fieldname?>"><?=$fieldname?></label>
    <input type="<?=$type?>" id="<?=$fieldname?>" name="<?=$fieldname?>" value="<?=$value?>">
  <?php
    }
  ?>
    <input type="submit" value="save">
  <?php
  }

}
于 2013-07-29T20:04:18.653 に答える