найти, какой автоматически сгенерированный ввод был изменен / нажата кнопка - обновлено - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть код 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"];   
    }

Проблема: мой веб-сайт не перестает загружаться, что, как я полагаю, означает, что l oop бесконечен.

Вопросы:

  1. Есть ли способ найти нажатую кнопку? может быть, мой метод работает, но у меня есть синтаксическая ошибка?

2. Работает ли функция $ _POST на не входных типах? $ _POST будет тянуть идентификатор?

Спасибо!

Редактировать: Обновить Спасибо всем за ответы, я исправил ошибки, которые вы мне сообщили, и обновил код в посте выше, хотя l oop продолжает бесконечно l oop, я попытался добавить разрыв в операторе if, и код работал, но только для первого ввода.

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Это можно сделать без l oop при отправке, используя синтаксис массива для входных имен

Заменить 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 => 'submit']. $_POST['id'] и $_POST['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];
0 голосов
/ 27 апреля 2020

Если я правильно понимаю, ваш while () l oop должен прерваться, если вы встретите действительный $ POST ["submit $ num"]?

$ num не увеличивается в пределах while () l oop: его значение остается равным -1,! isset () остается действительным, и поэтому у вас есть бесконечный l oop

Я предлагаю переписать вашу таблицу как

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

Затем вы можете напрямую запросить $ _POST ['btnSubmit'], без необходимости указывать бесконечное l oop.

По вашему вопросу о полях $ _POST против полей ввода: нет, вам нужно хотя бы скрытое поле ввода, чтобы оно отображалось в $ _POST []

edit : попробуйте этот пример кода в 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 кнопку отправки: скрипт отобразит соответствующее обновленное значение

edit 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 call

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...