0

AJAX を使用して、フォーム情報を php 処理ページに送信します。var_dump を実行すると、入力された数値が「0」ではないにもかかわらず、値が「0」として入っていることがわかります。値が「(int)」として指定されていても、PHP7 は「20 行目の /process_measurements.php で数値以外の値が検出されました」を返します。

次のように明示的に型キャストすると、PHP エラーはなくなりますが、var_dump は、フォームに入力された値ではなく 0 として入っていることを示しているため、フォームに入力された値に関係なく、計算結果は 0 です。

$length = (int)$length;
$width = (int)$width;
$height = (int)$height;

「数値以外の値が見つかりました」エラーを示すコード:

<?php
  function is_ajax_request() {
    return isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
      $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest';
  }

  (int)$length = isset($_POST['length']) ? (int) $_POST['length'] : '';
  (int)$width = isset($_POST['width']) ? (int) $_POST['width'] : '';
  (int)$height = isset($_POST['height']) ? (int) $_POST['height'] : '';

  var_dump($length, $width, $height);

  $volume = $length * $width * $height;

  if(is_ajax_request()) {
    echo $volume;
  } else {
    exit;
  }
?>

HTML and JS for further clarification:

    <div id="measurements">
      <p>Enter measurements below to determine the total volume.</p>
      <form id="measurement-form" action="process_measurements.php" method="POST">
        Length: <input type="text" name="length" /><br />
        <br />
        Width: <input type="text" name="width" /><br />
        <br />
        Height: <input type="text" name="height" /><br />
        <br />
        <input id="html-submit" type="submit" value="Submit" />
        <input id="ajax-submit" type="button" value="Ajax Submit" />
      </form>
    </div>

<script>
      var result_div = document.getElementById("result");
      var volume = document.getElementById("volume");

      function postResult(value) {
        volume.innerHTML = value;
        result_div.style.display = 'block';
      }

      function clearResult() {
        volume.innerHTML = '';
        result_div.style.display = 'none';
      }

      // omits textareas, select-options, checkboxes, radio buttons
      function gatherFormData(form) {
        var inputs = form.getElementsByTagName('input');
        var array = [];
        for (i = 0; i < inputs.length; i++) {
          var inputNameValue = inputs[i].name + '=' + inputs[i].value;
          array.push(inputNameValue);
        }
        return array.join('&');
      }

      function calculateMeasurements() {
        clearResult();

        var form = document.getElementById("measurement-form");
        var action = form.getAttribute("action");

        // gather form data
        var form_data = gatherFormData(form);

        var xhr = new XMLHttpRequest();
        xhr.open('POST', action, true);
        // do not set content-type with FormData
        //xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
        xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
        xhr.onreadystatechange = function () {
          if(xhr.readyState == 4 && xhr.status == 200) {
            var result = xhr.responseText;
            console.log('Result: ' + result);
            postResult(result);
          }
        };
        xhr.send(form_data);
      }

      var button = document.getElementById("ajax-submit");
      button.addEventListener("click", calculateMeasurements);

    </script>
4

1 に答える 1