2

フォームからテーブルを更新しようとしています。

私は3ページあります。最初のものは、「編集」リンクを使用してテーブルのすべての行を照会します。編集をクリックすると(2ページ)、コードは$ idを取得し、それをURLに配置します。$ idはURLから取得され、フォームに入力するためのクエリで使用されます。

私の問題は、更新されたフォーム情報をテーブルに渡すことです。基本的に、更新は行われていません。

2ページ目

<?php

  include '../db/config.php';
  include '../db/opendb.php';

$id = $_GET["id"]; 

  $order = "SELECT * FROM tableName where id='$id'";
  $result = mysql_query($order);
  $row = mysql_fetch_array($result);

  ?>

  <form method="post" action="edit_data.php">
  <input type="hidden" name="id" value="<?php echo "$row[id]"?>">
    <tr>        
      <td>Title</td>
<td>
<input type="text" name="title" size="20" value="<?php echo"$row[title]"?>">
</td>
    </tr>
    <tr>
      <td>Post</td>
    <td>
<input type="text" name="post" size="40" value="<?php echo
  "$row[post]"?>">
</td></tr>
<tr>
<td align="right">
<input type="submit" name="submit value" value="Edit">
</td>
    </tr>
</form>

3ページ目

          include '../db/config.php';
      include '../db/opendb.php';

   $query = "UPDATE tableName SET '$_POST[title]', '$post[post]' WHERE id='$id'";
        mysql_query($query);
4

5 に答える 5

2

そのはず

UPDATE tableName SET `title` = {$_POST['title']}, `post` = {$_POST['post']}...

何を設定しているのか、自問してみてください。

于 2012-06-22T22:48:44.543 に答える
1

データベース更新のSQLステートメントが間違っています。新しい値だけでなく、対応するフィールド名のリストも含める必要があります。これは、次のように表示される必要があることを意味します。

$query = "UPDATE tableName SET `title` = {$_POST['title']}, `post` = {$_POST['post']} WHERE id = '$id'";

$_POST文字列の内側のフィールドも中括弧({})で囲むか、引用符の外側に配置する必要があることに注意してください。(のように" = " .$_POST['title']. ", ")。これは、標準的な方法を使用して引用符で囲まれたものにアクセスする場合に絶対に必要です(たとえば、またはではありませ$_POST[title]$_POST['title']$_POST["title"]

さらに、コードに以下を追加する必要があります。

  • いくつかのエラー処理、現在、何かがうまくいかなかったかどうかさえわかりません。mysql_query()最も簡単な方法は、関数の戻り値を確認しnull、そうである場合はnull、。を使用してmysqlエラーメッセージを取得することですmysql_error()
  • 渡された値のエスケープ。現在、投稿されたデータをmysqlクエリに直接渡しますが、これは非常に安全ではありません。(たとえば、ウィキペディアのSQLインジェクション を参照してください)クエリに挿入する前に、すべてのフォームデータで使用する必要があります。これにより、悪意のある可能性のあるすべての部分が回避されます。mysql_real_escape_string()
于 2012-06-22T22:53:56.167 に答える
0

これは、値を設定していないためです。声明の中で:

$query = "UPDATE tableName SET '$_POST[title]', '$post[post]' WHERE id='$id'";

更新する列名を渡す必要があります。

于 2012-06-22T22:49:34.907 に答える
0
if (isset($_POST[title])){
$title = mysql_real_escape_string(trim($_POST['title']));
    }else{
$title = NULL;
    }

if (isset($_POST[post])){
$post = mysql_real_escape_string(trim($_POST['post']));
    }else{
$post = NULL;
    }


$query = "UPDATE tableName SET title='$title', post='$post' WHERE id='$id'";           
mysql_query($query); 

また、mysqlの代わりにmysqli関数をお勧めします。混乱を避けるために、変数とテーブルの列'post'を呼び出さないでしょう。

于 2012-06-22T22:54:34.637 に答える
0

SQLインジェクション攻撃を防ぐためにPDOステートメントをまだ使用していない場合は、mysql_real_escape_string()よりも強力な保護を使用する必要があります。データをエスケープすることに加えて、送信されたデータが実際に期待しているものであることを検証する必要があります。

つまり。ここにあなたのコードで:

  $id = $_GET["id"]; 

  $order = "SELECT * FROM tableName where id='$id'";
  $result = mysql_query($order);
  $row = mysql_fetch_array($result);

追加した場合:

if(is_numeric($_GET['id'])){
   $id = mysql_real_escape_string(trim($_GET["id"]));

   $order = "SELECT id, title, post FROM tableName where id='$id'";
   $result = mysql_query($order);
   $row = mysql_fetch_array($result);
  }

これにより、少なくとも、実行しているものが実際にはID番号であることが検証されます(つまり、IDが実際に番号である場合;)。PDOステートメントをまだ使用していない場合は、このロジックをすべての入力に適用できます。文字を期待している場合は、文字を検証し、数字を数字で検証し、特殊文字をエスケープします。繰り返しますが、これは最低限です。何百ものSQLインジェクション手法を読み、PDOを読み始めることをお勧めします。

また、SELECT*ステートメントの使用に関して。私はそれを避けようとします。テーブル内のフィールドの順序を変更し、$ row [0](番号付きリクエスト)を使用している場合、ステートメントに脆弱性の層が追加されます。最後に、テーブルにデータを含む追加のフィールドが含まれている場合、は必要なものとは無関係であり、このページで使用している場合は、不要な情報を読み込んでいます。

 $order = "SELECT id, title, post FROM tableName where id='$id'";

それをうまく解決します。:) 幸運を!

于 2012-06-23T01:13:27.530 に答える