Кнопка отправки для каждой итерации foreach l oop in PHP - PullRequest
1 голос
/ 16 января 2020

Я очень новичок в кодировании, поэтому, пожалуйста, go осторожно ...

Я создаю страницу администратора со списком учетных записей, которые требуют проверки. Все, что мне нужно, это чтобы значение в столбце «проверено» в БД изменялось с 0 на 1 при нажатии кнопки. Проблема в том, что он запускает то же самое для всех остальных возвращаемых результатов в l oop, у каждого из которых есть свои кнопки, а не только для этой конкретной итерации l oop. Любая помощь будет принята с благодарностью. Код выглядит следующим образом:

<?php
$sql ="SELECT customer.First_Name, customer.Last_Name, account.account_no, account.client_id, customer.username
FROM customer 
 INNER JOIN account 
 ON customer.customer_id=account.client_id 
 WHERE validated = 0"; 

$tobe_validated = $dbh->query($sql);

foreach ($tobe_validated as $row) {
        //creating variable for account number to put in query  
        $clientid=$row["client_id"];

        echo "<div class='valid_name_btn'>";  
        echo "<form method='post'><input type='submit' class='btn btn-outline-primary' value ='Validate' name='validate' id='validate'></input></form>";
        echo "<div class='valid_name'>"; //div for name
        echo $row["First_Name"] . " " . $row["Last_Name"]." - Account No. ". $row["account_no"]."<br/>"; //show name and account number of client
        echo "</div>";
        echo "</div>";


        // query to change validated in customer table to 1
          $sql ="UPDATE customer SET validated = 1 WHERE customer_id = '$clientid'";

        // validate account when button is clicked
          if(isset($_POST['validate'])) {
          $dbh->query($sql);
          } 
         }

Ответы [ 4 ]

2 голосов
/ 16 января 2020

У вас есть логическая ошибка, поскольку ваши формы просто передают значение validate, но не точное clientid. Вы должны удалить действие $_POST из вашего l oop и добавить в каждую форму скрытое поле с соответствующим clientid:

<?php
    $sql = "SELECT customer.First_Name, customer.Last_Name, account.account_no, account.client_id, customer.username
            FROM customer
            INNER JOIN account ON customer.customer_id=account.client_id
             WHERE validated = 0";

    $tobe_validated = $dbh->query($sql);

    foreach ($tobe_validated as $row) {
        //creating variable for account number to put in query
        $clientid = $row["client_id"];

        echo "<div class='valid_name_btn'>";
            echo "<form method='post'>
                <input type='hidden' name='clientid' value='".$clientid."'>
                <input type='submit' class='btn btn-outline-primary' value ='Validate' name='validate' id='validate'></input>
            </form>";
            echo "<div class='valid_name'>"; //div for name
                echo $row["First_Name"] . " " . $row["Last_Name"] . " - Account No. " . $row["account_no"] . "<br/>"; //show name and account number of client
            echo "</div>";
        echo "</div>";
    }

    if (isset($_POST['validate']) && isset($_POST['clientid'])) {
        $clientid = $_POST['clientid'];
        $sql = "UPDATE customer SET validated = 1 WHERE customer_id = '$clientid'";
        $dbh->query($sql);
    }

0 голосов
/ 16 января 2020

Прежде всего, ваша форма - при отправке - не дает никакой подсказки об идентификаторе клиента для проверки. В моем примере кода я не буду использовать echo, потому что вывод HTML, как это выглядит ужасно. Вместо этого вы можете сделать это следующим образом:

?>
<div class='valid_name_btn'>
  <form method='post'>
    <input type="hidden" name="client" value="<?= $clientid ?>">
    <input type='submit' class='btn btn-outline-primary' value ='Validate' name='validate' id='validate'></input>
  </form>
  <div class='valid_name'>
    <?= $row["First_Name"] . " " . $row["Last_Name"]." - Account No. ".$row["account_no"] ?><br/>
  </div>
</div>
<?php

Я добавил скрытое поле ввода в форму, которую можно затем оценить в начале файла, перед строкой $tobe_validated = ..:

if (isset($_POST['validate']) && (isset($_POST['client'])) {
  $clientid = $_POST['client'];
  $sql = "UPDATE customer SET validated = 1 WHERE customer_id = '$clientid'";
  $dbh->query($sql);
}

Вы также должны правильно подготовить оператор или, по крайней мере, экранировать значение $ client. Поскольку я не знаю, что такое $ dbh (ваш код не сообщает), я не буду делать этого здесь.

0 голосов
/ 16 января 2020

Вы можете создать динамическую c форму на основе ключа и можете проверить, имеет ли кнопка конкретное значение или нет, выполнив соответствующее условие, как показано ниже

<?php
$sql ="SELECT customer.First_Name, customer.Last_Name, account.account_no, account.client_id, customer.username
FROM customer 
 INNER JOIN account 
 ON customer.customer_id=account.client_id 
 WHERE validated = 0"; 

$tobe_validated = $dbh->query($sql);

foreach ($tobe_validated as $key => $row) {
        //creating variable for account number to put in query  
        $clientid=$row["client_id"];

        echo "<div class='valid_name_btn'>";  
        echo "<form method='post' name="'validation_form_'.$key"><input type='submit' class='btn btn-outline-primary' value ='Validate' name="'validate_'.$key" id="'validate_'.$key"></input></form>";
        echo "<div class='valid_name'>"; //div for name
        echo $row["First_Name"] . " " . $row["Last_Name"]." - Account No. ". $row["account_no"]."<br/>"; //show name and account number of client
        echo "</div>";
        echo "</div>";

        // validate account when button is clicked
          if(isset($_POST['validate_'.$key]) && $_POST['validate_'.$key] == 'Validate') {
            // query to change validated in customer table to 1
            $updateSql ="UPDATE customer SET validated = 1 WHERE customer_id = '$clientid'";
            $dbh->query($updateSql);
          } 
         }

, дайте мне знать, если вам нужна помощь по этому вопросу

0 голосов
/ 16 января 2020
$sql ="UPDATE customer SET validated = 1 WHERE customer_id = $clientid";

$clientid должно быть без ''

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