Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.php > #1857
| From | sheldonlg <sheldonlg@thevillages.net> |
|---|---|
| Newsgroups | comp.lang.php |
| Subject | Re: database access |
| Date | 2011-05-26 12:07 -0400 |
| Organization | A noiseless patient Spider |
| Message-ID | <irltrp$88q$1@dont-email.me> (permalink) |
| References | (1 earlier) <irjspv$iap$1@dont-email.me> <irlfu3$3nk$1@dont-email.me> <irlitn$lan$1@dont-email.me> <irlnmj$o96$1@dont-email.me> <irlsc3$upg$1@dont-email.me> |
On 5/26/2011 11:41 AM, Jerry Stuckle wrote:
> On 5/26/2011 10:22 AM, sheldonlg wrote:
>> On 5/26/2011 9:00 AM, Jerry Stuckle wrote:
>>> On 5/26/2011 8:09 AM, sheldonlg wrote:
>>>> On 5/25/2011 5:37 PM, Jerry Stuckle wrote:
>>>>> On 5/25/2011 1:17 PM, Jivanmukta wrote:
>>>>>> I new relatively new to PHP. I need your opinion if the following set
>>>>>> of database functions make sense:
>>>>>>
>>>>>> function openDatabase() {
>>>>>> global $db;
>>>>>> try {
>>>>>> $db = new PDO('mysql:host=' . MYSQL_SERVER . ';dbname=' .
>>>>>> MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD);
>>>>>> $db->exec('SET NAMES latin2');
>>>>>> $db->exec('SET CHARACTER SET latin2 COLLATE latin2_general_ci');
>>>>>> $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
>>>>>> register_shutdown_function('closeDatabase');
>>>>>> } catch (PDOException $e) {
>>>>>> return false;
>>>>>> }
>>>>>> return true;
>>>>>> }
>>>>>>
>>>>>> function closeDatabase() {
>>>>>> global $db, $inTransaction;
>>>>>> if ($inTransaction) {
>>>>>> $db->rollBack();
>>>>>> $inTransaction = false;
>>>>>> }
>>>>>> if (!is_null($db)) {
>>>>>> $db = null;
>>>>>> }
>>>>>> }
>>>>>>
>>>>>> function queryDatabase($sql) {
>>>>>> global $db, $inTransaction;
>>>>>> $result = array();
>>>>>> try {
>>>>>> $qry = $db->query($sql);
>>>>>> if (!empty($qry)) {
>>>>>> $result = $qry->fetchAll();
>>>>>> }
>>>>>> } catch (PDOException $e) {
>>>>>> if ($inTransaction) {
>>>>>> $db->rollBack();
>>>>>> }
>>>>>> error(ERRMSG_DATABASE_OPERATION_FAILED);
>>>>>> }
>>>>>> return $result;
>>>>>> }
>>>>>>
>>>>>> function execDatabase($sql) {
>>>>>> global $db, $inTransaction;
>>>>>> $result = array();
>>>>>> try {
>>>>>> $result = $db->exec($sql);
>>>>>> } catch (PDOException $e) {
>>>>>> if ($inTransaction) {
>>>>>> $db->rollBack();
>>>>>> }
>>>>>> error(ERRMSG_DATABASE_OPERATION_FAILED);
>>>>>> }
>>>>>> return $result;
>>>>>> }
>>>>>>
>>>>>> function startTransaction() {
>>>>>> global $db, $inTransaction;
>>>>>> $db->beginTransaction();
>>>>>> $inTransaction = true;
>>>>>> }
>>>>>>
>>>>>> function commitTransaction() {
>>>>>> global $db, $inTransaction;
>>>>>> $inTransaction = false;
>>>>>> if ($db->commit()) {
>>>>>> return;
>>>>>> }
>>>>>> $db->rollBack();
>>>>>> error(ERRMSG_DATABASE_OPERATION_FAILED);
>>>>>> }
>>>>>>
>>>>>> function rollbackTransaction() {
>>>>>> global $db, $inTransaction;
>>>>>> $inTransaction = false;
>>>>>> if ($db->rollBack()) {
>>>>>> return;
>>>>>> }
>>>>>> error(ERRMSG_DATABASE_OPERATION_FAILED);
>>>>>> }
>>>>>>
>>>>>> function lockTables($tables) {
>>>>>> return execDatabase('LOCK TABLES ' . join(' WRITE, ', $tables) . '
>>>>>> WRITE');
>>>>>> }
>>>>>>
>>>>>> function unlockTables() {
>>>>>> return execDatabase('UNLOCK TABLES');
>>>>>> }
>>>>>
>>>>> Kind of, and maybe a bit overkill. But personally I'd put it all in a
>>>>> Database class. The code would be more flexible and less prone to
>>>>> errors.
>>>>>
>>>>
>>>> Further, I would not have globals. I would pass $db in via the
>>>> constructor. Likewise, I would have $inTransaction be a class variable
>>>> which gets set by the method startTransaction().
>>>>
>>>
>>> That was part of the class, Sheldon. In fact, I wouldn't even pass $db
>>> into the constructor; it (along with $inTransaction, as you note) would
>>> be class variables. That way the rest of the program is completely
>>> independent of the database (and you can have more than one database
>>> active concurrently if you want).
>>
>> If you don't pass it in with the constructor, then you need something
>> like a setDb($parameter) to set the class variable. Passing it along
>> with the constructor does not limit you to only one database
>> concurrently. After all, you could readily do
>>
>> $dbObj1 = new DatabaseClass($db1);
>> $dbObj2 = new DatabaseClass($db2);
>>
>> What passing it along inside the constructor does is (a) it saves a line
>> of code each time in the invocation process(es) and (b) uniquely
>> identifies a particular instance of the class. Since the DatabaseClass
>> _MUST_ have the db defined, there is no problem with passing it in with
>> the constructor and no reason not to do so.
>>
>
> A better way would be to pass the basic information to the constructor -
> i.e. the host, userid, password and database name. Let the constructor
> build the database object. That way it is completely encapsulated and
> the rest of the program is not dependent on a database object. If he
> later finds he wants to change database objects (i.e. maybe PDO is to
> slow and he wants to use mysqli), he can do so without changing anything
> in the rest of the program. The class is now more fully encapsulated.
>
> A very good reason for not passing it to the constructor.
Good point. It would be best to pass those three instead. Point was
that I was making is that it is best to pass what is _ALWAYS_ needed
through the constructor. Your suggestion is better.
--
Shelly
Back to comp.lang.php | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
database access Jivanmukta <jivanmukta@poczta.onet.pl> - 2011-05-25 10:17 -0700
Re: database access Jerry Stuckle <jstucklex@attglobal.net> - 2011-05-25 17:37 -0400
Re: database access sheldonlg <sheldonlg@thevillages.net> - 2011-05-26 08:09 -0400
Re: database access Jerry Stuckle <jstucklex@attglobal.net> - 2011-05-26 09:00 -0400
Re: database access sheldonlg <sheldonlg@thevillages.net> - 2011-05-26 10:22 -0400
Re: database access Jerry Stuckle <jstucklex@attglobal.net> - 2011-05-26 11:41 -0400
Re: database access sheldonlg <sheldonlg@thevillages.net> - 2011-05-26 12:07 -0400
Re: database access sheldonlg <sheldonlg@thevillages.net> - 2011-05-26 12:14 -0400
Re: database access sophal chao <w3cyberlearning@gmail.com> - 2011-05-29 13:41 -0700
Re: database access Jerry Stuckle <jstucklex@attglobal.net> - 2011-05-29 23:12 -0400
Re: database access JohnT <john@example.com> - 2011-05-26 13:05 +0000
Re: database access Jivanmukta <jivanmukta@poczta.onet.pl> - 2011-05-26 06:37 -0700
Re: database access sheldonlg <sheldonlg@thevillages.net> - 2011-05-26 10:30 -0400
Re: database access sheldonlg <sheldonlg@thevillages.net> - 2011-05-26 10:33 -0400
Re: database access Jerry Stuckle <jstucklex@attglobal.net> - 2011-05-26 11:43 -0400
Re: database access Michael Fesser <netizen@gmx.de> - 2011-05-26 19:48 +0200
Re: database access Erwin Moller <Since_humans_read_this_I_am_spammed_too_much@spamyourself.com> - 2011-05-30 10:56 +0200
csiph-web