2013-07-15 3 views
2

Я думаю, что это может быть проблемой взаимоблокировки, но я только читаю данные таблицы. Или что-то действительно простое я не вижу.Ошибка блокировки таблиц MySQL

Мой $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 
} 

Когда я запускаю этот $sql запрос в PhpMyAdmin она прошла успешно ... Спасибо за любую помощь ..

** * ** * ** * ** * ** * ** * **РЕШИТЬ (?) ** * ** * ** * ** * ** * ** *

Fixed (Или, кажется):

Цитата 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 клиенты », он будет работать ... Поэтому я подозреваю, что' $ sql' - это проблема – bockymurphy

ответ

0

Немного придирчивый, но было бы разумно сделать что-то вроде addlashes или mysql_real_escape_string для входа $ _SESSION ['user_id'], чтобы избежать проблем с впрыском.

+0

Спасибо @ Andrew McGrath. Думаю, это будет правильно. Спасибо за совет Я вызывал функции в GET, POST, REQUEST vars в начале каждой страницы, чтобы их очистить. – bockymurphy

Смежные вопросы