我在学习事务处理用户直接的转账的问题,数据表account输入了两列数据,分别是: 帐户1有1000元;帐户2有500元,我设置了两个sql语句,一个是给帐户加款的,另一个是给帐户扣款的,其中用来扣除存款的语句是
$result = mysql_query( $connect , " UPDATE accounts SET balance = balance - " . $_POST['money'] . " WHERE id = " . $_POST['from']  ; )
if( $result ){ echo “扣款程序执行成功”;}如果设置 扣款帐户是1,金额是100,接收帐户是2, 指令是可以被执行的,这个的话没错。但是 扣款帐户写3,金额是100,接收帐户是2 ,指令也是被执行成功了,这个就有问题了。
按照常理的话,因为帐号3不存在,sql语句应该是执行失败的啊。但是网页还是显示“扣款程序执行成功”
帐户2的金额也增加了100元。应该用不少人用过支付宝即时转账把,如果转出方 输入接收方的帐户不存在的话,应该失败的,怎么才能做到呢?谢谢

解决方案 »

  1.   

    在你执行 UPDATE SQL的时候, 先 Query 一次数据表 $_POST['from'] 帐号是否存在.
    不存在,报错.这么简单的逻辑不能想到?
      

  2.   

    楼主注意下面几点 : 
    1 数据库操作一定要使用事务来完成,不然你很难保证MySQL 是否已经完成了你输入SQL内容。
    2 更新记录之前记得使用行锁,避免系统并发造成问题
    3 先完成第二部内容再进行更新前检查。防止程序检查数据不是最新内容而出错。
    4 一定制定RollBack机制,遇到错误就全部RollBack保持系统完整性。
    5 操作数据库程序是一个系统核心内容,一定要小心和确定逻辑关系才能编写啊。
      

  3.   

    使用这个函数mysql_info()
    <?php
    $con = mysql_connect("localhost", "hello", "321");
    if (!$con)
      {
      die('Could not connect: ' . mysql_error());
      }$db_selected = mysql_select_db("test_db",$con);
    $sql = "INSERT INTO person VALUES ('John','Doe','Utah','17')";
    $result = mysql_query($sql,$con);$info = mysql_info($con);
    echo $info;mysql_close($con);
    ?>输出类似:String format: Records: 15 Duplicates: 0 Warnings: 0
    //Records符合条件的有几条,Duplicates数据被更改的有几个(新老数据一样Duplicates: 0)