Как исправить Uncaught ReferenceError с событием onchange () при передаче параметров в пользовательскую функцию?

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

Проблема в том, что я генерирую ошибки 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

Решение

На этой линии:

<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

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

Форма 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 над табличными данными.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]