Я пытаюсь создать систему заказов, в которой, как только пользователь обновляет статус заказа, он также обновляет его на сервере, не обновляя страницу каждый раз (что кажется утомительным).
Проблема в том, что я генерирую ошибки 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. Пожалуйста, помогите мне понять, что я делаю неправильно.
На этой линии:
<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 над табличными данными.
Других решений пока нет …