【问题标题】:Errors with foreach and arrayforeach 和数组的错误
【发布时间】:2012-06-11 21:13:48
【问题描述】:

您好,我正在使用 foreach 将一本书的多个作者插入到我的数据库中。

这是foreach:

foreach ($_POST["authors"] as $author) 
{
    $sqlAuthor = "INSERT INTO book_author (book_ISBN, author_ID)
        VALUES('$isbn','$author')";

    mysql_query($sqlAuthor);
}

我正在从我的页面中获取带有select multiple 的作者,为此我创建了一个函数以在select multiple 中显示可用的作者。

代码正在生成我希望它从我的数据库(所有作者的姓名)在页面中生成的内容

这里是multiple() 函数:

<?php include ("includes/connections.php");
    function multiple($intIdField, $strfNameField, $strlNameField, $strTableName, $strOrderField, $strNameOrdinal, $strMethod="asc") {
       echo "<select multiple=\"multiple\" name=\"$strNameOrdinal\[\]\">\n";

       $strQuery = "select $intIdField, $strfNameField, $strlNameField
                   from $strTableName
                   order by $strOrderField $strMethod";

       $rsrcResult = mysql_query($strQuery);

       while($arrayRow = mysql_fetch_assoc($rsrcResult)) {
          $strA = $arrayRow["$intIdField"];
          $strB = $arrayRow["$strlNameField"] . " " . $arrayRow["$strfNameField"];    
          echo "<option value=\"$strA \">$strB</option>\n";
       }

       echo "</select>";
    }
?>

现在由于某种原因它抛出以下错误:

Notice: Undefined index: authors in C:\xampp\htdocs\ex\addBook.php on line 63

Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\ex\addBook.php on line 63

我认为它告诉我它找不到 authors 数组,但我觉得很奇怪

这里是调用multiple()函数的html里面的php代码:

&lt;?php multiple("author_ID", "author_firstname", "author_lastname", "author", "author_lastname", "authors"); ?&gt;

有人知道我的代码有什么问题吗?

【问题讨论】:

  • 请停止使用古老的 MySQL 扩展编写新代码:它不再维护,社区已开始 deprecation process;您可以改用改进的MySQLi 扩展或PDO 抽象层。
  • 您的代码容易受到 SQL 注入的攻击。您真的应该使用prepared statements,将变量作为不获得 SQL 评估。如果你不知道我在说什么,或者如何解决它,请阅读 Bobby Tables 的故事。
  • 您是否查看过您的代码生成的 HTML 以确保它产生了您期望的结果?

标签: php mysql html database foreach


【解决方案1】:

改成

echo "<select multiple=\"multiple\" name=\"{$strNameOrdinal}[]\">\n";

并且在使用它之前检查它是否按照其他人的建议设置。

编辑:与手头的问题无关,但您在$strA 之后有一个额外的空间,如果不是故意的,请更改为。

echo "<option value=\"$strA\">$strB</option>\n";

【讨论】:

  • 我试过了,但没有用,我也故意留下了 if ,即使选择了作者,它仍然显示“作者”未定义的错误。所以即使我选择了作者,它仍然没有定义。很奇怪
  • 我建议您使用validator.w3.org 来验证您的html,然后使用firebug(或任何替代方法)来检查发布的内容。
  • 我省略了 if 语句,这样当数组为空时它会显示错误,即使它不应该是空的
【解决方案2】:

每次使用 foreach 时都将其嵌套在 if 中:

if (count($_POST["authors"])) {
    foreach ($_POST["authors"] as $author)  {
       ...
    }
}

所以如果数组中有 0 个元素,或者它不是数组(字符串、null 或其他任何内容),则不会输入 if,并且不会在 foreach 的错误参数上得到错误

【讨论】:

  • 如果只是检查空数组,我的问题是即使我选择了我想要的作者它仍然是一个空数组
  • @SilliconTouch,当您选择并发布了 2 个元素时,var_dump($_POST["authors"]) 会显示什么?
  • 它显示这个:array(2) { [0]=&gt; string(3) "10 " [1]=&gt; string(2) "1 " }
  • 耶稣!我找到了,每个身份后的额外空间使其无法正常工作
  • 奇怪。当你选择了东西时,第 63 行也出现了错误???顺便说一句,数字后面有空格:“10”、“1”,这可能会在以后给你带来另一个问题,所以也要修复它
【解决方案3】:

它抛出通知和错误是因为$_POST["authors"] 没有定义或者没有作者。

只需使用if(isset($_POST["authors"])) { 即可确保数据已提交。

【讨论】:

    【解决方案4】:

    改变这个:

    foreach ($_POST["authors"] as $author) 
    {
    

    到这里:

    foreach ((array)$_POST["authors"] as $author) 
    {
    

    使其空置安全。 我也看不到“作者”从哪里发送到 addBook.php 以提出建议..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-29
      • 2018-09-22
      • 2016-06-28
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多