0

このコードを取得して、Web ページにテーブルを表示しました。テーブルの内容はデータベースとリンクしています。だから私はhtmlテーブルのデータベースからテーブルを取得します。各 (html) 行の最後に、画像 (icon-delete.png) を取得しました。これはの値を取得します$row[0](これは私の PKID がある場所なので、常に一意の番号であり、自動昇順です。ここで、PHP コードで icon-delete.png ボタンをクリックした個々の行をクリアしたいと思います。行もデータベースから削除する必要があります.これは現時点での私のコードです:

$con = mysql_connect('localhost', 'root', '');
if ($con) {
    mysql_select_db('bieren', $con);
    $result = mysql_query('SELECT * FROM brouwers');
    echo '<form action="" method="post">';
    echo '<table border="0" cellspacing=0>';    
    echo '<tr class="heads">
        <th>brouwernr</th>
        <th>brouwernaam</th>
        <th>adres</th>
        <th>postcode</th>
        <th>gemeente</th>
        <th>omzet</th>
    </tr>';

    $counter = 0;
    while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
        if($counter % 2 == 0){
            echo '<tr class="even">';
        } else{
            echo '<tr class="oneven">';
        }

        for($i = 0; $i <=6; $i++){
            $counter ++;
            echo '<td>';
            echo $row[$i];
            echo'</td>';
        }

        echo '<td> <input type="image" src="icon-delete.png" name="delete" value ="'.$row[0].'" /> </td>';
        echo '</tr>';
    }   
} else {
    echo 'Connectie niet geslaagd. Reden: ' . mysql_error() . '. Probeer opnieuw.';
}
echo '</table>';
echo '</form>';

if(isset($_POST))
{
    $con = mysql_connect('localhost', 'root', '');

    if ($con) {
        mysql_select_db('bieren', $con);
        $result = mysql_query('DELETE FROM brouwers 
                  WHERE brouwers.brouwernr = "'.$row[0].'"');}
}

コードの最後のルールの 1 つは、WHEREbrouwers.brouwernr = $row[0]ですが、これは削除する正しい行ではありません。何をする必要があるかを理解できるように、今取得したもののイメージも html で示します。

ウェブページ ビュー

4

1 に答える 1

4

元の質問に対する答えは、削除したい行のIDとして $_POST['delete'] を使用する必要があるということだと思います.

ただし、元の問題に付加価値を加えることができ、古い ext/mysql 拡張機能 (現在は推奨されておらず、長い間推奨されていません) の使用について考えを変えるよう説得できると信じています。現在、PDO を使用したくないとおっしゃっていることに気付きました。私がその考え方に問題を感じているのは、古い mysql API の使用をやめて、PDOMySQLiなどの新しい API の使用を開始するのに今が絶好の時期であるということです。古い API を使用しない理由を説明するのではなく、代わりに新しい API を使用する理由をいくつか説明します。

  1. 現在使用してmysql_*いる API (関数) は 15 年近く前のものです。私たちのほとんどは、それほど古い車を所有していません。交通手段を重視するのと同じくらいコードを重視しますか? この拡張機能は MySQL バージョン 3.x で導入され、それ以来、そのバージョンの MySQL との下位互換性を維持しています。この余分な下位互換性制約により、API はデータベースの新しい機能をすべてサポートすることができず、その機能の多くは、今日の Web での最新のアプリケーション開発にとって非常に貴重です。
  2. API は、MySQL コミュニティからメンテナンスやサポートを受けなくなりました。これは、この拡張機能が何年にもわたって変更されることを期待すべきではないことを意味します。これには、バグ修正、潜在的なセキュリティ パッチ、および MySQL の変更が何年にもわたって拡張機能を壊す可能性があるものが含まれます。それは良いことではありません (自分自身を危険にさらしています)。PDO と MySLQi はどちらも、これらのリスクからコードを安全に保ち、何か問題が発生した場合 (バグが見つかった場合) に拡張機能が迅速に修正されることを期待できるという追加の利便性も提供します。
  3. 新しい API は、次のような ext/mysql では使用できない機能を提供します。
    • プリペアド ステートメント (多くの一般的な状況でパフォーマンスが向上する可能性があります)
    • パラメーター化されたクエリ (ここで経験したエスケープの問題のような一般的な人的エラーを回避するのに役立ちます)
    • 非同期クエリ (もう 1 つのパフォーマンス上の利点)
    • ストアド プロシージャ (通常の SQL クエリでは実現できない利点を提供する優れたツール)
    • 複数のクエリ機能
    • トランザクション サポート (財務データなどのミッション クリティカルなアプリケーション向け)
    • SSL サポート (ネットワーク上に複数のデータベース サーバーがある場合)
    • 古い API では実行できない、MySQL サーバーとやり取りするコマンドを実行する機能。
  4. 新しい API を使用すると、コードが読みやすく、操作しやすくなります。これらの API を使用して、計算ロジックの多くを SQL ロジックから抽象化し、ext/mysql が邪魔する不要な複雑さを回避できます。
  5. PDO はデータベースにとらわれない API です。つまり、PHP で同じ関数セットを一度学習すれば、PHP がサポートできる任意のデータベースとインターフェースを取ることができます。将来、新しいデータベースを使用する必要が生じた場合でも、新しいインターフェイスを再学習する必要はありません。これにより、PHP コードの作業にかかる時間と労力の両方を節約できます。

私があなたのためにリストしたこれらの利点のいくつかを見た後; 今すぐ切り替えないことのメリットを考えてみてください。そして、それらが切り替えの利点を上回っているかどうか教えてください. 新しい API への移行をこれ以上先延ばしにする利点は 1 つも思いつかないため、そのような結論に達することはできないと確信しています。この古い API は不適切な慣行を助長します。今日、回答を得たときにその 1 つに気付きました。何年にもわたって ext/mysql を使用してきたために、これらの不適切な慣行が脳に染み込んでいるのはあなただけではありません。私でさえ、過去 8 年ほどの間に ext/mysql からどれだけ多くの悪い習慣を身につけてきたかを認識しています。しかし、実際に長所と短所を検討したとき (そして、過去 2 年間これを行ってきました)、長所が短所をはるかに上回っているという結論に達しました。

簡単な例として、 PDO を使用すると、コードがどれほど美しく読みやすく、デバッグしやすくなるかを見てみましょう。

/* This creates a new PDO object that holds the connection to your database */
$db = new PDO('mysql:dbname=bieren;host=localhost;charset=UTF-8', 'root', '');

/* This puts PDO into Exception Mode making it easier for you to catch errors */
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0); // turn off emulation

/* Create your HTML table */
echo "<table>";

// Look how easy it is to loop over the results
foreach($db->query('SELECT * FROM brouwers', PDO::FETCH_NUM) as $i => $row) {
    echo ($i % 2 ? '<tr class="oneven">' : '<tr class="even">');
    foreach ($row as $column) {
        echo "<td>$column</td>";
    }
    echo "</tr>\n";
}

echo "</table>";

そのコードがどれだけ美しく簡潔に見えるかを見てください。実際には読みやすくなっています! 同意しますか?

于 2012-12-09T11:57:13.197 に答える