【问题标题】:Create a PHP array from an array from of HTML input values in a for loop在 for 循环中从 HTML 输入值的数组创建 PHP 数组
【发布时间】:2017-08-31 05:00:40
【问题描述】:

我试图创建一个由循环中的输入值组成的数组。我对 PHP 很陌生,并查找了其他几个问题,但无济于事。我正在获取一个随机数“$QuestionNoSelect”并从 MySQL 服务器中选择有关该问题的文本和信息。

//For loop for displaying and naming
for($i = 0; $i < 11; $i++)
{

$QuestionNoSelect = rand(1,16);

array_push($IDListing, $QuestionNoSelect);

$sql = "SELECT QuestionText FROM johnconn_sstest.tbRandomArray WHERE QuestionNo = $QuestionNoSelect";
$QuestionText = $conn->query($sql);

if ($QuestionText->num_rows > 0)
{
    // output data of each row
    while($row = $QuestionText->fetch_assoc()) 
    {

        //Number Question, Increment, Question then input box
        echo "<br><br>".$QuestionNumberer. ". ". "<br>";
        echo "Question number ID= ".$QuestionNoSelect, "<br>";

        $QuestionNumberer++;
        echo $row["QuestionText"];
        echo '<br>'.'Answer';
        echo "<input type='text' name='answerbox[]'  id='answerbox[]' class='userInfo' value='".$i."'/>";
        echo '<br>'.'comment(if Applicable)';
        echo "<input type='text' name='commentbox[]' id='commentbox'[]' class='userInfo' value='".$i."'/>";
    }
} 
else 
{
    echo "0 results";
}

}

我试图从我创建的名称或 ID 数组中获取这些值,但无法弄清楚为什么我不能让它工作。我什至无法打印要打印的值数组

//PRINT ANSWER 
echo '<br>Answer List <br>';

 for($i = 0; $i < 11; $i++)
 {
 $_POST("answerbox[$i]");
 }

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 您的脚本中有拼写错误,请查找commentbox'[]' class='use(一个' 到mutch),然后执行foreach($_POST['answerbox'] as $value){ print $answer; } 以更好地理解它,请执行print_r($_POST)
  • 我建议不要运行 10 个单独的查询。获取您的 10 个随机问题编号,然后向您的数据库询问它们——仅一次。为什么将$i 放入答案框和评论框字段值中?关于您的代码,有很多地方对我没有意义。你不应该使用$i 作为你的Numberererer吗?
  • 我将 $i 放入 var 框中以检查它是否有效。文本输入框的默认值是我在字段值中输入的任何值。是的,我对它是如何工作的感到困惑。我之前在方括号内有 $i ,但我遇到了同样的问题。我查找了与此类似的其他 SO 问题,他们的方括号内没有 $i 。这是我使用 HTML 和 PHP 制作的第一个程序。我敢肯定它写得很糟糕。
  • 你的代码中有
    标签吗?这是如何提交的?
  • 我目前在表单中有一个完整的 for 循环,最后有一个提交按钮。虽然当我按下提交时,选择的问题被重新打乱了。不过,我可能很容易解决这个问题。

标签: php html mysql arrays forms


【解决方案1】:

print_r 是你的朋友。你可以 print_r($_POST) 这会让你看看你是否拥有你认为你拥有的东西。一旦你看到,你应该清楚为什么你没有看到你想要的。

如果此代码旨在打印答案,则需要类似于

echo $_POST["answerbox[{$i}]"];

【讨论】:

  • 我同意@justOnUnderMillions 但不能在那里发表评论。我想到了一个 foreach,但考虑到他对 php 的不熟悉以及它需要按指定的顺序进行,我不建议更改
  • 感谢您的回复。我修正了错字,并一直试图从阵列中打印任何东西,但似乎无法。 foreach($_POST['answerbox'] as $value) { echo $_POST["answerbox[$i]"]; print_r($_POST["答案框[$i]"]);回声 $_POST($value[$i]); print_r($_POST($value[$i]));}
  • 只需从 print_r($_POST) 开始 - 还要在循环中添加一些内容以查看您是否正在迭代。如果您发布 _POST,我们可能会提供更多帮助
  • 我在那里尝试了 4 种不同的打印变体。我确定我在做一些愚蠢的事情,但我不知道如何解决它。
  • 这意味着您没有来自 html 的 post 变量 - 关于 SO 处理该问题有几个问题
【解决方案2】:

简短的回答是您将 $_POST 视为函数 ($_POST()) 而不是数组 ($_POST[])。因为您的表单字段是一维数组,所以您的 $_POST 数据是一个二维数组。使用以下语法访问提交的数组元素:

$_POST[formfieldname][numerickey]

我已经重写了您的部分代码并添加了一些改进,这些改进应该可以提高效率并展示一些好的做法。

$conn=new mysqli($host, $user, $pass, $dbname);
$conn->select_db('johnconn_sstest');  // designate a default database
$sql="SELECT QuestionNo,QuestionText FROM tbRandomArray ORDER BY RAND() LIMIT 10;";  // until your table gets very, very large RAND() will serve you well
if($result=$conn->query($sql)){  // declare $result and check if true/success or false/syntax failed
    $i=0;
    echo "<form action=\"receiving_page.php\" method=\"post\">";  // assign receiving page and data delivery method
        while($row=$result->fetch_assoc()){  // loop through your db table rows
            ++$i;
            echo "Q$i ID:{$row['QuestionNo']}<br>";  // show counter and question's row id
            echo "<input type=\"hidden\" name=\"QNo[$i]\" value=\"{$row['QuestionNo']}\">";  // invisibly pass question id to receiving page
            echo "{$row['QuestionText']}<br>";
            echo "Answer <input type=\"text\" name=\"answerbox[$i]\"  id=\"answerbox$i\" class=\"userInfo\" value=\"\"><br>";  // assign numeric key to each answer input name beginning with 1
            echo "Comment(if Applicable) <input type=\"text\" name=\"commentbox[$i]\" id=\"commentbox$i\" class=\"userInfo\" value=\"\"><br><br>";  // assign numeric key to each answer input name beginning with 1
        }
        echo "<input type=\"submit\" value=\"Submit\">";  // submit button with no name attribute so the value is not passed to the receiving page
    echo "</form>";
}else{
    echo $conn->error;
}

@receiveing_page.php:

if(isset($_POST["QNo"]) && sizeof($_POST["QNo"])==10  && 
   isset($_POST["answerbox"]) && sizeof($_POST["answerbox"])==10  && 
   isset($_POST["commentbox"]) && sizeof($_POST["commentbox"])==10){
    foreach($_POST["QNo"] as $index=>$value){
        // do whatever you like with the values, use $index access other arrays' elements
        // $value is each QNo in sequence.
        // $_POST["answerbox"][$i] is answerbox value in the same QNo row
        // $_POST["commentbox"][$i] is commentbox value in the same QNo row
    }
}else{
    echo "Did not receive the full batch of expected values";
}

当然,在您的表单上,字段的键(fieldname[$i] 中的$i)可以像这样省略:fieldname[] - 这可能更可取,但请注意,然后数字键将从 0 开始而不是 1,并且会自动递增。

【讨论】:

  • 你有什么建议?
  • 这是我第一次发帖,所以即使点击了绿色检查,计数器也不会出现。这是完美的工作。感谢您的帮助。
  • 我的意思是,描述您如何解决问题可能会有所帮助,以便其他读者也可以从中受益。仅通过查看您重写的代码很难判断问题所在。
  • 我会引用它所说的话。 “感谢反馈!声望低于 15 人的投票会被记录下来,但不要更改公开显示的帖子得分。”我不是想在朋友的支持中败给你哈哈。
  • @JohnBon 感谢您的接受。我很乐意提供帮助。祝你未来的编码好运。
猜你喜欢
  • 2013-08-28
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
  • 2012-09-11
  • 2021-09-11
  • 1970-01-01
  • 2020-05-16
相关资源
最近更新 更多