1

免責事項:これは割り当て用です。私は人々が私に明示的なコードを与えることを求めているのではなく、私が私のエラーを見て、それを修正し、将来同様の間違いを防ぐのに十分な助けを求めています。

私は、データベースにテーブルを作成し、いくつかのエントリを入力してから、フォームを作成し、ユーザーがフォームを介してデータベースを更新できるようにするという割り当てに取り組んでいます(これは非常に基本的なことです)。更新すると、ユーザーは変更を送信した後にエントリを表示する必要があります。

要件の1つは、自動インクリメントの主キーを使用することです。このキーはユーザーにとってそれほど重要ではないため、送信に含める必要はないと思います(したがって、このキーのフィールドはありません)。さらに、自動インクリメントすることになっているため、次のオプションがあります。手動で追加したキーは、実際には意味がありません。

そこで、フィールドとMySQLステートメントの小さなセットをまとめました。これらはすべて機能すると思います。キーを追加するフィールド(この場合はid_no)があり、そこに手動で値を入力すると、送信はデータベースに正常に保存されます。ただし、そのオプションを削除すると、データベースに何も送信されません。

私の主キーフィールドid_no 自動インクリメント用にマークされているので、それは問題ではないことに注意する必要があります。私の理解と、エンティティを手動で挿入することで確認したことによると、自動インクリメント値は、insertステートメントに含める必要なしに自動的に更新される必要があります。

これが私がこれまでに得たものです(これは私の最初のMySQL / PHP割り当てなので、優しくしてください):

<!DOCTYPE html>

<html>

<head>
  <title>Actor Database</title>

  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
  <script src="//ajax.aspnetcdn.com/ajax/jquery.validate/1.11.0/jquery.validate.js"></script>
  <script>
  $(document).ready(function() {
    $("form").validate();
  });
  </script>
</head>

<body>


 <form method="post">
   First Name: <input name="first_name" type="text" id="first" class="required" minlength="3">
   <br>
   Last Name: <input name="last_name" type="text" id="last" class="required" minlength="3">
   <br>
   <!--ID Number: <input name="id_no" type="text" id="id_num" class="required digits" maxlength="5">
   <br>-->
   Photo: <input name="photo" type="file" id="photo" class="required">
   <br>
   <input type="submit" id="submit">
 </form>

 <?php

 $dbhost = '*******************';
 $dbname = '*******************';
 $dbuser = '*******************';
 $dbpass = '*******************';

 $mysql_handle = mysql_connect($dbhost, $dbuser, $dbpass)
 or die("Error connecting to database server");

 mysql_select_db($dbname, $mysql_handle)
 or die("Error selecting database: $dbname");

 //mysql_query("INSERT INTO Actors(first_name, last_name) VALUES('Anne', 'Hathaway')");

 $id_no = array_key_exists("id_no", $_REQUEST) ? $_REQUEST["id_no"] : 0;
 $first_name = array_key_exists("first_name", $_REQUEST) ? $_REQUEST["first_name"] : '';
 $last_name = array_key_exists("last_name", $_REQUEST) ? $_REQUEST["last_name"] : '';
 $photo = array_key_exists("photo", $_REQUEST) ? $_REQUEST["photo"] : NULL;

 if ($id_no <= 0) {
  echo "";
 } else if ($id_no > 0) {
  $rs = mysql_query("SELECT id_no FROM Actors WHERE id_no = ".$id_no);
  if (mysql_numrows($rs) == 0) {
    mysql_query("INSERT INTO Actors(id_no, last_name, first_name) VALUES("
        . $id_no
        . ",'" . mysql_real_escape_string($last_name) . "'"
        . ",'" . mysql_real_escape_string($first_name) . "')"
      );
  } else {
    mysql_query("UPDATE Actors 
      SET last_name  = '".mysql_real_escape_string($last_name). "',
      SET first_name = '".mysql_real_escape_string($first_name)."'
      WHERE id_no ".$id_no
      );
  }
  }

  $results = mysql_query('SELECT id_no, last_name, first_name, photo FROM Actors');
  $nrows = mysql_numrows($results);

  echo "<table>";
  for ($i = 0; $i < $nrows; $i++) {
   echo "<tr>";
   echo "<td>".htmlspecialchars(mysql_result($results, $i, "first_name")). " " .htmlspecialchars(mysql_result($results, $i, "last_name"))."</td>";
   echo "</tr>";
  }
  echo "</table>";


 mysql_close($mysql_handle);

 ?>
</body>


</html>
4

3 に答える 3

2

すぐにあなたwhere id_noは=を失っています

mysql_query("UPDATE Actors 
  SET last_name  = '".mysql_real_escape_string($last_name). "',
  first_name = '".mysql_real_escape_string($first_name)."'
  WHERE id_no =".$id_no
  );
于 2013-02-16T06:09:43.830 に答える
1

auto_incrementが設定されている場合のデフォルト値がある場合は、挿入時にid_noを含める必要はありません。したがって、挿入ステートメントからid_noを削除します。

id_noのロジックを変更する必要があります。id_noを0に設定する新しいコマンド/アクションがあります。これは、これが新しいレコードであることを示します。または、一意のインデックスを使用して実際の主キーを決定および設定し、それを検索して、レコードがすでに存在するかどうかを判断します。

幸運と免責事項に感謝します:-)

于 2013-02-16T06:23:16.773 に答える
1

答えではありませんが、コメントするには大きすぎます。

ここにあなたの教授を感動させるためのいくつかの一般的なヒントがあります:

1)array_key_existsはやや冗長であり、次の方法でチェックをもう少し読みやすくすることができます。

$photo = isset($_REQUEST['photo']) ?: NULL;

(このショートカット構文はphp 5.3以降でのみ機能することに注意してください)

2)クエリ呼び出しでエラー処理はありません。つまり、クエリ呼び出しは常に成功すると想定しているだけです。データベース操作には、成功するための1つの方法(「失敗しない」)と、ほぼ無限の失敗方法があります常に戻り値に失敗がないか確認してください。

$result = mysql_query($sql) or die(mysql_error());
                           ^^^^^^^^^^^^^^^^^^^^^^

最低限、すべてのdb操作で実行する必要があります。

3)SQLインジェクションの問題を認識し、少なくともmysql_real_escape_string()を使用して問題を軽減したことに対する称賛

4)まだmysql関数を使用していることに対するブーイング。PDOまたはmysqliライブラリに切り替え、プリペアドステートメントとプレースホルダーを使用すると、このプロジェクトの見栄えが確実に向上します。

于 2013-02-16T06:51:34.223 に答える