0

これは私ができるはずのことですが、ここで問題を確認するために最後の1時間努力してきましたが、できません。IDタグを使用してエントリを削除する簡単な削除機能です。を通過していdelete_category.phpます。それが私のSQLテーブルが呼び出されるのに役立つ場合blog_categories

エラーをスローしません。その上でechomysql_error()を使用してみましたが、何もしませんでした。それは単にデッドリンクのように機能し、ページを更新します。

どんな助けでもありがたいです。

Blog.php:

 function delete($table, $id) {
        $table = mysql_real_escape_string($table);
        $id = (int) $id;

        mysql_query("DELETE FROM {$table} WHERE id = {$id}");
    }

削除機能のリンク:

<a href="delete_category.php?id=<?php echo $category['id']; ?>">Delete</a>

Delete_category.php

<?php
include("../script/dbconnect.php");
include("../script/blog.php");

if ( ! isset($_GET['id']) ) {
header('location: cms.php');
die();
}

delete('blog_categories', $_GET['id']);

header('location:category_list.php');
die();
?>
4

1 に答える 1

5

したがって、これは完全な答えではありませんが、コメントフィールドは非常に短く、正しいトラブルシューティングの方向を示すには短すぎます。

あなたのコードは壊れていますが、あなたが期待する方法ではありません。

  1. GETリクエストべきである必要があります。つまり、コンテンツを提供する以外の副作用はありません。削除機能をGETリクエストに関連付けることにより、副作用が発生します。これはかなり深刻な結果をもたらします。たとえば、一部のブラウザとキャッシュメカニズムは、リンクをプリフェッチできます。また、検索スパイダーがそのページをクロールした場合にどうなるかについても考えてください。

    そのGETをPOSTに変えます。おそらく、代わりにフォームとボタンを使用しますか?

  2. 使用しているのは素晴らしいですmysql_real_escape_stringが、ここでの使用は正しくありません。 mres文字データを文字列の一部としてエンコードするように設計されています。識別子(テーブル名)で使用しています。識別子は、特に引用符の外で使用される場合、文字列と同じエスケープセマンティクスを共有しません。

    delete関数の最初の引数がユーザーを経由しない限り、mresここをスキップできます。

  3. からの結果をチェックしていませんmysql_query。マニュアルを言う:

    他のタイプのSQLステートメント、、、、、などの場合INSERT、 mysql_query()は成功またはエラー時に戻ります。UPDATEDELETEDROPTRUEFALSE

    あなたは結果を捨てています。そうでない ことを確認してからfalse、呼び出しmysql_affected_rowsて1行だけが削除されたことを確認する必要があります。だった場合mysql_query false、確認できますmysql_error

これらの変更を行った後、トラブルシューティングに役立つようにdelete_category.phpスクリプトを変更する必要があります。

  1. 一番上に次の2行を追加します。
      error_reporting(-1);
      ini_set('display_errors'、true);
    
  2. すべてのheadersをechosに変更します。即時リダイレクトにより、エラーがマスクされます。
  3. exitの代わりに使用してくださいdie。それらは同じことをしますが、の使用はdie、「何かがうまくいかなかったので、今すぐ終了しなければならない」という文脈でのみ使用されることがexitよくあります。

実際に問題が発生している場合は、かなり明白なはずです。

それでも問題が発生せず、行が削除されない場合は、同じテーブル名と句SELECT COUNT(*) FROM ...を使用して、削除の前後に追加してみてください。WHEREこれは、さらにトラブルシューティングするのに役立ちます。

長期的には、本当にmysql_ PDOまたはmysqliからの切り替えを開始したいと考えています。PHPの次のメジャーリリースであるバージョン5.5は、関数ファミリーの廃止です。mysql_

于 2012-12-25T22:26:48.827 に答える