2013-07-22 2 views
0

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

В настоящее время я просто с помощью: -

SET @UserID = 3; 

И тогда ссылки это в мнений/функций.

Это подходящий и надежный способ сделать это на нескольких сеансах одновременного пользователя? Будет ли это присутствовать на протяжении жизни этого соединения MySQL MySQL (или загрузки страницы) с PHP, и я, очевидно, хочу, чтобы никакие другие соединения не использовали это. Он устанавливается при каждой загрузке страницы (или пересоединении MySQL из моего приложения).

Спасибо всем!

ответ

1

Как ясно говорится в первом абзаце страницы человека MySQL переменных: http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

определяемые пользователем переменные одного сеанса. То есть пользовательская переменная, определенная одним клиентом, не может быть видна или использована другими клиентами. Все переменные для данного сеанса клиента автоматически освобождаются при выходе этого клиента.

например. они существуют, в то время как соединение php < -> mysql поддерживается в реальном времени, соединение PER и автоматически удаляется, когда соединение закрыто/завершено. Если вы не используете постоянные соединения в PHP (которые не должны быть в любом случае), переменные mysql будут в основном существовать для жизни этого конкретного вызова сценария и НЕ будут доступны, когда один и тот же пользователь вернется с другим HTTP-запросом позже ,

+0

ли постоянные соединения отличаются от пула соединений? – tadman

+0

постоянные соединения хранятся в пуле, пока они не используются. как правило, это идея BAD в веб-контексте. например некоторые сценарии barfs на полпути через сложную транзакцию. поскольку постоянное соединение, mysql + php оставляет его открытым. некоторые ДРУГОЙ скрипт появляется, повторно использует соединение и начинает делать свои собственные вещи. Вы легко можете оказаться в тупиковой ситуации, потому что сценарий № 2 не имеет понятия, что он работает в середине полузаполненной транзакции сценария # 1. Если соединение закрылось, когда № 1 прервано, транзакция будет автоматически откат. –

+1

Стойкие соединения хороши, и ситуация взаимоблокировки не является проблемой. –

0

Так что, строго говоря, то, что вы делаете, не должно быть проблемой (каждое соединение с PHP существует более или менее независимо). Но, с другой стороны, это не лучший подход.

Я думаю, что у вас есть «если все, что у вас есть, это молот, все выглядит как гвоздь». MySQL не разработан с учетом жизненного цикла запроса, и ему не нужно об этом знать. PHP, с другой стороны, разработан именно с этой идеей.

Вместо:

mysqli_query('Set @UserID=' . $id); 
$output = mysqli_query('SELECT * FROM FOO WHERE [email protected]'); 

Почему бы просто не использовать bound variables?

+0

Похоже, вы просто пропустили вопрос –

+0

Я думаю, что стоит упомянуть, что такого рода вещи - очень плохая идея, и поэтому привязки должны быть указаны для каждого запроса конкретно, а не полагаться на контекст соединения, чтобы предоставить их вам. – tadman