PHP / HTML страница / скрипт - пост на одностраничный скрипт php работает с перебоями - PullRequest
0 голосов
/ 23 октября 2019

У меня есть скрипт PHP, который перечисляет элементы в таблице. Есть кнопка для отметки предметов. Эта страница работает с перебоями

Я не знаю с чего начать. Работает хорошо, когда работает, но ненадежно. Поискал в сети, и некоторые говорят, что нужно увеличить буфер отправки TCP и внести некоторые изменения в Apache2. Не знаю, где и как это сделать. (много ответов, которые конфликтуют друг с другом относительно того, где и как).

Вот сценарий. Я знаю, что это место для инъекций, но в настоящее время не стоит беспокоиться. Исправлю это позже (когда научусь). Знать о заполнителях и т. Д., Но не о том, как их использовать. (это вещи, которые мне нужны, чтобы убрать их с дороги ...) По запросу других я разместил здесь последнюю версию.

Более новая версия

<?php

/**
 * Mark item as paid.
 */

require "../config.php";
require "../common.php";

$success = null;

if (isset($_POST["submit"])) {
  if (!hash_equals($_SESSION['csrf'], $_POST['csrf'])) die();

  try {
    $connection = new PDO($dsn, $username, $password, $options);

    $buyernumber = $_POST["submit"];
    $itemnumber = $_POST["itemnumber"];
/*following two lines for debugging*/
echo "buyernumber $buyernumber";
echo "itemnumber $itemnumber";

    $sqlupd = "UPDATE consignsold SET paid='y' WHERE itemnumber = $itemnumber AND buyernumber = $buyernumber AND sold = 'y' AND paid = 'n' ";

    $statement = $connection->prepare($sqlupd);
    $statement->bindValue(':buyernumber', $buyernumber);
    $statement->bindValue(':itemnumber', $itemnumber);
    $statement->execute();

    $success = "Item successfully updated";
  } catch(PDOException $error) {
    echo $sqlupd . "<br>" . $error->getMessage();
  }
}

try {
  $connection = new PDO($dsn, $username, $password, $options);

  $sqlsel = "SELECT * FROM consignsold WHERE paid='n' ORDER BY buyernumber ASC";

  $statement = $connection->prepare($sqlsel);

  $statement->execute();

  $result = $statement->fetchAll();
} catch(PDOException $error) {
  echo $sqlsel . "<br>" . $error->getMessage();
}

?>
<?php require "templates/header.php"; ?>

<h2>Mark Items as Paid</h2>

<?php if ($success) echo $success; ?>
<style>
table, th, td {
  border: 1px solid black;
}
</style>
<form method="post">
  <input name="csrf" type="hidden" value="<?php echo escape($_SESSION['csrf']); ?>">
  <table>
    <thead>
      <tr>
        <th>Sale Number</th>
        <th>Item Number</th>
        <th>Lot Number</th>
        <th>Category</th>
        <th>Item Description</th>
        <th>Reserve</th>
        <th>Seller Number</th>
        <th>Amount</th>
        <th>Buyer Number</th>
        <th>Sold</th>
        <th>Paid</th>
        <th>Mark</th>

      </tr>
    </thead>
    <tbody>

    <?php foreach ($result as $row) : ?>
      <form method="post">
  <input name="csrf" type="hidden" value="<?php echo escape($_SESSION['csrf']); ?>">
    <tr>
        <td><?php echo escape($row["salenumber"]); ?></td>
        <td><?php echo escape($row["itemnumber"]); ?></td>
        <td><?php echo escape($row["lotnumber"]); ?></td>
        <td><?php echo escape($row["category"]); ?></td>
        <td><?php echo escape($row["itemdescription"]); ?></td>
        <td><?php echo escape($row["reserve"]); ?></td>
        <td><?php echo escape($row["sellernumber"]); ?></td>
        <td><?php echo escape($row["amount"]); ?></td>
        <td><?php echo escape($row["buyernumber"]); ?></td>
        <td><?php echo escape($row["sold"]); ?></td>
        <td><?php echo escape($row["paid"]); ?><input type="hidden" name="itemnumber" value="<?php echo escape($row["itemnumber"]); ?>"></td>
        <td><input type="submit" name="submit" value="<?php echo escape($row["buyernumber"]); ?>">Mark as Paid</td>
      </tr>
    <?php endforeach; ?>
    </tbody>
  </table>
</form>
<br>

<?php require "templates/footer.php"; ?>

более старая версия

<?php

/**
 * Mark item as paid.
 */

require "../config.php";
require "../common.php";

$success = null;

if (isset($_POST["submit"])) {
  if (!hash_equals($_SESSION['csrf'], $_POST['csrf'])) die();

  try {
    $connection = new PDO($dsn, $username, $password, $options);

    $buyernumber = $_POST["submit"];
    $itemno = $_POST["itemno"];

    $sql = "UPDATE consignsold SET paid='y' WHERE paid='n' AND sold='y' AND buyernumber = $buyernumber AND itemnumber = $itemno";

    $statement = $connection->prepare($sql);
    $statement->bindValue(':buyernumber', $buyernumber);
    $statement->bindValue(':itemnumber', $itemno);
    $statement->execute();

    $success = "Item successfully updated";
  } catch(PDOException $error) {
    echo $sql . "<br>" . $error->getMessage();
  }
}

try {
  $connection = new PDO($dsn, $username, $password, $options);

  $sql = "SELECT * FROM consignsold WHERE paid='n' ORDER BY buyernumber ASC";

  $statement = $connection->prepare($sql);

  $statement->execute();

  $result = $statement->fetchAll();
} catch(PDOException $error) {
  echo $sql . "<br>" . $error->getMessage();
}
?>
<?php require "templates/header.php"; ?>

<h2>Mark Items as Paid</h2>

<?php if ($success) echo $success; ?>
<style>
table, th, td {
  border: 1px solid black;
}
</style>
<form method="post">
  <input name="csrf" type="hidden" value="<?php echo escape($_SESSION['csrf']); ?>">
  <table>
    <thead>
      <tr>
        <th>Sale Number</th>
        <th>Item Number</th>
        <th>Lot Number</th>
        <th>Category</th>
        <th>Item Description</th>
        <th>Reserve</th>
        <th>Seller Number</th>
        <th>Amount</th>
        <th>Buyer Number</th>
        <th>Sold</th>
        <th>Paid</th>
        <th>Mark</th>
      </tr>
    </thead>
    <tbody>

    <?php foreach ($result as $row) : ?>
      <tr>
        <td><?php echo escape($row["salenumber"]); ?></td>
        <td><?php echo escape($row["itemnumber"]); ?><input type="hidden" name="itemno" value="<?php echo escape($row["itemnumber"]);?>"</td>
        <td><?php echo escape($row["lotnumber"]); ?></td>
        <td><?php echo escape($row["category"]); ?></td>
        <td><?php echo escape($row["itemdescription"]); ?></td>
        <td><?php echo escape($row["reserve"]); ?></td>
        <td><?php echo escape($row["sellernumber"]); ?></td>
        <td><?php echo escape($row["amount"]); ?></td>
        <td><?php echo escape($row["buyernumber"]); ?></td>
        <td><?php echo escape($row["sold"]); ?></td>
        <td><?php echo escape($row["paid"]); ?></td>
        <td><button type="submit" name="submit" value="<?php echo escape($row["buyernumber"]); ?>">Mark as Paid</button></td>
      </tr>
    <?php endforeach; ?>
    </tbody>
  </table>
</form>
<br>

<?php require "templates/footer.php"; ?>

Эта вещь работает точно так, как она должна, когда она работает. Он просто случайным образом выбирает предметы, и кнопка «Пометить как оплаченное» перестает работать. Случайно кнопки работают. Как только он перестает работать, он обычно не будет работать снова до более позднего времени (намного позже), или если последний элемент в списке помечен, или иногда, если страница просто обновляется. Почти всегда последний пункт в списке работает. Что может быть причиной этого?

Не вижу никаких сообщений об ошибках, кнопка просто мигает и ничего не происходит. Я могу сказать, что страница перезагружается (что должно быть после того, как каждый элемент помечен), но это не меняет данные в таблице.

Может ли это быть проблема синхронизации или что-то еще? Как может быть, страница загружается до того, как ОБНОВЛЕНИЕ завершено или что-то? Если да, то где и как можно было бы добавить некоторую задержку, и где бы она там находилась, если так?

Я добавил задержку сразу после раздела ОБНОВЛЕНИЕ, просто чтобы посмотреть, поможет ли это иэто не имело никакого значения. Это просто заставило меня ждать, чтобы увидеть, как это не работает. : -D

Просто ради забавы я изменил порядок, в котором происходит ОБНОВЛЕНИЕ. Я не знаю, как он ищет в таблицах, но логически это будет слева направо. Поэтому я упорядочил их в строке ОБНОВЛЕНИЕ в том же порядке, в котором они показаны в PHPMYADMIN. Не сильно изменился. ,.

Хорошо, люди, это странно. ,,Я загрузил elinks, текстовый браузер и попытался запустить эту страницу оттуда. Ка-ZING! Там написано, что есть какая-то такая синтаксическая ошибка. ,,Мне интересно, почему это не отображается в обычном браузере! Могу поспорить, я могу найти это сейчас! Просто подумал, что вы все хотели бы это знать!

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