2013-07-15 56 views
2

我认为这可能是一个死锁问题,但我只是读表数据。或者真的很简单,我看不到。MySQL表锁问题

$msqli obj是罚款DB访问

但我有点难倒了这个错误.. 我被告知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 
} 

当我运行此$sql查询在phpMyAdmin它是成功的? 感谢您的帮助..

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

固定(或者似乎是):

报价从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查询被更新。 无论如何,对于未来的用户,我希望这有助于。

+0

请提供确切错误信息 – Tarik

+0

错误消息是'表'客户'没有锁定LOCK TABLES'。我可能应该提到这个查询以前是有用的,但是我昨晚在工作了几个小时,我看不到会影响查询。此外,如果我将'$ sql'更改为“SELECT * FROM clients',它将起作用...所以我怀疑'$ sql'是问题 – bockymurphy

回答

0

有点挑剔,但对$ _SESSION ['user_id']输入做一些诸如addslashes或mysql_real_escape_string之类的事情是明智的,以避免注入问题。

+0

谢谢@Andrew McGrath。我认为这是正确的。 。我在每页开头的GET,POST,REQUEST vars上调用函数来清理它们。 – bockymurphy