1

ユーザーが特定の文字数 (5) を入力し、mysql のデータベース内のセルを自動的に更新できるシステムを php と javascript で作成しましたが、問題があります...時々システムがカウントされません+1の代わりに+2、コードを投稿します

$sql=mysql_query("select * from bare");
while($row=mysql_fetch_array($sql))
{
//se voglio fare sanitizer $name = mysql_real_escape_string($_POST['name']);
$id= $row['id'];
$cab=$row['cab'];
$qty=$row['qty'];
//echo "$id $cab $qty <br/>";

if(isset($_POST['submitbar']))
    $name = $_POST['name'];
    {   
         if( $name == $cab) {
            echo '<p>';
            $nqty = $qty+1;
            mysql_query("UPDATE bare SET qty = $nqty WHERE cab = '$cab'");
            echo "Hai aggiunto 1 elemento a $cab. Ora $cab vale $nqty";
            echo '</p>';
        } else {
    //echo '<p>Non corrisponde a nessun codice a barre nel database<p>';    

    }
}
}

?>
<h1>Aggiorna le quantit&agrave; utilizzando il Barcode</h1>
<form id="form" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
   <input id="seleziona" type="text" name="name"><br>
   <input type="submit" name="submitbar" value="Invia"><br>
</form>
<!--<script type="text/javascript">
$(function() {
    $('input').charCount(25);
});
</script> -->
<script type="text/javascript">
//seleziona input automatico
    $(document).ready(function(){
        $('#seleziona').jqEasyCounter();

});
</script>
<script>
//invio automatico
    $("#seleziona").keyup(function(){
         if($(this).val().length == 5)
            $('#form :submit').click();
    })
</script>

その問題

$nqty = $qty+1;

変数 $nqty がメモリに残っているため...

4

2 に答える 2

0

あなたの場合、私は次のことを提案します:

    $name = mysql_real_escape_string($_POST['name']);
    $sql = mysql_query("SELECT qty FROM bare WHERE cab = '$name'");
    $row = mysql_fetch_array($sql);

    if(isset($_POST['submitbar']) && $row)  {
        $nqty = $row['qty'] + 1;
        $name = mysql_real_escape_string($_POST['name']);
        mysql_query("UPDATE bare SET qty = qty + 1 WHERE cab = '$name'");
        echo "<p>Hai aggiunto 1 elemento a $name. Ora $name vale $nqty</p>";
    }

それは:

  1. コードの反復回数を制限する
  2. 同じ行を更新する
  3. 同じ情報を表示する

同時更新の場合、UI表示は100%正しくない可能性がありますが、バックエンドデータは正しいはずです

補足として-これはあなたの質問ではないので-データベース、phpロジック、およびhtml表示を分離することは良い習慣であるため、MVC用語を検索することをお勧めします。あなたはそれをしていませんが、それはただ速くて汚い/非生産的なコードかもしれません:-)

編集:アトミック性とプリペアドステートメントに関するdrobertからの良いアドバイスに加えて、PDO mysqlを使用する必要があります(チェックする価値がありますphpinfo())。

于 2012-10-10T19:10:35.090 に答える
0

PHP のようなステートレス システムでの一般的なアプローチは、データベースにアトミック インクリメントを処理させることです。たとえば、ステートメントを次のように変更します。

UPDATE bare SET qty = qty + $nqty WHERE cab = '$cab'

この場合、$nqty は 'qty' に追加する数であり、データベースはそれがアトミックに発生することを保証して、読み取り-変更-書き込みの競合状態を回避します。

さらに、変数を直接 SQL 文字列に挿入することはお勧めできません ( SQL インジェクションのため)。代わりに、準備済みステートメントを使用してください。

于 2012-10-10T18:51:50.557 に答える