锁定桌子后,我收到警告

时间:2016-09-04 14:25:31

标签: php mysql locking

这是我的代码

      $ar = ($_POST['ar']);
      $query = "lock table stock write";
      $res = mysqli_query ($db, $query);

        /*******Count******/
        $query = "SELECT SUM(quantita_vendita) AS somma FROM stock";
        $res = mysqli_query ($db, $query);
        $row = mysqli_fetch_array($res);
        $somma = $row['somma'];

           if($ar<=$somma){
                $query = "SELECT * FROM user, info WHERE info.id_user = user.id and user.email = '{$_SESSION['email']}'";
                $res = mysqli_query ($db, $query);

                      if(mysqli_num_rows($res) > 0) {
                                $row = mysqli_fetch_assoc($res);
                                $azioni = $row['azioni'];
                                $denaro = $row['denaro'];
                                $id = $row['id'];
                                mysqli_free_result($res);
                      }

如果您没有插入锁,它会起作用。 相反,当我插入锁时,我有一个警告(mysqli_num_rows()期望参数1为mysqli_result,boolean在...中给出)if(mysqli_num_rows($res) > 0)

2 个答案:

答案 0 :(得分:2)

当您使用表锁定时,您必须锁定将在该会话中的任何查询中使用的所有表(或再次解锁),请参阅LOCK TABLES and UNLOCK TABLES Syntax

  

需要锁定的会话必须在单个LOCK TABLES语句中获取所需的所有锁定。在保持如此获得的锁的同时,会话只能访问锁定的表。例如,在以下语句序列中,尝试访问t2时发生错误,因为它未锁定在LOCK TABLES语句中:

mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES

因此,在您的情况下,使用表userinfo的查询失败。为解决此问题,请使用例如

lock tables stock write, user write, info write;

您收到了错误消息,因为查询失败,因此$res为false而不是mysqli_result - 对象,因此mysqli_num_rows($res)无法正常工作。在使用结果之前,您应该始终检查查询是否失败,例如使用

if ($res = mysqli_query($db, $query)) {
   if (mysqli_num_rows($res) > 0) {... }
} else {
   printf("Error: %s\n", mysqli_error($db));
}

答案 1 :(得分:0)

根据手册http://php.net/manual/en/mysqli.query.php

  

mysqli_query失败时返回FALSE。成功的SELECT,SHOW,DESCRIBE或   EXPLAIN查询mysqli_query()将返回一个mysqli_result对象。对于   其他成功的查询mysqli_query()将返回TRUE。

因此,您应使用if(mysqli_num_rows($res) > 0)

而不是if ($res)