PHP MySQL负值(余额)问题

时间:2013-11-04 07:34:43

标签: php mysql

我正在开发一个桌面软件,每次执行主要操作时向用户收费。例如,它表示每PDF打印将向用户收取0.1美元。

我的软件提供多线程。

所以,如果它运行单线程,它可以正常工作:)

但问题是如果用户在一个线程中运行多个线程(比如10/20线程)

它(php)也继续用户允许服务器/执行甚至平衡低于零..

虽然我的PHP脚本检查余额是否为正...

但在用户运行多个线程后,余额变为-5.95 $或-25.75 $ etc

这是一个很大的安全/财务问题......

这是我正在使用的代码:

<?php

$strSQL = "Select * from users where Email = '$strUser'";
$return = mysql_query($strSQL, $strDBConn);
$strDBData = mysql_fetch_array($return, MYSQL_ASSOC);
//checking balance
$strBalance = $strDBData['Balance'];
if($strBalance < 0)
{
    // if balance 0 then exit so, my software/thread will not process further
    mysql_close($strDBConn);
    exit('Balance Exceed'); 
}

//rest of the codes that realted to service executaion

// code that substract the balnce
    $dblCost = 0.25;
    $strSQL = "Update users set Balance = Balance - '$dblCost' where Email = '$strUser'";
    $return = mysql_query($strSQL, $strDBConn);

//rest finising codes 

&GT;

任何帮助/建议都将受到高度赞赏..

提前谢谢。 最好的问候

1 个答案:

答案 0 :(得分:0)

我认为,这是一个非常相似的问题: What is equivalent of the C# lock statement in PHP?

首先,尝试从旧的“mysql”切换到某些新的,可能是一些像DB访问的PDO;)。 然后,为了在php中使用多线程,可以是一个好主意,为每个用户ID(!)写一个文件并在有请求时锁定该文件。当文件被锁定在另一个线程中时,请等待x秒,以便锁定器线程解锁该文件。如果它没有在时间内解锁,则出现问题。当在锁定线程中一切顺利时,在每次需要的操作后解锁文件。 Theoraticaly你将很好,然后在PHP中有一个多线程解决方案;)