フォームによるPHP更新テーブル
フォームからテーブルを更新しようとしています。
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);
答え :
解決策:
そうあるべきです
UPDATE tableName SET `title` = {$_POST['title']}, `post` = {$_POST['post']}...
何を設定しているのか、自問してみてください。
答え :
解決策:
データベース更新の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
で確認し、それが{-code-であるかどうかを確認することです。 9}
、mysql_error()
を含むmysqlエラーメッセージを取得します。 - 渡された値のエスケープ。現在、投稿されたデータをmysqlクエリに直接渡します。これは非常に安全ではありません。 (たとえば、ウィキペディアの SQL-Injection を参照してください)すべてのフォームで
mysql_real_escape_string()
を使用する必要がありますクエリに挿入する前のデータ。これにより、悪意のある可能性のあるすべての部分が回避されます。
答え :
解決策:
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'を呼び出さないでしょう。
答え :
解決策:
これは、値を設定していないためです。ステートメントの内容:
$query = "UPDATE tableName SET '$_POST[title]', '$post[post]' WHERE id='$id'";
更新する列名を渡す必要があります。
答え :
解決策:
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'";
それをうまく解決します。 :) 幸運を!
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。