SQL Truncate & mt_rand()

For anyone that may have wondered why the upgrade to 2.6.2 was so important, here’s a pretty good explanation I found on WordPress Developers Blog tonight.  It has to do with a SQL column truncation issue that could basically alter users login credentials, etc.

Stefan Esser recently warned developers of the dangers of SQL Column Truncation and the weakness of mt_rand().  With his help we worked around these problems and are now releasing WordPress 2.6.2.  If you allow open registration on your blog, you should definitely upgrade.  With open registration enabled, it is possible in WordPress versions 2.6.1 and earlier to craft a username such that it will allow resetting another user’s password to a randomly generated password. 

The randomly generated password is not disclosed to the attacker, so this problem by itself is annoying but not a security exploit.  However, this attack coupled with a weakness in the random number seeding in mt_rand() could be used to predict the randomly generated password.  Stefan Esser will release details of the complete attack shortly.  The attack is difficult to accomplish,  but its mere possibility means we recommend upgrading to 2.6.2.

Other PHP apps are susceptible to this class of attack.  To protect all of your apps, grab the latest version of Suhosin.  If you’ve already updated Suhosin, your existing WordPress install is already protected from the full exploit.  You should still upgrade to 2.6.2 if you allow open user registration so as to prevent the possibility of passwords being randomized.

WordPress › Blog » WordPress 2.6.2

Adding Form to DB Record in PHPR

I recently had a pretty intensive PHPR project where I had to create a page for a client that called in records from their database as well as displaying a form that visitors could us to contact the “name” and “email” from that particular record.  In theory this isn’t a complicated thing to get your mind around but I found that building this in PHPR *PHPRUNNER) was going to be a task for a couple of reasons. 

I have had a fellow PHPR user drop me a note and ask me to document how I put all of this together so I figured I would do so here.  I am going to prepare some documentation later on regarding two aspects of this project and post them to the PHPR forums later once I have a chance to document everything a little bit better…

The biggest thing that I ran into was issues with Smarty Templates and just inserting a standard PHP Form into them, that was a no-go all the way around for the most part, I did stumble on some ways to do this if anyone is interested but I ultimately didn’t use this on this project.  I went back and forth with Jane from Xlinesoft for a while and she was awesome in helping get my mind around this, she also really helped me out a lot with some javascript features that the client was wanting to have with their photo gallery.  Xline is awesome!  If you build web portals with PHP/MySQL you owe it to yourself to checkout PHPR!

Here’s how I was able to get this particular process to work.  I created a new table in the database to store the visitors (people requesting information) information in.  I set my permissions so that public could hit this form and store data into it (with validation).  Once I created this table and generated it’s add page in PHPR I then went and added that code to the already generated view page from PHPR of the records that I wanted to also have this form on.  I then coped my form code into the view page at the appropriate place and saved it out.  It took a little while inside the visual editor’s code view to get this to work exactly right but I eventually was able.

The very next part was probably the trickiest to figure out inside of PHPR because if you are familiar with PHPR you will know that you primarily are working with generated smarty pages.  In order to add some logic to the form I added this event code in the event editor, (after record added)

 

   1: // Parameters:
   2: // $values - Array object. 
   3: // Each field on the Add form is represented as a 'Field name'-'Field value' pair
   4: // $keys - Array object with added record key column values
   5: // target_email and target_name are called from the existing database
   6:  
   7:  
   8: //**********  Send email with new data  ************
   9:  
  10: $email="".$values["target_email"];
  11: $message="";
  12: $subject="Resort Inquiry - ".$values["target_name"];
  13: $from="Client's Name <info@clientsdomain.com>";
  14:  
  15: foreach($values as $field=>$value)
  16:     $message.= $field." : ".$value."\r\n";
  17:  
  18: //Headers
  19: $headers = "To: " . "\r\n";
  20: $headers.= "From: $from" . "\r\n";
  21:     
  22: mail($email, $subject, $message, $headers);
  23:  
  24:  
  25: //**********  Redirect to another page  ************
  26: header("Location: http://www.clientsdomain.com/confirmation.php");
  27: exit();

 

After I added this and tested the form it was working great.  Here is something that I probably need to make sure I mention.  In my trials building this particular app, I learned that i had to go in and predefine the value for 2 hidden fields in the form, one was the “name on the record” and the “email on the record”.  Once i had this part knocked out everything worked great.  This is pretty good to know because there wasn’t a whole lot of information on the forums when I started trying to build this particular app and I had to hunt around and find info from various places.  As I mentioned, Jane at Xlinesoft was awesome to help me out with this project.

PHPR Project Management

I found this interesting post on the Xlinesoft forum tonight. (Best Practices) It relates to Best Practices for using PHPRunner & Subversioning.  I currently don’t have a use for this in anything I am working on but thought that it was pretty interesting so I decided to include it here…

——————————————————

1.0 Summary:

Setting up an SVN Repository significantly increases manageabilty of large scale projects using PHPRunner across many environment instances and developers. SVN Repository will also encourage companies to use PHPRunner to be used in larger scale projects. The output codes can be deployed based on the subversions and the config file can be determiend upon staging.

2.0 Case Statement

I have a project that is used in the development and live environment. Initially, it was not an issue since the db schema was synched. As the the dev version is release to production, and additional tables were added to the dev environment, I found it almost impossible to manage the project with my simplistic approach. What I ended up doing was for each instance of the development (dev, test, stage and live), I created seperate projects. so, I now have 4 individual projects. Our european counterpart saw our US project and of course, they requested for each of their instances which of course was about 6 all together. So, now I have a total of 10 seperate project for each db instance of our development phase. In my mind, the only difference is the config (i.e., host, user, password and db name).
For awhile, I would just select one of the projects, make my modifcations, and then save as for each instance of the project. This worked for awhile.

The problem started to occur when we went live the first time. There were enhancements that I wanted to make for the production version. Meanwhile, the db schema in the development and test instances started to change. So, I found many of my links started to break. So, I could no longer just simply Save As. The next step was to Cut and Paste.
I stopped Saving As, and started doing the following. I would make the changes in one of the most complete instance which usually was the development instance since its where the new tables are comming from. Then, I would open another PHPRunner and open one of the other instances that I wanted to update. Of course, I couldn’t update all since some of the test and stage instances have not been updated.

As a result, there was chaos in my codes. I no longer didn’t remember which project belonged to what instance. I didn’t know which one got updated and which ones are the same and which ones are broken. In other words, the project(s) became extremely unmanageable.

3.0 Analysis

This is a typical result when what seemed to be an easy process ended up entangled. Many times, the simpliest approach many not be the wisest approach and could cause havoc on project and resource management. The criteria for a simple project is if the proejct is being developed by a single develper on one or two instance of the same project. Both db instance must be synched for most of the time or at least a push to keep it in synched. As soon as a third unsycnronized db instance is introduced, then it can no longer be considered as a simple project management case. In order to avoid the pitfall of the case statement, one must ensure scalability, flexibility of code management, as well as the deploy process.

 

4.0 Approach

4.1 Set-up

The way to resolve the issue was we deployed a subversioning tool, SVN with a UI frontend, Tortoise. We created a project folder in the SVN Repository and a trunc.
I selected the best “version” from the projects, which we’ll call ProjectPHP. I then looked for the PHPR project file and copied that and the tmp and visual folders into my SVN trunc folder (which was also in my local apache htmdoc webserver path). I opened PHPRunner, make the changes I wanted and Save. I am now saving the PHPR file into my SVN trunc folder that is also within my apache webserver folder. I set my output file directly onto my trunc folder and I set the preview with the localhost url. I build the projects.

4.2 Work Process and Project Management

If all goes well, all the output files is created within the trunc folder. I use the preview just to see if anything was broken. When I am satisfied with the changes, I close PHPRunner and then go to the trunc folder. I delete the tmp and visual folder since I discovered that once I successfully build an output files with the tmp and visual folders, I can erase those two folders. Somehow, when I open PHPRunner and build it again, PHPRunner knows where to look for those tmp and visual folders. Also, for some reason even if I delete these folders, when I go to my Visual Editor, I can still see all the icons.

I committ all the files to the SVN Repository. (Note: It’s realy easy to do it using Tortoise SVN). I know have a trunc of my project. I then check out a Working Copy. This is a good idea since you don’t want to mess up your trunc version since it will always be your “base copy” of the code. In my working copy, I can open PHPRunner and open that particular project file. It works beautifully. All the icons show up in my visual editor. I can change the db configuration so that I am developing to the relevant instance of the database. Once I am done, I save my I used the Live instance of db to create or update the project. Once I was satisfied, I save my project which was the latest and greatest of the codes that I have been chaotically managing. Once we created the trunc, we created tags and branches.

I checked out the trunc into my Working Copy folder. For now, my WC is pointed towards the trunc. For every major milesone I reach, I create a Tag. The naming convention for the tag is usually the date and some task indicator like Dec102008_Task_1of3 or some other meaningful naming convention. I continue with my work on my WC until I complete all my tasks. By now, I have 3 tags, since I created them for each milestone.

I then committ my changes into the SVN Repository. Since I was pointed towards the trunc, it updated the Trunc. But since it is also a completion of a version of ProjectPHP, I created a Branch and called it Revision 1.0. This is my first “subversion.”

For now, I can continue to make small modificaitons or bug fixes to Revision 1.0. It is important to note that I am working constantly on my WC (Working Copy). Basically, I can “Switch” the WC to the trunc, tags or branches. When I am working on Revision 1.0, I will make tags along the way in order not to lose any of my codes in cases I mess up further along the way. There is a stopping point. Once I am done with my changes, I create a subversion Revision 1.1

Note: Please refer to the sources link below for more detailed subversion workflow.

4.3 Deployment

For every completed revision, I test it in the Test, QA, Stage environment. And once it passes all 3, then I deploy it to Production. We created a page that allowed me to selecte which subversion I want to deploy and the “dbcommon” version that I want to use. Since in PHPRunner, the db information is part of the editing the project, when it builds the file, it also builds the dbcommon that has all the db information (user, password, etc.). So, when there is a different db login for each instance, you will have to specify the correct “version” of the dbcommon. All I did was to create one dbcommon as a “trunc” and then created all versions of that for each instance of the db.

Whenever I deploy, I select the code that I wanted to put into dev, qa or stage, and select the appropriate dbcommon. It is a dropdown. The staging process basically takes all my files which are the output files and overrides the dbcommon with whatever “version” of the file I select. Remember the version is realy just to be able to have all the dbcommon for all the instances.

Also, there is one caveats for those that may want to have a others use the project for each of the instance. So, say if you have a Live version with the old db schema. So the Live version is Revision 1 and all the subversions. The active development is already on Revision 3, for example. And you’ve made some changes on Revision 3 and deployed it to your develpment and stage instances (and not Live of course, because the latest db has not been deployed to Live).

Since you still want to test and stage your Revision 1 code, you can deploy the codes to the development and test environments but use the db instance that has the matching schema (usually by now, it will be just the Live version). Notify the folks using the tool that you’ll be testing and staging a production fix and therefore need to log out. Once you verify in test and stage the codes, deploy the code to Live. At this point, unless there are major functionality and not just small fixes, you may have to merge it with either Revision 3 (the latest and greatest version of your project) or back to the Trunc.

I suggest not to do this however. I would just leave Revision 1 and all its subversions where it is. It is easier just to make sure that that functionality is copied over to Revision 3 and then merged back to the trunc (since Revision 4 may be under way).

5.0 Conclusion

When you use SVN with Tortoise and set up the appropriate subversions, your project with multiple developers and instances can be manageable, as long as everyone understands the subversioning principle. Keep the PHPR file with the output files and delete the tmp and visual folders once you have successfully built a project within the svn file folder. The PHPR file gets subversioned as well. In other words, it becomes protected for any accidental mistakes (like I have done so many times with my manual management of my php projects.)
I hope this post will encoruage to use PHPRunner at a large scale basis and will encourage the makers of PHPRunner to make it more and more robust.

6.0 To Do’s

  • Set up URLs for each project intance (dev, test, stage, live). These corresponds to the db instances.
  • Set up SVN repository
  • Set up staging page. There will be a list of the environment where the codes will be deployed, a list of the code version to deploy, and the dbcommon version to override the dbcommon built along with the PHPRunner.
  • Set up Project Folder then /trunc, /tags, /branches (Please see the link and study the manuals)

Resources Links:
SVN
Tortoise

Table Events Bug w/ Catalog – Registration App


I put together a class catalog and registration application a while back for a client and it’s been working great with the exception of one small bug that I can’t seem to be able to locate.  I have it setup using Table Events (After Record Added) in PHPR to send an email once someone registers online and also to redirect the registrant to another page once they have registered.  The redirection works great, no problems there, it’s just the email thing that’s giving me issues.  Here’s the weirdest part of the deal, occasionally an email will go through the system and make it’s way out…  It’s real sporadic though.

I posted a note on Xlinesoft’s Forum, hopefully someone will have some advice as to where I might look to troubleshoot this issue out.  Here’s the table event code that I am using to send the email out after a record is added and also to redirect the visitor.  If any of you out there have any suggestions I would love to hear from you.

   1: // Parameters:
   2: // $values - Array object. 
   3: // Each field on the Add form is represented as a 'Field name'-'Field value' pair
   4: // $keys - Array object with added record key column values
   5:  
   6:  
   7: //**********  Redirect to another page  ************
   8: header("Location: http://www.anurturingtouch.com/confirmation.php");
   9: exit();
  10:  
  11:  
  12:  
  13: // **********  Send simple email  ************
  14:  
  15: $email="steph@anurturingtouch.com";
  16: $message="New Registration has been made on your website, please login and retrieve their information, http://www.anurturingtouch.com/cms";
  17: $subject="New Registration";
  18: mail($email, $subject, $message);

Create a table with the list of US states

I had another PHPR user email me the other day and ask how was the best way to go about adding a table for US states that already had all of the states already listed.  I had to think for a minute because what I usually do is build a table for states and leave it blank so that the admin of the site can add states as he or she enters in content.  The only thing I typically do is to set it so that the states are listed alphabetically.  Sergey posted an entry on the Xlinesoft forums though that shows how you can just use this sql statement to create the table with statements in it already, I am posting it here so that I can just copy / paste it in if this ever comes up again…

   1: CREATE TABLE IF NOT EXISTS states (

   2: id INT NOT NULL auto_increment,

   3: name CHAR(40) NOT NULL,

   4: abbrev CHAR(2) NOT NULL,

   5: PRIMARY KEY (id)

   6: );

   7:  

   8: INSERT INTO states VALUES (NULL, 'Alaska', 'AK');

   9: INSERT INTO states VALUES (NULL, 'Alabama', 'AL');

  10: INSERT INTO states VALUES (NULL, 'American Samoa', 'AS');

  11: INSERT INTO states VALUES (NULL, 'Arizona', 'AZ');

  12: INSERT INTO states VALUES (NULL, 'Arkansas', 'AR');

  13: INSERT INTO states VALUES (NULL, 'California', 'CA');

  14: INSERT INTO states VALUES (NULL, 'Colorado', 'CO');

  15: INSERT INTO states VALUES (NULL, 'Connecticut', 'CT');

  16: INSERT INTO states VALUES (NULL, 'Delaware', 'DE');

  17: INSERT INTO states VALUES (NULL, 'District of Columbia', 'DC');

  18: INSERT INTO states VALUES (NULL, 'Federated States of Micronesia', 'FM');

  19: INSERT INTO states VALUES (NULL, 'Florida', 'FL');

  20: INSERT INTO states VALUES (NULL, 'Georgia', 'GA');

  21: INSERT INTO states VALUES (NULL, 'Guam', 'GU');

  22: INSERT INTO states VALUES (NULL, 'Hawaii', 'HI');

  23: INSERT INTO states VALUES (NULL, 'Idaho', 'ID');

  24: INSERT INTO states VALUES (NULL, 'Illinois', 'IL');

  25: INSERT INTO states VALUES (NULL, 'Indiana', 'IN');

  26: INSERT INTO states VALUES (NULL, 'Iowa', 'IA');

  27: INSERT INTO states VALUES (NULL, 'Kansas', 'KS');

  28: INSERT INTO states VALUES (NULL, 'Kentucky', 'KY');

  29: INSERT INTO states VALUES (NULL, 'Louisiana', 'LA');

  30: INSERT INTO states VALUES (NULL, 'Maine', 'ME');

  31: INSERT INTO states VALUES (NULL, 'Marshall Islands', 'MH');

  32: INSERT INTO states VALUES (NULL, 'Maryland', 'MD');

  33: INSERT INTO states VALUES (NULL, 'Massachusetts', 'MA');

  34: INSERT INTO states VALUES (NULL, 'Michigan', 'MI');

  35: INSERT INTO states VALUES (NULL, 'Minnesota', 'MN');

  36: INSERT INTO states VALUES (NULL, 'Mississippi', 'MS');

  37: INSERT INTO states VALUES (NULL, 'Missouri', 'MO');

  38: INSERT INTO states VALUES (NULL, 'Montana', 'MT');

  39: INSERT INTO states VALUES (NULL, 'Nebraska', 'NE');

  40: INSERT INTO states VALUES (NULL, 'Nevada', 'NV');

  41: INSERT INTO states VALUES (NULL, 'New Hampshire', 'NH');

  42: INSERT INTO states VALUES (NULL, 'New Jersey', 'NJ');

  43: INSERT INTO states VALUES (NULL, 'New Mexico', 'NM');

  44: INSERT INTO states VALUES (NULL, 'New York', 'NY');

  45: INSERT INTO states VALUES (NULL, 'North Carolina', 'NC');

  46: INSERT INTO states VALUES (NULL, 'North Dakota', 'ND');

  47: INSERT INTO states VALUES (NULL, 'Northern Mariana Islands', 'MP');

  48: INSERT INTO states VALUES (NULL, 'Ohio', 'OH');

  49: INSERT INTO states VALUES (NULL, 'Oklahoma', 'OK');

  50: INSERT INTO states VALUES (NULL, 'Oregon', 'OR');

  51: INSERT INTO states VALUES (NULL, 'Palau', 'PW');

  52: INSERT INTO states VALUES (NULL, 'Pennsylvania', 'PA');

  53: INSERT INTO states VALUES (NULL, 'Puerto Rico', 'PR');

  54: INSERT INTO states VALUES (NULL, 'Rhode Island', 'RI');

  55: INSERT INTO states VALUES (NULL, 'South Carolina', 'SC');

  56: INSERT INTO states VALUES (NULL, 'South Dakota', 'SD');

  57: INSERT INTO states VALUES (NULL, 'Tennessee', 'TN');

  58: INSERT INTO states VALUES (NULL, 'Texas', 'TX');

  59: INSERT INTO states VALUES (NULL, 'Utah', 'UT');

  60: INSERT INTO states VALUES (NULL, 'Vermont', 'VT');

  61: INSERT INTO states VALUES (NULL, 'Virgin Islands', 'VI');

  62: INSERT INTO states VALUES (NULL, 'Virginia', 'VA');

  63: INSERT INTO states VALUES (NULL, 'Washington', 'WA');

  64: INSERT INTO states VALUES (NULL, 'West Virginia', 'WV');

  65: INSERT INTO states VALUES (NULL, 'Wisconsin', 'WI');

  66: INSERT INTO states VALUES (NULL, 'Wyoming', 'WY');

  67: INSERT INTO states VALUES (NULL, 'Armed Forces Africa', 'AE');

  68: INSERT INTO states VALUES (NULL, 'Armed Forces Americas (except Canada)', 'AA');

  69: INSERT INTO states VALUES (NULL, 'Armed Forces Canada', 'AE');

  70: INSERT INTO states VALUES (NULL, 'Armed Forces Europe', 'AE');

  71: INSERT INTO states VALUES (NULL, 'Armed Forces Middle East', 'AE');

  72: INSERT INTO states VALUES (NULL, 'Armed Forces Pacific', 'AP');

  73:  

  74: If you need Canada provinces as well:

  75:  

  76: INSERT INTO states VALUES (NULL, 'Alberta', 'AB');

  77: INSERT INTO states VALUES (NULL, 'British Columbia', 'BC');

  78: INSERT INTO states VALUES (NULL, 'Manitoba', 'MB');

  79: INSERT INTO states VALUES (NULL, 'New Brunswick', 'NB');

  80: INSERT INTO states VALUES (NULL, 'Newfoundland and Labrador', 'NL');

  81: INSERT INTO states VALUES (NULL, 'Northwest Territories', 'NT');

  82: INSERT INTO states VALUES (NULL, 'Nova Scotia', 'NS');

  83: INSERT INTO states VALUES (NULL, 'Nunavut', 'NU');

  84: INSERT INTO states VALUES (NULL, 'Ontario', 'ON');

  85: INSERT INTO states VALUES (NULL, 'Prince Edward Island', 'PE');

  86: INSERT INTO states VALUES (NULL, 'Quebec', 'QC');

  87: INSERT INTO states VALUES (NULL, 'Saskatchewan', 'SK');

  88: INSERT INTO states VALUES (NULL, 'Yukon', 'YT'); 

Source: Create a table with the list of US states – Forums

Project: Class Catalog & Registration Process

I was approached by a long-time client last month to help her put together a dynamic class catalog application that she could manage in-house that listed the reflexology and massage classes that she offers.  In addition to the class catalog management process she also wanted to develop a system that would enable her potential students to register online for classes and store their information in an online database that she could use to market to or follow up with in the future.

I built the project in PHPR entirely, it is written in PHP and utilizes a MySQL Database on the backend.  The way the application works is that the students will hit her website and browse her class listings that are sorted on her website by date.  Once they select a class that they are interested in enrolling in, they simply complete an online form with their credentials and payment information.  Once this form is completed they are then transported to a confirmation page on her website.  The data is stored in a MySQL database and by using table events inside of PHPR I was able to generate the “after succesful entry” and “send email” features.  An email is then sent to my client telling her that a student has registered online.  She then logs in and downloads the information to her desktop system. 

I spent a little while testing this process since it was the first time I had actually made a data entry form available to the public but after a lot of testing I found that the whole process was secure and functioned great.  If you want to check out this application that was built completely in PHPR, just send me a note and I will be glad to share the template for this project with you.  In the future I plan on making some of my favorite apps available online on the Xlinesoft forums for those of you that are interested.

Project: Powersite Document Manager v1.0

Pleth, LLC | Web Site Design, Managed Hosting, Email Hosting, Email ServicesThis is a small utility / script that I put together that allows administrators of a website or intranet application to easily add documents such as .pdf files to an online listing that can be accessed by visitors to their website or users on their corporate intranet.  I have a few solutions like this one out there running for clients already and it’s pretty handy, especially if the client just needs to post documents. This script is highly customizable and I can make it do almost anything a client could want.  Right now I have it setup to display documents with the following fields: Title, Description, Date, Category, and the actual file itself as an upload.  For sorting purposes I could have the display page sorted however the client wanted on the front-end, for the sake of this post I have sorted the documents by date.

Inside the script I have also added an area where additional administrators can be added to assist in managing the document library.  For the existing administrators I have also included a forgot password feature that will allow users to have their passwords emailed to them in the event they forget or lose them.

To test out this piece of software’s admin area, please visit my demo: http://www.cottonrohrscheib.com/projects/powersite_document_manager/login.php
username: demo
password: demo

To view the sample output that website visitors or non-administrators on your intranet would see it, click on the links I have provided below: (you will not need a username or password to view this page, you may also want to logout as the administrator (demo/demo) prior to looking at the public view page in order to get a better understanding of it’s capabilities.

http://www.cottonrohrscheib.com/projects/powersite_document_manager/documents_list.php

Not only is this small script available as a standalone application for your website or intranet solution but it can also be bundled with other scripts we have written or anything custom that we develop for your project.  For more information about this script or to talk to Pleth Networks, LLC regarding your project, please don’t hesitate to contact us.

Book Review: PHP 5 / MySQL Programming

I actually picked this book up a while back so that I could get up to speed w/ PHP and MySQL programming and I really enjoyed it.  It was an easy read and I still refer back to it from time to time to find things, it stays on the bookshelf behind my desk. If you are looking for a quick way to get up to speed on PHP, I recommend this one for sure.  I also have a few other recommendations that I will be posting later on.

PHP 5 / MySQL Programming for the Absolute Beginner (For the Absolute Beginner)

ISBN: 1592004946
ISBN-13: 9781592004942

Book Review: PHP & MySQL for Dummies

This is another book that I purchased a while back to help me get up to speed on PHP and MySQL development.  It’s a pretty straightforward book like a lot of the “for dummies” books are.  Needless to say that a lot of the info in the book is kind of basic but it can be a great refresher if you are looking for one.  I guess before you pick this book up though you would probably need to get one of the basic HTML books out there, otherwise a lot of this might be over your head.

Project: Powersite Business Directory v1.0

Pleth, LLC | Web Site Design, Managed Hosting, Email Hosting, Email ServicesThis is a project that I have been working on for Chambers of Commerce’s and Associations that need an easy to use web-based content management solution for managing their membership database. There are a few examples of this solution online at:

  • Heber Springs Chamber of Commerce
  • Greers Ferry Lake & Little Red River Association

As you can see from these demos, most Chambers of Commerce’s and Associations will want to categorize their members by “categories” such as “automotive, banking, etc.”. This software allows for adding members on the fly with the addition of new categories as well that will populate the categories list page on the fly. This is a pretty useful application that has also proven to be pretty stable in it’s first few applications. One other convenient feature that this application has built in is that it automatically generates a Google map link to the businesses address.

To login and see an example admin area for this software, Click Here (username: demo / password: demo). Please feel free to go in and add a business name to this database to see how it works. Click here to see the sample output of the application that is available to the world.

Once you are inside the software it’s pretty self explanatory, just click on Add New under the Manage Business Directory.  If you have any questions about this software or would like to discuss adding a Powersite Business Directory Solution to your existing website, please feel free to contact us and we will be glad to discuss your project with you.