0

コードを始める前に、私が達成したいことを説明しようとします:

ユーザーがキーボード エミュレーションを備えたバーコード リーダーでコード (バーコード) を書き込む入力があるので、ユーザーは次のように書き込みます: 123465789.

  1. これらの数字をすべて取りたいと思います
  2. 最初の 4 文字 (1234) しか必要ないため、それらを切り捨てます。
  3. この値をデータベースに渡し、この番号に対応するアイテムを確認します
  4. アイテムの「在庫」番号に追加します。
  5. フォームをきれいにする
  6. できるだけ速く繰り返します。

さて、説明しようとしたので、面白い部分、私のコードから始めましょう:

ファイル 1: change.php

<!DOCTYPE html>
<html>
<head>
  <style>
fieldset { margin-bottom: 1em; }
input { display: block; margin-bottom: .25em; }
#print-output {
  width: 100%;
}
.print-output-line {
  white-space: pre;
  padding: 5px;
  font-family: monaco, monospace;
  font-size: .7em;
}

</style>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
  <form>
  <fieldset>
    <label for="troncami">Type Something:</label>
    <input id="troncami" type="text" />
  </fieldset>
</form>
<div id="risultatotroncato"></div>
<script>
$('#troncami').keyup(function(event) {              


            var str = $(this).serialize();                   
               $.ajax({            
               type: "GET", // the kind of data we are sending
               url: "troncare.php", // this is the file that processes the form data
               data: str, // this is our serialized data from the form
               success: function(msg){  // anything in this function runs when the data has been successfully processed

                    // this sets up our notification area for error / success messages
                    $("#risultatotroncato").ajaxComplete(function(event, request, settings)
                    { 
                        result = msg; // msg is defined in sendmail.php
                        $(this).html(result); // display the messages in the #note DIV                           
                    }); 
                $('input[name=troncami]').val(msg);
                }                    
             });                     



}).keydown(function(event) {
  if (event.which == 13) {
    event.preventDefault();
  }  
});

$('#other').click(function() {
  $('#target').keyup();
});</script>

</body>
</html>

ファイル 2: troncare.php

<?php
$risultatotroncato = 0;

$risultatotroncato = substr ($_GET['troncami'],0,4);

echo $risultatotroncato;
?>

明らかにそれは機能しません。私が見ることができるのは通知エラーだけです:

注意: 未定義のインデックス: 6 行目の D:\Locali\xampp\htdocs\combobox\troncare.php の troncami

だから私の質問は、入力に書き込まれた値を $_GET / $_POST に渡し、「troncare.php」で「管理」できるようにするにはどうすればよいかということです。ユーザーが停止せずにバーコード スキャナーで「撮影」し、値をほぼ「リアルタイム」で DB に保存できるようにするにはどうすればよいでしょうか。どうもありがとうございました!

(ご存知かもしれませんが、私はまだ PHP と AJAX と jQuery を勉強しているので、数年または数か月後には独学でできるようになりますが...できるだけ早く必要なので、助けていただけますか? ?)

4

1 に答える 1

1

主な質問に答えるには、ajax 呼び出しで呼び出している URL の末尾に GET パラメーターを追加するだけです。次のようなもの:

$.ajax({             
    type: "GET", // the kind of data we are sending 
    url: "troncare.php?troncami=" + $('#troncami').val(), // this is the file that processes the form data 
    success: function(msg){  // anything in this function runs when the data has been successfully processed 
        // this sets up our notification area for error / success messages 
        $("#risultatotroncato").ajaxComplete(function(event, request, settings) {  
            result = msg; // msg is defined in sendmail.php 
            $(this).html(result); // display the messages in the #note DIV                            
        });  
        $('#troncami').val(msg); 
    }                     
});

または、 $.ajax 呼び出しのデータ設定を使用して、キーと値のペアを渡すことができます。

$.ajax({             
    type: "GET", // the kind of data we are sending 
    url: "troncare.php", // this is the file that processes the form data 
    data: {"troncami" : $('#troncami').val()}, // this is our serialized data from the form 
    success: function(msg){  // anything in this function runs when the data has been successfully processed 
        // this sets up our notification area for error / success messages 
        $("#risultatotroncato").ajaxComplete(function(event, request, settings) {  
            result = msg; // msg is defined in sendmail.php 
            $(this).html(result); // display the messages in the #note DIV                            
        });  
        $('#troncami').val(msg); 
    }                     
});

入力のセレクターとして「input[name=troncami]」ではなく「#troncami」を使用したことに注意してください。些細なことに思えるかもしれませんが、大規模なスケールでは、フィルター スタイル セレクターを使用するよりも、要素の ID をセレクターとして使用する方がはるかに効率的です。オブジェクトが DOM 内ですぐに見つかるように、ID はページ内で一意である必要があります。フィルター スタイル セレクター ('input[name=troncami]' など) を使用する場合は、最初にオブジェクトを見つける必要があります。また、クロス サイト スクリプティング (XSS) の回避に役立つ可能性があるため、Ajax/JSON 呼び出しでコールバック パラメーターを使用して調査することも検討する必要があります。

別のメモとして、ajax 呼び出しの受信側でデータの検証とクレンジングを行うことを願っています。あなたのコードは現在、インジェクション攻撃に対して広く開かれています。少なくともあなたの場合、データベースにクエリまたは挿入する前に、troncare.php で次のようなものを使用して入力値を検証します。

<?php
$risultatotroncato = 0;

if (isset($_GET['troncami']) && ctype_digit($_GET['troncami'])) {
    $risultatotroncato = substr ($_GET['troncami'],0,4);
    //echo or search the database here
}
else {
    //do whatever here if the value is blank or contains invalid characters
}
?>

これにより、受け取る値が数値 (1234567890) のみになることが保証されます。

更新: このインスタンスであなたの状況を正しく理解した場合、troncare.php が受け取る値は、有効な場合は常に数値のみである必要があるため、PHP 関数ctype_digit()はデータをクレンジングするのに十分であり、true を返す場合にのみ true を返します値には数字のみが含まれます。この状況では、それで十分なクレンジングです。文字または数字を許可していた場合、他にもいくつかのctype 関数がありますそれは助けることができます。データが非標準タイプの場合、パターン マッチングを使用する preg_match を使用できます。他のすべての状況では、通常、データをクレンジングするためのデータベース タイプに一致する PHP 関数があります。たとえば、MySQL を使用している場合、mysqli_real_escape_string() と呼ばれる PHP 関数と、データベースで使用する前にデータをクレンジングする mysql_real_escape_string() があります。この部門で車輪を再発明するつもりはありませんが、このトピックを扱う SO (および Web 上の他の場所) に関する多くの良い質問があります。

于 2012-09-20T23:48:30.757 に答える