0

各行に編集リンクと削除ボタンのあるテーブルがあります。削除ボタンは正常に機能していますが、編集リンクで何が間違っているのかわかりません。

特定の行の編集リンクをクリックすると、フォームのある編集ページが表示されますが、データは入力されていません。エラーメッセージはありません...URLフィールドで、選択した映画の正しいIDであることがわかります。

私は何が欠けていますか?編集ページにもクエリなどを書く必要がありますか?私はそれを必須ページにしようとしたので、編集ボタンをクリックすると、編集フォームがインデックスページにポップアップします。しかし、私はそれをなんとかすることができませんでした。

古いmysql関数を使用していることはわかっていますが、SQL保護をまだ追加していません。

データベースはmoviedataと呼ばれ、2つのテーブルがあります。

  • 表1は呼ばれます:映画
    • フィールド/列(5):id(主キー、AI)、**** title **、release_year、** **** genre_id **、** director ****
  • 表2は次のように呼ばれます:カテゴリ
    • フィールド/列(2):genre_id(主キー、AI)、ジャンル

genre_id(主キー、表2)とgenre_id(表1)の間には関係(外部キー)があります。

index.phpコード

<!DOCTYPE html>

<html>

<head>

<title>My movie library</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="mall.css" />

</head>

<body>
<?php 

    require 'connect.inc.php';

    if (isset($_POST['delete']) && isset($_POST['id'])) {
        $id = $_POST['id'];
        $query = "DELETE FROM movies WHERE id=".$id." LIMIT 1";

        if (!mysql_query($query, $sql))
            echo "DELETE failed: $query<br>".
            mysql_error() . "<br><br>";
    }

    $query = "SELECT * FROM movies m INNER JOIN categories c ON m.genre_id = c.genre_id";
    $result = mysql_query($query);

    if (!$result) die ("Database access failed:" .mysql_error()) ;
    $rows = mysql_num_rows($result);

    echo '<table><tr><th>Title</th><th>Release year</th><th>Genre</th><th>Director</th><th>Update</th><th>Delete</th></tr>';

    while ($row = mysql_fetch_assoc($result)) {
    echo '<tr><td>' .$row["title"] . '</td>' ;
    echo '<td>' .$row["release_year"] . '</td>' ;
    echo '<td>' .$row["genre_id"] . '</td>' ;
    echo '<td>' .$row["director"] . '</td>' ;
    echo '<td>'."<a href='edit_movie.php?edit=" . $row["id"] . "'>Edit</a>".'</td>';
    echo '<td><form action="index.php" method="POST">
                <input type="hidden" name="delete" value="yes" />
                <input type="hidden" name="id" value="'. $row["id"] .'" /> 
                <input type="submit" value="Delete" /></form>
                </td></tr>' ;
    }
    echo '</table>'; 

?>

</body>

</html>

そして、これがedit_movie.phpページのコードです。次の形式の編集ページ:

<!DOCTYPE html>

<html>

<head>

<title>My movie library</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="mall.css" />

</head>

<body>

<?php

require 'connect.inc.php';


//close MySQL
mysql_close($sql);

?>

<p>Edit movie</p>
<div id="form_column">
<form action="edit_movie.php" method="post">
<input type="hidden" name="id" value="<?php if (isset($row["id"])) ?>" /> <br>
Title:<br> <input type="text" name="title" value="<?php if (isset($row["title"])) { echo $row["title"];} ?>" /> <br>
Release Year:<br> <input type="text" name="release_year" value="<?php if (isset($row["release_year"])) { echo $row["release_year"];} ?>" /> <br>
Director:<br> <input type="text" name="director" value="<?php if (isset($row["director"])) { echo $row["director"];} ?>" /> <br><br>
Select genre:
<br>
<br> <input type="radio" name="genre_id" value="1" checked />Action<br>
<br> <input type="radio" name="genre_id" value="2" />Comedy<br>
<br> <input type="radio" name="genre_id" value="3" />Drama<br>
<br> <input type="radio" name="genre_id" value="4" />Horror<br>
<br> <input type="radio" name="genre_id" value="5" />Romance<br>
<br> <input type="radio" name="genre_id" value="6" />Thriller<br><br>
<input type="submit" />
</form>
</div>



</body>

</html>

データベース接続は、これらのファイルの先頭に必要な別のconnect.inc.phpファイルにあります。以下に示すconnect.inc.phpファイルのコード:

<?php


//connect to MySQL
$servername = "localhost";
$username = "root";
$password = "";
$sql = mysql_connect($servername,$username,$password);
mysql_connect($servername,$username,$password);
//select database
mysql_select_db("moviedata");

?>
4

1 に答える 1

1

まあ、それは手続き的でさえないので、あなたのコードはちょっと混乱しています。あなたは自分自身のために問題を作っています。本当に。

PHPを使用してアプリケーションを開発するときに覚えておく必要のあることがいくつかあります。

HTMLタグを印刷/エコーしないでください

。これにより、コードが保守不能になり、読み取り不能になるため、これはできるだけ避けてください。代わりに別の構文を使用してください。


つまり、PHPは、テンプレートエンジンを「生成」するのではなく、テンプレートエンジン自体として使用する必要があります。


個別の責任。明確かつ賢明に

データベースに接続する関数は、プレゼンテーションでは使用しないでください(この場合はHTML)。データベースを担当するファイルと、データ操作(DELETE、CREATE、UPDATE操作など)を担当する別のファイルを作成します。



SQLインジェクションとXSSを忘れないでください

、、、など$_GETのスーパーグローバルから取得したデータは絶対に信用しないでください。少なくとも、処理する動的入力ごとに使用する必要があります。$_POST$_COOKIE$_REQUESTmysql_real_escape_string()

一般的に、XSSを使用すると、前述のスーパーグローバルを介して任意のJavaScriptコードを実行できるだけでなく、一般的なマークアップ内に別のhtmlコードを挿入できます。これを防ぐために、基本的htmlentities()にここで十分です。


物事を関数にラップする

したがって、これを行う代わりに、

if (isset($_POST['delete']) && isset($_POST['id'])) {
    $id = $_POST['id'];
    $query = "DELETE FROM movies WHERE id=".$id." LIMIT 1";

次のように書き直す必要があります。

function delete_movie_by_id($id){
   return mysql_unbuffered_query(sprintf("DELETE FROM `movies` WHERE id='%s' LIMIT 1", mysql_real_escape_string($id)));
}

if ( isset($_POST['delete'], $_POST['id']) ){

   delete_movie_by_id($_POST['id']); // it's safe & readable now
}


OOPについて学び、PDOに切り替えます

さて、あなたがこのようなものを開発しているとき、手続き型コードは行く方法ではありません。次回何かを書くときは、データベースアクセス用のPDOとOOPの両方を実際に使い始めるでしょう。


先に進むこともできますが、ここで停止して、元の質問に戻った方がよいでしょう。

ええと、あなたは正確にどのエラーが発生するかを言いませんでした。たとえば、mysql_select()FALSE(===データベース選択の失敗)が返される場合、スクリプトは終了しません!?あなたが投稿したコードによると、あなたは決してそれを「追跡」しません。

初め

したがって、connect.inc.phpは次のようになります。

error_reporting(E_ALL); // <-- Important!

$servername = "localhost";
$username = "root";
$password = "";

if ( ! mysql_connect($servername,$username,$password) ){
   die(sprintf('Cannot connect to MySQL server because of "%s"', mysql_error()));
}

//select database
if ( ! mysql_select_db("moviedata") ){
  die(sprintf('Cannot select a database, because of "%s"', mysql_error()))
}

2番

edit_movie.phpページでは、このコードブロックはまったく必要ありません。スクリプトが終了すると、接続は自動的に閉じられます。

したがって、これを削除するだけです。

<?php

require 'connect.inc.php';

//close MySQL
mysql_close($sql);

第3

その中でedit_movie.php、あなたは明確に尋ねています:if ( isset($row['some_column']) )...、しかしそれはすべてについて何ですか?$rowそれ自体はどこにありますか?それはどこにも定義されていなかったので、あなたはあなたが期待するものを得ることができません。ここ:

<input type="hidden" name="id" value="<?php if (isset($row["id"])) ?>" /> <br>
Title:<br> <input type="text" name="title" value="<?php if (isset($row["title"])) { echo $row["title"];} ?>" /> <br>
Release Year:<br> <input type="text" name="release_year" value="<?php if (isset($row["release_year"])) { echo $row["release_year"];} ?>" /> <br>
Director:<br> <input type="text" name="director" value="<?php if (isset($row["director"])) { echo $row["director"];} ?>" /> <br><br>

さて、それで十分です。

次のようにアプリケーションを書き直すことを検討してください。

ファイル:movie.inc.php

require_once('connect.inc.php');

/**
 * Fetch all movies from a table
 * @return array on success, FALSE on failure
 */
function get_all_movies(){

   $query = "SELECT * FROM movies m INNER JOIN categories c ON m.genre_id = c.genre_id";

   $result = mysql_query($query);

   if ( ! $result ){ 
     return false;
   } else {
     $return = array();

     while ($row = mysql_fetch_assoc($result)){

        $return[] = array('director' => $row['director'], 'genre_id' => $row['genre_id'], 'release_year' => $row['release_year'], 'title' => $row['title'], 'id' => $row['id']); 
     }
       return $return;
   }
}

function delete_movie_by_id($id){
  // I already wrote this, see above
}

ファイルindex.php

<?php

require('movie.inc.php');

if ( isset($_GET['delete']) && isset($_GET['id']) ){
   if ( delete_movie_by_id($_POST['id']) ){ //it's 100% safe
       die('Movie has been removed. Refresh the page now'); // or the like
   } else {
      // could not - handle here
   }
}

?>
<!DOCTYPE html>
<html>
<head>

<title>My movie library</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="mall.css" />

</head>
<body>

<table>
 <tr>
  <th>Title</th>
  <th>Release year</th>
  <th>Genre</th><th>Director</th>
  <th>Update</th>
  <th>Delete</th>
 </tr>

  <?php  foreach (get_all_movies() as $index => $row) : ?>
   <tr>
     <td><?php echo $row['title'];?></td>
     <td><?php echo $row['release_year']; ?></td>
     <td><?php echo $row['genre_id'];?></td>
     <td><?php echo $row['director'];?></td>
     <td><a href='<?php printf('edit_movie.php?edit=%s', $row['id']);?>>Edit</a></td>
     <td>
      <form action="index.php" method="GET">
              <input type="hidden" name="delete" value="yes" />
              <input type="hidden" name="id" value="<?php echo $row['id'];?>" /> 
              <input type="submit" value="Delete" />
      </form>
      </td>
    </tr>
    <?php endforeach; ?>
    </table>

</body>
</html>

私は今疲れています、あなたがこの答えからコアアイデアを得ることができることを願っています。


アップデート

映画を「編集可能」にするための基本的な手順があります。

1)編集しようとしているデータを(テーブルから)取得します
2)編集したデータをサーバーに送り返します(phpスクリプト)
3)入力を検証します
4)UPDATEクエリを実行します

それで全部です。

したがって、これは次のようになります(ファイル:edit_movie.php):

<?php

require_once('movie.inc.php');


/**
 * Grabs the movie data by its id
 * 
 * @param $id A movie id 
 * @return array on succes, FALSE if $id is wrong
 */
function get_movie_by_id($id){

   $query = sprintf("SELECT * FROM `enter_movie_table_name_here` WHERE `id` = '%s' LIMIT 1", mysql_real_escape_string($id));

   $result = mysql_query($query);

   if ( ! $result ){
       return false;
   } else {
       return $result;
   }
}


function update_movie_by_id($id, array $data){

    $query = sprintf("UPDATE `the_movie_table` 
              SET `director` ='%s',
                  `genre_id` = '%s',
                  `relase_year` ='%s',
                  `title` = '%s' WHERE `id` = '%s' LIMIT 1"),

                   mysql_real_escape_string($data['director']),
                   mysql_real_escape_string($data['genre_id']),
                   mysql_real_escape_string($data['relase_year']),
                   mysql_real_escape_string($data['title']),
                   mysql_real_escape_string($id) );

    // not mysql_query() !!! but this
    return mysql_unbuffered_query($query); 
}


// Next thing is to get an id by query string,
// So if it was /movide_edit.php?id=1
// then id we have is 1

// So we need to handle that right now


if ( isset($_GET['id']) ){

   $movie = get_movie_by_id($_GET['id']);

   if ( ! $movie ){ // <- make sure that id isn't fake
      die(sprintf('Invalid movie id "%s"', $_GET['id']));
   }

} else {

   die('Please supply an id you want to edit'); // <- this makes sence
}


// Ok, we'll reserve this block for an update

if ( !empty($_POST) ){ // This will run when user clicked on Save button

      if ( update_movie_by_id($_POST['id'], array(

              'director' => $_POST['director'],
              'genre_id' => $_POST['genre_id'],
              'relase_year' => $_POST['relase_year'],
              'title'       => $_POST['title']

         )) ){

             die('Movie has been updated');
         } else {

          die('Could not update a movie for some wicked reason..');
         }

}


// That's all. Now it can:

//1) Fetch the data
//2) Edit accordingly 

?>
<!DOCTYPE html>
<html>

<!--

This is kinda quick and dirty form
You need to fix this later

-->

<body>

  <form method="POST">

     <label for="title">Title</label>
     <input type="text" name="title" value="<?php echo $movie['title']; " />

     <!--
           Add another elements this way..
      -->

    <button type="submit">Save</button>  

  </form>
</body>
</html>
于 2013-03-09T04:55:54.280 に答える