【问题标题】:MySQL Table Lock IssueMySQL 表锁问题
【发布时间】:2013-07-15 09:05:04
【问题描述】:

我认为这可能是一个死锁问题,但我只是在读取表数据。或者一些我看不到的非常简单的东西。

我的$msqli obj 可以访问数据库

但是我对这个错误有点难过.. 我被告知clients 表没有被LOCK TABLES 锁定

欢迎任何建议.. 谢谢 这是我的 PHP 代码

$mysqli = $GLOBALS['mysqli'];
$mysqli->query("LOCK TABLES clients READ, invoices READ, estimates READ");

$mysqli->query("SET @inv='Invoice'");
$mysqli->query("SET @est='Estimate'");

$sql = " (SELECT @inv, name AS client, invoices.id, invoices.ref AS ref, invoices.addTs AS ts \n"
        . "FROM `clients` , `invoices` \n"
        . "WHERE invoices.user_id =  " . $_SESSION['user_id'] . " \n"
        . "AND clients.id = invoices.client_id)\n"
        . "UNION ALL\n"
        . "(SELECT @est, name as client, estimates.id, estimates.ref AS ref, estimates.addTs AS ts \n"
        . "FROM `clients` ,`estimates` \n"
        . "WHERE estimates.user_id =  " . $_SESSION['user_id'] . " \n"
        . "AND clients.id = estimates.client_id) \n"
        . "ORDER BY ts DESC LIMIT 5";

if ($result = $mysqli->query($sql) or die(mysqli_error($mysqli))) {
//Do stuff here
}

当我在 PhpMyAdmin 中运行此 $sql 查询时,它是成功的... 感谢您的帮助..

********************已解决(?)******************

已修复(或似乎已修复):

引用http://bugs.mysql.com/bug.php?id=6588

“您不能在一个查询中多次使用锁定表 - 为此使用别名。”

所以查询更新为

    $mysqli->query("LOCK TABLES clients_t READ,clients READ ,
                                invoices READ, estimates READ");
$mysqli->query("SET @inv='Invoice'");
$mysqli->query("SET @est='Estimate'");

$sql = " " .
        "(SELECT @inv, name AS client, invoices.id, 
                  invoices.ref AS ref, invoices.addTs AS ts "

        . "FROM `clients` AS clients_t , `invoices`\n"
        . "WHERE invoices.user_id =  " . $_SESSION['user_id'] . " \n"
        . "AND clients_t.id = invoices.client_id)\n"
        . "UNION ALL \n"
        . "(SELECT @est , name AS client, estimates.id, 
                   estimates.ref AS ref, estimates.addTs AS ts\n"
        . "FROM `clients` ,`estimates` \n"
        . "WHERE estimates.user_id =  " . $_SESSION['user_id'] . "  \n"
        . "AND clients.id = estimates.client_id)\n"
        . "ORDER BY ts DESC LIMIT 5";

我还需要锁定别名表clients_t。 无论如何,对于未来的用户,我希望这会有所帮助。

【问题讨论】:

  • 请提供准确的错误信息
  • 错误信息是 Table 'clients' was not locked with LOCK TABLES 。我可能应该提到这个查询以前是有效的,但是我昨晚工作了几个小时,但我看不到应该会影响查询。此外,如果我将$sql 更改为“SELECT * FROM clients` 它将起作用......所以我怀疑$sql 是问题

标签: php mysql locking


【解决方案1】:

有点挑剔,但明智的做法是对 $_SESSION['user_id'] 输入执行诸如添加斜杠或 mysql_real_escape_string 之类的操作以避免注入问题。

【讨论】:

  • 谢谢@Andrew McGrath。我认为那是正确的。感谢您的建议。我在每个页面的开头调用了 GET、POST、REQUEST 变量上的函数来清理它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 2016-04-29
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多