【问题标题】:Can $_POST differentiate between two elements with the same name?$_POST 可以区分具有相同名称的两个元素吗?
【发布时间】:2013-01-27 05:58:23
【问题描述】:

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]);
}
?>

当你使用 if (isset($_POST['delete']) && isset($_POST['isbn'])) 引用 $_POST 中的元素时,其中 delete 和 isbn 被多次用作名称,如何$_POST 知道要删除哪个元素吗?我假设由于您一次只能删除一条记录,因此数组中的元素将自动指向已设置的记录。但是, isset($_POST['isbn']) 的第二个条件如何知道要检查哪个“isbn”元素? && 是否使 $_POST['isbn'] “继承”正确的行?

感谢您的帮助!并对任何可能的词汇滥用表示歉意。还是习惯了一切。

【问题讨论】:

  • 离题评论:您正在阅读一本过时的书。 mysql_* functions should not be used anymore.
  • 感谢您的提醒。
  • 正面说明:如果您是 PHP 程序员新手,并且知道在“专业”书籍中提出有关此示例编码的问题,那么您已经远远领先于我认识的大多数编程人员。干得好!再找一本书吧。说真的。

标签: php mysql post


【解决方案1】:

您的问题实际上是经过深思熟虑的。书中给出的例子对我来说似乎很草率。我假设在后面的章节中他将深入研究$_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;
}

看到&lt;form action="sqltest.php" method="post"&gt;了吗?看到关闭&lt;/form&gt;了吗?请注意,每次for ($j = 0 ; $j &lt; $rows ; ++$j) 循环发生时它们都会被渲染?每一行都有一个单独的表单元素。那是凌乱的代码,但它有效。当在每个单独的列表上单击submit 时,包装表单会响应并解析嵌套在其中的变量。

就像我说的,草率的代码。但有效。这是因为如果您列出了 30 个 ISBN,该程序将输出 30 个独立包装的 &lt;form&gt; 项目。啊!说真的,如果这本书后来没有以解决这个编码混乱的面孔的方式解决数组问题,那就找一本新书吧。

【讨论】:

  • 哇...完全错过了。本书中的很多例子看起来有点令人费解。感谢您的帮助!
  • 没问题。另外,I looked up the book on Amazon。我已经有一段时间没有看任何关于编程的书了,因为我觉得 Google 搜索和 StackOverflow 之类的地方是更好的信息来源。我做 PHP 已经有 10 年了。但是,伙计,我对这本书有多少正面评价感到震惊。少数负面评论集中在此处提出的问题上。但是哇,像这样草率的编码给了坚实的 4 星?哇。
  • 是的,也许这是一个糟糕的选择。我也一直在做一个小项目,当我遇到困难时,我会使用这个网站来填补我的空白。希望我能做对。如果您有任何推荐,请告诉我!
  • @RyanKim,我对您的最佳建议是搜索处理$_POST 值中的数组,并可能通过将逻辑重新编写为数组并使用mysqli_ 作为首选来清理这个草率的代码连接方式。祝你好运!
【解决方案2】:

由于有多个表单,所以只提交一个表单的输入元素。

所以基本上,sqltest.php 只接收一个 $_POST 数组,其中包含 ['delete'] 和 ['isbn'] 以及对应的值一次。

您可以在sqltest.php 中使用print_r($_POST) 进行检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多