Как исправить Uncaught ReferenceError с событием onchange () при передаче параметров в пользовательскую функцию? - PullRequest
0 голосов
/ 10 сентября 2018

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

Проблема в том, что я генерирую ошибки javascript onchange:

Uncaught ReferenceError

Вот функция, которая отображает заказы:

function showOrders()
{
    global $con;

    $getOrders = "SELECT * FROM `Purchase_Order`";
    $rungetOrders = mysqli_query($con, $getOrders);

    $getOrder = "SELECT * FROM `Purchase_Order` WHERE status = 'pending' ORDER BY date ASC";
    $rungetOrders = mysqli_query($con, $getOrder);
    echo '<form action ="PurchaseOrders.php">
              <table style="border :1px solid black; border-collapse: collapse; width: 1300px; margin-bottom: 50px; margin-top: 5px; font-size:20px "> 
                  <tr style="border :1px solid black; background-color: black; color: whitesmoke">
                      <th>ORDER #</th>
                      <th>PRODUCT ID</th>
                      <th>COLOR</th>
                      <th>SIZE</th>
                      <th>QTY</th>
                      <th>DATE ORDERED</th>
                      <th>STATUS</th>
                  </tr>';  
    $counter = 0;
    while($row = mysqli_fetch_array($rungetOrders))
    {
        $ordernum = $row['OrderNum'];
        $product_id = $row['product_id'];
        $product_color = $row['product_color'];
        $product_size = $row['product_size'];
        $product_quantity = $row['product_quantity'];
        $date = $row['date'];
        $status = $row['status'];
        if($counter% 2 == 0)
        {
            $bg = 'rgba(50,205,50, 0.2);';   
        } else {
            $bg = ''; 
        }

        if ($status === "shipped")
        {
            $newstat = "pending";
        } else {
            $newstat = "shipped";
        }

        echo '<tr style="background-color:'.$bg.'">
                  <td>'.$ordernum.'</td>
                  <td>'.$product_id.'</td>
                  <td>'.$product_size.'</td>
                  <td>'.$product_color.'</td>
                  <td>'.$product_quantity.'</td>
                  <td>'.$date.'</td>
                  <td><select name="status" onchange="ship('.$ordernum.','.$product_id.')"><option>'.$status.'</option><option>'.$newstat.'</option</td>
              </tr>';
        $counter++;
    }
}

Вот ajax, который я поместил на страницу, где выполняется функция:

<script type="text/javascript">
function ship(order,id) {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            document.getElementById("txtHint").innerHTML = this.responseText;
        }
        alert('triggered');
    };
    xhttp.open("GET", "updateStatus.php?update=false&order="+order+"&id="+id, true);
    xhttp.send();
}
</script>

Вот что у меня есть в файле updateStatus.php:

if(isset($_GET['update']))
{
    $update = $_GET['update'];
    $id = $_GET['id'];
    $order = $_GET['order'];

    $make = "UPDATE `Purchase_Order` SET `status`='shipped' WHERE `OrderNum` = $order AND `product_id` = $id";
    $runmake = mysqli_query($con, $make);

    if($runmake)
    {
        echo "go";
    } else {
        echo "stop";
    }
}

Я очень новичок в AJAX. Пожалуйста, помогите мне понять, что я делаю неправильно.

1 Ответ

0 голосов
/ 10 сентября 2018

В этой строке:

<select name="status" onchange="ship('.$ordernum.','.$product_id.')"><option>'.$status.'</option><option>'.$newstat.'</option</td>

Есть несколько проблем.

  • Вы не закрыли свой </option> закрывающий тег.
  • У вас естьне пишется закрывающий тег </select>.
  • Если ваши значения $ordernum или product_id являются строками, их нужно будет заключить в кавычки, иначе вы сгенерируете Uncaught ReferenceError:

Uncaught ReferenceError: [thevalue] не определено в HTMLSelectElement.onchange

Вот некоторые из моих сценариев и предложения и ссылки поддержки из моих комментариев:

Form PHP: https://3v4l.org/D7TY9

JSFiddle: https://jsfiddle.net/v0Lzatqh/11/

Цвет строки альтернативной таблицы с использованием CSS?

Вот мои советы из комментариев (такчто я могу удалить свои комментарии):

Если вам не нужно $ update (и я не думаю, что вы это делаете), не объявляйте его.Если вы собираетесь использовать предоставленные пользователем данные в запросе, вам необходимо принять меры безопасности.В вашем случае я считаю, что $id и $order являются целыми числами, поэтому просто приведите их (используя (int) $ id и (int) $ order) перед построением запроса.Если это не так, вы должны использовать подготовленные заявления с заполнителями.Объявление новых переменных для хранения данных набора результатов бесполезно ($ordernum = $row['OrderNum']);избавьте свой код от некоторого раздувания и потенциальных точек отказа, просто отображая переменные $row.Где происходит сбой вашего скрипта?

Вместо того, чтобы объявлять глобальную переменную, многие разработчики призывают вас просто передать переменную $con в область действия функции в качестве параметра, подобного этому: function showOrders($con) {

У вас есть $con (прямое соединение) @ updateStatus.php?Вы должны выполнять проверку ошибок в своем скрипте или, по крайней мере, проверять свои журналы ошибок, прежде чем отправлять вопрос здесь.Эти детали необходимы как часть полного вопроса, и они значительно облегчат нам задачу помочь вам.if($runmake) будет проверять только «нет ошибок синтаксиса» в запросе.При попытке определить, была ли затронута база данных, вам нужно будет подсчитать затронутые строки после того, как запрос будет признан безошибочным.

Вы должны закомментировать или удалить $getOrders = "SELECT * FROM Purchase_Order"; $rungetOrders = mysqli_query($con, $getOrders);, поскольку эти строки перезаписаны/не используется.Если у вас нет острой необходимости различать структуру таблицы базы данных, я бы удалил префикс product_ из ваших столбцов, чтобы сделать ваш код более кратким.

Вам не понадобятся теги <form>, если вытолько выполняют операции Ajax с табличными данными.

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