Вкладка «Авто» при нажатии / сканировании клавиши возврата (php / mysql / javascript) - PullRequest
0 голосов
/ 04 августа 2011

Еще раз надеясь, что вы можете помочь мне решить проблему, с которой я боролся в течение последних нескольких недель.

У меня есть простая веб-база данных, которую я использую для записи серийных номеров продуктов, покидающих мой склад. Система находится за нашим брандмауэром, и я не особо беспокоюсь об 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>

Любая помощь очень ценится! :)

1 Ответ

0 голосов
/ 04 августа 2011

Я не думаю, что есть хорошее решение для этого. Браузер просматривает элементы формы, когда вы нажимаете на вкладку, на основе порядка по умолчанию и специального атрибута tabIndex. Воссоздание такого поведения должно быть возможным, но я дам вам это понять.

// since you already are using jQuery, also use it to bind event handler
$('form[name=request_form').bind('keyup', function (e) {
  // jQuery normalizes e.which for you
  if (13 === e.which) {
    // get idnex of the element that triggered the event
    // use Array method indexOf for this
    var currentIndex = Array.prototype.indexOf.call(this.elements, e.target);
    // have we stepped through all form elements?
    if (currentIndex >= this.elements.length) {
      // submit form, should happen through default action
      // if not, uncomment the following line.
      // this.submit();
    } else {
      // focus next element
      form.elements[currentIndex + 1].focus();
    }
  }
});

И я согласен с комментаторами: даже если приложение находится внутри вашего брандмауэра, вы действительно должны защищать от SQL-инъекций. Даже ваши сотрудники могут попытаться сбросить вашу базу данных, или злоумышленник сможет проникнуть / обойти ваш брандмауэр.

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