4

PHP の初心者であり、Robin Nixon の PHP、MySQL、Javascript の本を読んでいます。PHPスクリプトを使用してデータを挿入および削除する例、特に作者が$_POSTを使用する方法に問題があります。

この例は、複数の入力を持つ書籍のレコードの追加/削除の非常に単純な例です。コードは次のとおりです。

if (isset($_POST['delete']) && isset($_POST['isbn']))
{
    $isbn  = get_post('isbn');
    $query = "DELETE FROM classics WHERE isbn='$isbn'";

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

if (isset($_POST['author']) &&
    isset($_POST['title']) &&
    isset($_POST['category']) &&
    isset($_POST['year']) &&
    isset($_POST['isbn']))
{
    $author   = get_post('author');
    $title    = get_post('title');
    $category = get_post('category');
    $year     = get_post('year');
    $isbn     = get_post('isbn');

    $query = "INSERT INTO classics VALUES" .
        "('$author', '$title', '$category', '$year', '$isbn')";

    if (!mysql_query($query, $db_server))
        echo "INSERT failed: $query<br />" .
        mysql_error() . "<br /><br />";
}

echo <<<_END
<form action="sqltest.php" method="post"><pre>
    Author <input type="text" name="author" />
    Title <input type="text" name="title" />
    Category <input type="text" name="category" />
    Year <input type="text" name="year" />
    ISBN <input type="text" name="isbn" />
    <input type="submit" value="ADD RECORD" />
    </pre></form>
_END;

$query = "SELECT * FROM classics";
$result = mysql_query($query);

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

for ($j = 0 ; $j < $rows ; ++$j)
{
    $row = mysql_fetch_row($result);
    echo <<<_END
<pre>
  Author $row[0]
   Title $row[1]
Category $row[2]
    Year $row[3]
    ISBN $row[4]
</pre>
<form action="sqltest.php" method="post">
<input type="hidden" name="delete" value="yes" />
<input type="hidden" name="isbn" value="$row[4]" />
<input type="submit" value="DELETE RECORD" /></form>
_END;
}

mysql_close($db_server);

function get_post($var)
{
    return mysql_real_escape_string($_POST[$var]);
}
?>

$_POST の要素を if (isset($_POST['delete']) && isset($_POST['isbn'])) で参照すると、delete と isbn が名前として複数回使用されます。削除するために参照する要素を知っていますか? 一度に 1 つのレコードしか削除できないため、配列内の要素は既に設定されている要素を自動的に指すと思います。しかし、isset($_POST['isbn']) の 2 番目の条件は、チェックする「isbn」要素をどのように判断するのでしょうか? && は $_POST['isbn'] を正しい行に「継承」させますか?

助けてくれてありがとう!そして、語彙の誤用の可能性についてお詫び申し上げます。まだすべてに慣れています。

4

2 に答える 2

4

あなたの質問は実際にはよく考えられています。そして、本に示されている例は、私にはかなりずさんに思えます。後の章で、彼が$_POST値での配列の使用について詳しく説明すると思います。とにかく、スクリプト全体の機能の鍵は次のとおりです。

for ($j = 0 ; $j < $rows ; ++$j)
{
    $row = mysql_fetch_row($result);
    echo <<<_END
<pre>
  Author $row[0]
   Title $row[1]
Category $row[2]
    Year $row[3]
    ISBN $row[4]
</pre>
<form action="sqltest.php" method="post">
<input type="hidden" name="delete" value="yes" />
<input type="hidden" name="isbn" value="$row[4]" />
<input type="submit" value="DELETE RECORD" /></form>
_END;
}

わかり<form action="sqltest.php" method="post">ますか?そして、その終わりを見</form>ますか?for ($j = 0 ; $j < $rows ; ++$j)また、ループが発生するたびにレンダリングされていることに注意してください。各行に個別のフォーム要素が 1 つあります。これは厄介なコードですが、機能します。submit個々のリストをクリックすると、ラッピングフォームが応答し、その中にネストされた変数を解析します。

私が言ったように、ずさんなコード。しかし、動作します。<form>それは、ISBN が 30 個リストされている場合、このプログラムは 30 個の個別包装された商品を吐き出すからです。うーん!真剣に、本がコーディングの混乱のこの手のひらに対処する方法で後で配列に対処しない場合は、新しい本を見つけてください。

于 2013-01-27T06:04:32.670 に答える
1

複数のフォームがあるため、1 つのフォームの入力要素のみが送信されます。

したがって、基本的には、['isbn'] を含むsqltest.php配列を 1 つだけ受け取り、対応する値を 1 回だけ受け取ります。$_POST['delete']

print_r($_POST)これは inを使用して確認できますsqltest.php

于 2013-01-27T06:06:46.597 に答える