Еще раз надеясь, что вы можете помочь мне решить проблему, с которой я боролся в течение последних нескольких недель.
У меня есть простая веб-база данных, которую я использую для записи серийных номеров продуктов, покидающих мой склад. Система находится за нашим брандмауэром, и я не особо беспокоюсь об SQL-инъекциях или чем-то подобном.
В настоящее время веб-форма имеет следующие поля:
Строка 1: Продукт UPC (R_UPC)
Строка 1: серийный номер продукта (R_SerialNumber)
Строка 2: номер детали продукта (R_PartNumber)
Ряд 2: Описание продукта (R_Description)
Ряд 3: Специалист (R_Specialist)
Строка 3: выполнено (R_FulfilledBy)
Когда мы сканируем штрих-код продукта, поля номера детали и описания обычно заполняются данными из базы данных «Продукты», однако функция автоматической вкладки нарушает этот поиск. Я уверен, что это простое исправление, но я просто не могу понять это ..
Сканеры штрих-кода настроены на автоматическое нажатие кнопки возврата при сканировании штрих-кода, который затем искал соответствие в базе данных «Продукты». Поэтому мне нужно, чтобы после сканирования поля UPC оно автоматически переходило к следующему полю ввода (серийный номер продукта) и после сканирования серийного номера автоматически переходило на 3 поля вперед (к полю специалиста).
Мне удалось сделать это в значительной степени - нажав клавишу ввода на вкладках соответствующих полей в нужном окне. Однако поиск выполняется для заполнения полей ввода «Номер детали» и «Описание».
Цель этого - повысить эффективность и простоту использования веб-формы, чтобы нам не нужно было нажимать клавишу табуляции. Я также хотел бы использовать что-то вроде innerText / AJAX, где это возможно, для полей «Номер детали» и «Описание», чтобы пользователь не мог случайно отредактировать их, что снизит вероятность получения мусорных данных.
Вот фрагменты того, что, вероятно, имеет значение:
<!-- Tab on Return -->
<SCRIPT LANGUAGE="JavaScript">
nextfield = "R_UPC"; // name of first box on page
netscape = "";
ver = navigator.appVersion; len = ver.length;
for(iln = 0; iln < len; iln++) if (ver.charAt(iln) == "(") break;
netscape = (ver.charAt(iln+1).toUpperCase() != "C");
function keyDown(DnEvents) { // handles keypress
// determines whether Netscape or Internet Explorer
k = (netscape) ? DnEvents.which : window.event.keyCode;
if (k == 13) { // enter key pressed
if (nextfield == 'done') return true; // submit, we finished all fields
else { // we're not done yet, send focus to next box
eval('document.req_form.' + nextfield + '.focus()');
return false;
}
}
}
document.onkeydown = keyDown; // work together to analyze keystrokes
if (netscape) document.captureEvents(Event.KEYDOWN|Event.KEYUP);
</script>
<!-- Autocomplete Specialist Field -->
<script type="text/javascript">
// FUNCTION: Get product info from UPC
function productDetails(UPC){
// SEND AJAX REQUEST, POST UPC
$.ajax({
type: "POST",
url: "../includes/get_product_detail.php",
data: "UPC=" + UPC,
dataType: 'json',
success: function(data){
// FROM JSON STRING RETURN DESCRIPTION AND ADD TO form_description INPUT
$('#form_description').val(data.description);
$('#form_part').val(data.part_number);
}
});
}
$(document).ready(function() {
// ADD KEYPRESS EVENT HANDLER
$('#form_upc').keypress(function(event) {
// IF RETURN KEY IS PRESSED, FIRE productDetails FUNCTION
if (event.which == '13') {
// FIRE FUNCTION USING VALUE IN form_upc
productDetails($('#form_upc').val());
}
});
// Autocomplete Specialist Field
$("#form_specialist").autocomplete("../includes/get_specialist_list.php", {
width: 260,
matchContains: true,
mustMatch: true,
//minChars: 0,
//multiple: true,
//highlight: false,
//multipleSeparator: ",",
selectFirst: false
});
});
</script>
<!-- End -->
<!-- Disable Enter Button on Barcode Scanners causing accidental submission of data to database -->
<script language="JavaScript">
function disableEnterKey(e)
{
var key;
if(window.event)
key = window.event.keyCode; //IE
else
key = e.which; //firefox
return (key != 13);
}
</script>
<!-- End -->
<!-- Input Validation -->
<script language="JavaScript" type="text/javascript">
<!--
function checkform ( form )
{
// ** Validate Part Number Entry **
if (form.form_part.value == "") {
alert( "Please enter Product Part Number" );
form.form_part.focus();
return false ;
}
if (form.form_part.value == "Invalid UPC") {
alert( "INVALID Data Entered - Please Rescan UPC" );
form.form_part.focus();
return false ;
}
// ** END Part Number Validation **
// ** Validate Specialist Entry **
if (form.form_specialist.value == "") {
alert( "Please enter Specialist Name" );
form.form_specialist.focus();
return false ;
}
// ** END Specialist Validation **
// ** Validate Fulfilled By Entry **
if (form.form_bohspecialist.value == "") {
alert( "Please enter BoH Specialist Fulfilling Order" );
form.form_bohspecialist.focus();
return false ;
}
// ** END Fulfilled By Validation **
return true ;
}
//-->
</script>
<!-- END -->
А вот get_product_detail.php:
// VARIABLES
include("main.config.inc.php");
// connect to the MySQL server
$cxn = mysql_connect($runnerdbServer, $runnerdbUser, $runnerdbPass)
or die ("Sorry, could not connect to the server.");
// connect to the DB
$db = mysql_select_db($runnerdbName, $cxn)
or die ("Sorry, could not connect to the correct database.");
// GET UPC
$upc = $_POST['UPC'];
$sql = "SELECT * FROM Products WHERE P_UPC = '$upc'";
$result = mysql_query($sql) or die ('Product could not be queried');
$num = mysql_num_rows($result);
// ONLY ONE PRODUCT SHOULD MATCH
if ($num == 1){
$row = mysql_fetch_assoc($result);
$json['upc'] = $row['P_UPC'];
$json['part_number'] = $row['P_PartNumber'];
$json['description'] = $row['P_Description'];
} else {
// DUPLICATE ENTRIES?
$json['upc'] = 0;
$json['part_number'] = "Invalid UPC";
$json['description'] = "Invalid UPC";
}
// GENERATE JSON STRING
echo json_encode($json);
?>
А вот сторона формы html:
<form name ="req_form" autocomplete="off" action="../includes/new_request.php" method="post">
<table width="100%" border="0">
<tr>
<td>* Product UPC: <br /> <input type="text" name="R_UPC" onFocus="nextfield ='R_SerialNumber';" id="form_upc"/></div></td>
<td>Product Serial Number: </br /> <br/><input type="text" name="R_SerialNumber" onFocus="nextfield ='R_Specialist';" id="form_serial"/></div></td>
</tr>
<tr>
<td>* Product Part Number: <br /> <input type="text" name="R_PartNumber" id="form_part" /></div></td>
<td>Product Description: <br /> <input type="text" name="R_Description" id="form_description"/></div></td>
</tr>
<tr>
<td>* Specialist: <br /> <input type="text" id="form_specialist" name="R_Specialist" onFocus="nextfield ='R_FulfilledBy';"/></td>
<td>* Fulfilled By: <br />
<?php
// Connect to DB
connecttodb($runnerdbServer,$runnerdbName,$runnerdbUser,$runnerdbPass);
function connecttodb($runnerdbServer,$runnerdbName,$runnerdbUser,$runnerdbPass)
{
global $link;
$link=mysql_connect ("$runnerdbServer","$runnerdbUser","$runnerdbPass");
if(!$link){die("Could not connect to MySQL");}
mysql_select_db("$runnerdbName",$link) or die ("could not open db".mysql_error());
}
$tp=$_GET['U_Name']; // getting the value from query string
$query="SELECT U_Name FROM Users ORDER BY U_Name ASC";
$result = mysql_query ($query);
?>
<select name="R_FulfilledBy" id="form_bohspecialist">
<?
while($nt=mysql_fetch_array($result)){
echo "<option value='$nt[U_Name]'>$nt[U_Name]</option>";
}
echo "</select>";
?>
</td>
</tr>
<td><input type="submit" id="form_submit" value="Submit" /></td>
</tr>
</table>
</form>
Любая помощь очень ценится! :)