Solved

Dynamic Column Names

Posted on 2013-12-03
6
246 Views
Last Modified: 2013-12-17
I'm building a PHP script that will run monthly, to gather data from different tables and bring it into a new table.

As it stands right now, I am dropping the tables monthly, and re-creating them in this script.  The column names consist of the month name and year, and therefore will change monthly.

For example, the table I'm working in right now has a column for november12, december12, january12, all the way through december13.

I need to extract the data from the columns in order to calculate averages, and more importantly, display the data on the page.

My question is how to structure my SELECT query based on these dynamic column names, and then how to put them into variables to display on the page in my WHILE loop?

Here is how I am naming the columns.

#Get Months between last month and 12 months ago
function getAllMonths($date1, $date2)
	{
	$time1 = strtotime($date1);
	$time2 = strtotime($date2);
	$my = date('mY', $time2);
   
	$months = array(date('Y-m', $time1));
   
	while($time1 < $time2) 
		{
		$time1 = strtotime(date('Y-m-d', $time1).' +1 month');
		if(date('mY', $time1) != $my && ($time1 < $time2))
		$months[] = date('Y-m', $time1);
		}
   
	$months[] = date('Y-m', $time2);
	$months = array_unique($months);
	return $months;
	}

#Define Months to use
$thisMonth = date("Y-m", strtotime($today));
$yearAgo = date("Y-m", strtotime("-1 year", strtotime($thisMonth)));
$allMonths = getAllMonths($yearAgo, $thisMonth);

#Build the quality calls table!
$crt = "CREATE TABLE IF NOT EXISTS `repanalysis_qualitycalls`
			(
			`id` int(20) NOT NULL auto_increment,
			`respid` int(6) NOT NULL,";
			
foreach($allMonths AS $monthRange)
	{
	$monthNames = date("Fy", strtotime($monthRange));
	$crt .= '`'.$monthNames.'` decimal(7,2) default 0,';
	}
			
$crt .= "`averageqc` decimal (15,2),
			`avgtogoal` decimal (15,5),
			`qc_regionalrank` int(10),
			`qc_overallrank` int(10),
			 PRIMARY KEY  (`id`),
			 KEY `respid` (`respid`)
			) 
			ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=0";
$result = mysql_query($crt) or die("Cannot create quality calls table: " . mysql_error());

Open in new window


I tried doing a select * but I'm not sure how to get the column names out of that query:

	//Extract Quality Calls for Calculations.
	$getQC = mysql_query("SELECT * FROM repanalysis_qualitycalls") or die("Cannot pull quality calls: " . mysql_error());

	if(mysql_num_rows($getQC) > 0)
		{
		while($row = mysql_fetch_assoc($getQC))
			{
			$repId = $row['respid'];
			}
		}
	}

Open in new window

0
Comment
Question by:t3chguy
6 Comments
 
LVL 34

Expert Comment

by:gr8gonzo
Comment Utility
You can either run a DESCRIBE <table> query to get the table structure, or as long as you have a record, you can just look at the keys of any record that is returned with mysql_fetch_assoc().

By the way, mysql_ functions are deprecated, so you may want to consider moving to the newer mysqli functions.
0
 
LVL 34

Expert Comment

by:gr8gonzo
Comment Utility
0
 
LVL 1

Author Comment

by:t3chguy
Comment Utility
How can I use the key from the mysql_fetch_assoc?
0
How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

 
LVL 34

Accepted Solution

by:
gr8gonzo earned 500 total points
Comment Utility
Use array_keys:

http://us3.php.net/array_keys

if(mysql_num_rows($getQC) > 0)
		{
		while($row = mysql_fetch_assoc($getQC))
			{
			$repId = $row['respid'];
                        $columns = array_keys($row); // <<<<<<<<<<<<<<<<<<<<<<
			}
		}
	}

Open in new window

0
 
LVL 27

Expert Comment

by:yodercm
Comment Utility
Try mysql_list_fields() to get field names

http://us2.php.net/manual/en/function.mysql-list-fields.php
(deprecated but still works beautifully)


 or mysql_query() to issue an SQL SHOW COLUMNS FROM table [LIKE 'name']

http://dev.mysql.com/doc/refman/5.0/en/show-columns.html
0
 
LVL 108

Expert Comment

by:Ray Paseur
Comment Utility
You probably want to define DATE columns as data type DATE.  Then you can use the standard ways of getting the data.  There is a little more about how to handle DATE and DATETIME information in this article.
http://www.experts-exchange.com/Web_Development/Web_Languages-Standards/PHP/A_201-Handling-date-and-time-in-PHP-and-MySQL.html

That said, I would expect that it might make sense to have the date values in a single column in each of the rows instead of in columns for each date.  One example of why that might be an advantageous design would emerge if the boss comes in and says, "Give me the last two years data."  If the dates are in one column you just change the query.  If the dates are in columns by month, you have to rewrite your script.
0

Featured Post

Highfive Gives IT Their Time Back

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Suggested Solutions

Consider the following scenario: You are working on a website and make something great - something that lets the server work with information submitted by your users. This could be anything, from a simple guestbook to a e-Money solution. But what…
These days socially coordinated efforts have turned into a critical requirement for enterprises.
Learn how to match and substitute tagged data using PHP regular expressions. Demonstrated on Windows 7, but also applies to other operating systems. Demonstrated technique applies to PHP (all versions) and Firefox, but very similar techniques will w…
This tutorial will teach you the core code needed to finalize the addition of a watermark to your image. The viewer will use a small PHP class to learn and create a watermark.

763 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

5 Experts available now in Live!

Get 1:1 Help Now