【问题标题】:finding which auto generated input was changed/button pressed - updated查找哪个自动生成的输入已更改/按下按钮 - 已更新
【发布时间】:2020-04-27 17:23:18
【问题描述】:

我有一个 PHP&mySQL 代码,它生成一个带有唯一名称的输入字段和按钮的 html 表。这是执行此操作的代码:

echo     "<input type=\"hidden\"name=\"id_$num\" 
        value=".$row['idSales']."><tr><td>".$row['idSales'].
        "</td><td>". $username.
        "</td><td>". $row['product'].
        "</td><td>". $row['productAmount'].
        "</td><td>". $row['dateOfPurchase'].
        "</td><td>". $row['userAddress'].
        "</td><td><a href=\"$eLink\">". $eLink .
        "</a></td><td>
        <input type=\"text\" name=\"status_$num\" class=\"input\" value=".$row['productStatus']. ">
        <input type=\"submit\" name=\"submit_$num\" value=\"submit\" class=\"button\"></td></tr>" ;

(代码循环生成每个表格行)

表格的形式是,当按下按钮时,会触发另一个文件中的代码(action="...")

我试图做的是为了找到按下的按钮是这样的:

   $num = -1;
while(!isset($_POST["submit_$num"])){

    $num = $num +1;

    if(isset($_POST["status_$num"])){
        $status = $_POST["status_$num"];
        $id = $_POST["id_$num"];   
    }

问题: 我的网站没有停止加载,我认为这意味着循环是无止境的。

问题:

  1. 有没有办法找到按下的按钮?也许我的方法有效,但我有语法错误?

2. $_POST 函数是否适用于非输入类型? $_POST 会拉出 id 吗?

谢谢!

编辑:更新 谢谢大家的回答,我修复了你告诉我的错误并更新了上面帖子中的代码,虽然循环继续无限循环,我尝试在 if 语句中添加一个 break 并且代码有效但仅适用于第一个输入。

【问题讨论】:

  • 你不应该在循环中使用require
  • $_POST 仅适用于输入类型。
  • 不知道为什么你在这里有一个循环。在while(!isset($_POST["submit_$num"])){ 处进行“非”比较会导致循环无限。
  • ????如果您刚刚开始使用 PHP 并想构建应用程序,我强烈建议您查看各种 development frameworks 以查看是否可以找到适合您的风格和需要。它们有多种风格,从 Fat-Free Framework 这样的轻量级到像 Laravel 这样的更全面。这些为您提供了具体的工作示例以及如何编写代码和组织项目文件的指导。
  • @tadman 我正在为一个学校项目做这个网站,遗憾的是我没有时间学习一个新的框架,因为网站快完成了。当我完成项目后有空闲时间时,我会坚决检查 Laravel,谢谢!

标签: php mysql forms


【解决方案1】:

可以在提交时不循环,输入名称使用数组语法

name=\"id_$num\" 替换为name=\"id[$num]\",将name=\"status_$num\" 替换为name=\"status[$num]\",将name=\"submit_$num\" 替换为name=\"submit[$num]\"。所以你的代码会是这样的:

echo     "<input type=\"hidden\"name=\"id[$num]\" 
        value=".$row['idSales']."><tr><td>".$row['idSales'].
        "</td><td>". $username.
        "</td><td>". $row['product'].
        "</td><td>". $row['productAmount'].
        "</td><td>". $row['dateOfPurchase'].
        "</td><td>". $row['userAddress'].
        "</td><td><a href=\"$eLink\">". $eLink .
        "</a></td><td>
        <input type=\"text\" name=\"status[$num]\" class=\"input\" value=".$row['productStatus']. ">
        <input type=\"submit\" name=\"submit[$num]\" value=\"submit\" class=\"button\"></td></tr>" ;

然后$_POST['submit'] 将包含一个元素[$num =&gt; 'submit'] 的数组。 $_POST['id']$_POST['status'] 也是数组。您可以轻松获取 id 和 status:

$num = array_shift(array_keys($_POST['submit']));
$id = $_POST['id'][$num];
$status = $_POST['status'][$num];

如果$row['idSales'] 是一个整数且唯一,您也可以去掉隐藏的输入“id”并使用$row['idSales'] 作为键而不是$num。所以第一个片段是:

echo    "<tr><td>".$row['idSales'].
        "</td><td>". $username.
        "</td><td>". $row['product'].
        "</td><td>". $row['productAmount'].
        "</td><td>". $row['dateOfPurchase'].
        "</td><td>". $row['userAddress'].
        "</td><td><a href=\"$eLink\">". $eLink .
        "</a></td><td>
        <input type=\"text\" name=\"status[" . $row['idSales'] . "]\" class=\"input\" value=".$row['productStatus']. ">
        <input type=\"submit\" name=\"submit[" . $row['idSales'] . "]\" value=\"submit\" class=\"button\"></td></tr>" ;

第二个

$id = array_shift(array_keys($_POST['submit']));
$status = $_POST['status'][$id];

【讨论】:

  • 非常感谢!是的,我的 id 是一个整数并且是唯一的,我需要在代码中替换什么才能不使用 $name?
  • 我已经回答完毕
【解决方案2】:

如果我理解正确,如果您遇到有效的 $POST["submit$num"] ,您的 while() 循环应该会中断?

$num 在 while() 循环中不会增加:它的值保持在 -1,!isset() 仍然有效,所以你有一个无限循环

我建议你的表重写为

echo "... <input type='submit' name 'btnSubmit' value='$num'> ..." ;

然后你可以直接查询 $_POST['btnSubmit'] ,不需要无限循环。

关于 $_POST 与非输入字段的问题:不,您至少需要一个隐藏的输入字段才能使其显示在 $_POST[]

编辑:在http://phpfiddle.org/ 中试试这个示例代码:

<html>
<head>
</head>
<body>

<?php
if ( isset($_POST['btnSubmit']) )
{
    echo "<P>In previous run, submitted value " . $_POST[ 'entry' . $_POST['btnSubmit'] ] . "</P> \r\n" ;
}
else
    echo "<P>No submit in previous run ...</P> \r\n" ;    
?>

   <form name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" >
      <input type=text name="entry1" value="123">
      <input type=submit name="btnSubmit" value="1"><br/>
      <input type=text name="entry2" value="456">
      <input type=submit name="btnSubmit" value="2">
   </form>
</body>
</html>

您可以编辑两个文本字段,然后单击 1 个提交按钮:脚本将回显相应的更新值

编辑 2

<html>
<head>
<script>
function mySubmit(submitValue)
{   
   try
   {
      // store selected submit value in hidden INPUT 
      document.getElementById('submitID').value = submitValue ;

      // manually submit the form
      document.getElementById('formID').submit() ;
   }
   catch(err)
   {
       alert(err.message) ;
   }    
 }
</script>    
</head>
<body>

<?php
if ( isset($_POST['btnSubmit']) )
   echo "<P>In previous run, you submitted value " . $_POST[ 'entry' . $_POST['btnSubmit'] ] . "</P> \r\n" ;
else
   echo "<P>No submit in previous run ...</P> \r\n" ;
?>

   <form id='formID' name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" >
      <input type=text name="entry1" value="123">
      <button onClick="mySubmit(1);">Submit me !</button><br/>
      <input type=text name="entry2" value="456">
      <button onClick="mySubmit(2);">Submit me !</button><br/>

      <input type=hidden id='submitID' name='btnSubmit'>    
   </form>
</body>

</html>

现在,这是一种快速而简单的方法 - 因此,根据您的完整情况,您可以考虑设置 AJAX 调用

【讨论】:

  • 如果我为每个按钮和/或输入(状态)使用相同的名称,当我使用 $_POST 时,我的代码如何知道哪个输入被更改?
  • 因为该控件的 VALUE 发生了变化:假设第 1 行的“btnSubmit”值为“1”,第 2 行的“btnSubmit”值为“2”,...如果您单击提交按钮第 365 行,$_POST["btnSubmit"] 将包含 365。那么您知道 $POST["status_365"] 包含提交的值。重新声明输入字段可能看起来很奇怪 - 但您正在重新声明输入 name,而不是输入 ID。查看techrepublic.com/article/…,使用 SWITCH/ASE 进行分支一章
  • 是否可以不使用 value 属性?我想按钮说“提交”而不是 1,2,3...
  • 我刚刚用示例代码编辑了我的答案,所以我错过了你的评论 :-) 是的,你可以:在你的表单中创建一个 。用调用 JS 函数“mySubmit() 的常规按钮替换每一行的提交按钮:此函数接受参数,将其写入隐藏变量,然后触发表单提交。检查编辑 2 . 但是 - 那么您将接近 AJAX 领域;可能需要检查这是否更适合您的整个解决方案。
猜你喜欢
  • 2014-11-27
  • 2013-08-14
  • 2022-01-07
  • 2021-03-23
  • 2023-02-03
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
相关资源
最近更新 更多