1

我在 php 和 javascript 中创建了一个系统,用户可以在其中输入一定数量的字符(5)并自动更新 mysql 中 db 中的一个单元格,但是有一个问题......系统时不时地不会计数+2 而不是 +1,我将发布代码

$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% 正确,但后端数据应该是

作为旁注——因为这不是你的问题——我建议你搜索MVC术语,因为分离数据库、php 逻辑和 html 显示是一个很好的做法。你没有做,但它可能只是一个快速&肮脏/非生产代码:-)

编辑:除了 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 injection)是不好的做法。而是使用准备好的语句

于 2012-10-10T18:51:50.557 回答