Saving array into multiple rows - php

Hey how could I save array into multiple row in database please? I am using mysql database with php.
// GETTING ALL THE B NODE STUFFS AND PRINTING IT'S CONTENTS
$result = array();
foreach($document->getElementsByTagName('b') as $node){
$result[preg_replace('/:\s+$/','',$node->textContent)] = trim($node->nextSibling->textContent);
}
var_dump($result);
Here is the result am pulling from my array.
array
'Choose by Subject Category or Module Code' => string '' (length=0)
'
Back to Home page' => string '' (length=0)
'International' => string 'visiting students should consult the' (length=36)
'Undergraduate' => string 'students should refer to the relevant section of the UCC' (length=56)
'Postgraduate' => string 'students should refer to the relevant section of the UCC' (length=56)
'Credit Weighting' => string '5' (length=1)
'Teaching Period(s)' => string 'Teaching Period 1.' (length=18)
'No. of Students' => string 'Min 15, Max 30.' (length=15)
'Pre-requisite(s)' => string 'None' (length=4)
'Co-requisite(s)' => string 'None' (length=4)
'Teaching Methods' => string '1 x 4hr(s) Lectures; Other (Distance Education Module - Up to 146hrs Self Directed Study).' (length=90)
'Module Co-ordinator' => string 'Dr Peter Cleary, Department of Accounting, Finance and Information Systems.' (length=75)
'Lecturer(s)' => string 'Staff, Department of Accounting, Finance and Information Systems.' (length=65)
'Module Objective' => string 'To examine the management uses of accounting information and to enhance students ability to exert effective managerial control.' (length=127)
'Module Content' => string 'Topics include; the accounting information needs of management, costs and pricing; estimating costs; the identification of key performance indicators; budgeting for control; capital investment appraisal and implications for strategic planning and control.' (length=256)
'Learning Outcomes' => string 'On successful completion of this module, students should be able to:' (length=68)
'Assessment' => string 'Total Marks 100: Continuous Assessment 100 marks (Project/ Essay. Approximately 1500 words.).' (length=93)
'Compulsory Elements' => string 'Continuous Assessment.' (length=22)
'Penalties (for late submission of Course/Project Work etc.)' => string 'Where work is submitted up to and including 7 days late, 10% of the total marks available shall be deducted from the mark achieved. Where work is submitted up to and including 14 days late, 20% of the total marks available shall be deducted from the mark achieved. Work submitted 15 days late or more shall be assigned a mark of zero.' (length=336)
'Pass Standard and any Special Requirements for Passing Module' => string '40%.' (length=4)
'End of Year Written Examination Profile' => string 'No End of Year Written Examination.' (length=35)
'Requirements for Supplemental Examination' => string 'Marks in passed element(s) of Continuous Assessment are carried forward, Failed element(s) of Continuous Assessment must be repeated (Resubmission of revised Continuous Assessment).' (length=181)
I did try a for each statement with NSERT query inside but all the content was saved in a colum instead.
$array_data = implode("array_separator", $result);
foreach($result as $snode){
$query = sprintf("INSERT INTO save_array (ModuleCode) VALUES ('%s')",mysql_real_escape_string($snode));
mysql_query($query) or die('Error, insert query failed');
echo $snode.<br />';
}
echo '<br /><br /><br />';
Any help would be appreciated. Thanks.
//============== LATEST INSERT QUERY================//
$array_data = implode("array_separator", $result);
foreach($result as $snode){
$query = sprintf("INSERT INTO save_array
(ModuleCode,
Homepage,
International,
Undergraduate,
Postgraduate,
CreditWeighting,
TeachingPeriod,
NoofStudents,
Prerequisite,
Corequisite,
TeachingMethods,
ModuleCoordinator,
Lecturer,
ModuleObjective,
ModuleContent,
LearningOutcomes,
Assessment,
CompulsoryElements,
Penalties,
PassStandard,
EndofYearWrittenExamination,
RequirementsforExamination) VALUES ('%s')",mysql_real_escape_string($snode));
foreach ($result as $key => $value)
$query = $query . "$value";
echo '<br /><br />';
mysql_query($query) or die($query."<br/><br/>".mysql_error());
echo $snode. '<br />';
}
echo '<br /><br /><br />';

You can loop on all elements of array and prepare SQL INSERT INTO statment, and when you do this execute it.

A quick answer would be to iterate through a foreach loop, concatenating the values into an INSERT query (for more information, see http://dev.mysql.com/doc/refman/5.5/en/insert.html), and have the foreach loop exclude the keys "Undergraduate", "International", and "Postdoc", as well as any values that have length 0.
Your problem seems to be in the INSERT query. Try something like this:
$query = sprintf("INSERT INTO save_array (CreditWeighting, TeachingPeriod, NoofStudents, etc.)) VALUES ('%s')",mysql_real_escape_string($snode));
foreach ($result as $key => $value)
$query = $query . "$value";
And do some tweaking to get the query string just right.

Related

Make clickable links using indices of associative array

I have an associative array of links like this
$my_links = [
'city 1' => 'http://link1',
'city 2' => 'http://link2',
'Head Office' => 'http://link3'
];
and some html like this. The html is dynamically generated by a script ( wordpress blog content).
<p>
You can visit our stores at City 1
and City 2,
or visit our Head office.
</p>
Required Output: Make clickable links using indices of above array
<p>
You can visit our stores at City 1
and City 2,
or visit our Head office.
</p>
How to achieve this using PHP and/or JQuery?
<?php
$my_links = [
'city 1' => 'http://link1',
'city 2' => 'http://link2',
'Head Office' => 'http://link3'
];
$str = "<p>
You can visit our stores at City 1
and City 2,
or visit our Head office.
</p>";
foreach ($my_links as $link_title => $link) {
$str = str_ireplace($link_title,"<a href='$link'>".ucwords($link_title)."</a>",$str);
}
echo $str;
Loop over your $my_links. Find the link title present in the string and use str_ireplace() to replace the link title with the anchor tags.
Just use the array references:
<p>
You can visit our stores at City 1
and City 2,
or visit our Head office.
</p>
If your content is coming from PHP, use PHP's str_replace() function.
This function's three parameters search the purpose:
search: string or array
replace: string or array
actual string: string
If search and replace are arrays, their elements count should be same.
Now, find the string segments like City 1, City 2 and Head Office and replace them by adding <a href="... to them.
Code:
<?php
$my_links = [
'city 1' => 'http://link1',
'city 2' => 'http://link2',
'Head Office' => 'http://link3'
];
$content = '<p>
You can visit our stores at City 1
and City 2,
or visit our Head office.
</p>';
$find = ['City 1', 'City 2', 'Head office'];
$replace = [
'City 1',
'City 2',
'Head Office',
];
echo str_replace($find, $replace, $content);
?>
A Quick Update:
Please use str_ireplace() instead of str_replace() discussed above as we have case insensitive comparison e.g. city 1 vs City 1. This function works the same way as str_replace(), only it is case insensitive.
You can try this
<p>
You can visit our stores at City 1
and City 2,
or visit our Head office.
</p>

Codeigniter $query->result() returns strange results

This peace of code is driving me crazy for last hour...
I have this model which should return all non active records from DB
$query = $this->db->get($tableName);
echo $this->db->last_query();
var_dump($query->result());
$this->db->last_query() output is
SELECT * FROM `locations` LEFT JOIN `provinces` ON `provinces`.`id_province` = `locations`.`id_province` LEFT JOIN `countries` ON `countries`.`id_country` = `provinces`.`id_country` LEFT JOIN `statuses` ON `statuses`.`id_status` = `locations`.`id_status` WHERE `locations`.`active` = '0' ORDER BY `locations`.`id_location` DESC LIMIT 50
If i run exactsame query in phpmyadmin i get correct results
But when i var_dump data var_dump($query->result()); i get the following results
array (size=50)
0 =>
object(stdClass)[61]
public 'unique_id' => string 'OWYwYjBmNm' (length=10)
public 'active' => string '1' (length=1)
public 'owner_name' => string 'Cleve Greenfelder' (length=17)
1 =>
object(stdClass)[62]
public 'unique_id' => string 'YWY4YmMzMm' (length=10)
public 'active' => string '1' (length=1)
public 'owner_name' => string 'Bradford Hyatt' (length=14)
Why/how this active state get's overwritten from 0 to 1?
IF you need any additional information's, please let me know and i will provide. Thank you!
Once i wrote a question, answer quickly appeared in my head :)
Table Countries has also active field, so this field overwrites active state as enabled. I needed to specified fields and there's name in query in order to get proper results
$fields = 'unique_id, locations.active as active, ....';

PHP MySQL Insert array

I'm having trouble with inserting the values from this array. Here example:
$arr = json_decode($_POST['dynfields'], true);
//{"dynfields":{"dynfields[0][DescRepair]":"Desc repair","dynfields[0][NestParts]":"Parts","dynfields[0][EdPrice]":"10","dynfields[0][DateRepair]":"2015-07-20","dynfields[1][DescRepair]":"Desc repair","dynfields[1][NestParts]":"Parts","dynfields[1][EdPrice]":"5","dynfields[1][DateRepair]":"2015-07-20"}}
foreach ($arr as $key => $fieldArray ) {
foreach($fieldArray as $k => $v) {
echo $k . " - " . $v . "<br>"; // result: dynfields[0][DescRepair] - Desc repair
dynfields[0] [NestParts] - Parts
dynfields[0][EdPrice] - 10
dynfields[0][DateRepair] - 2015-07-20
dynfields[1][DescRepair] - Desc repair
dynfields[1][NestParts] - Parts
dynfields[1][EdPrice] - 5
dynfields[1][DateRepair] - 2015-07-20
}
//$query = mysqli_query($mysqli, "INSERT INTO repair (DescRepair, NestParts, EdPrice, DateRepair) VALUES ('?', '?', '?', '?')") or die(mysqli_error($mysqli));
}
This is my code, but I don't know how to insert the value in db. Can you give me any suggestions. Thanks.
I did not understand very well your code, but at first your json is bad, on post, this is an example of right json:
{
"dynfields": [
{
"DescRepair": "Desc repair",
"NestParts": "Parts",
"EdPrice": "10",
"DateRepair": "2015-07-20"
},
{
"DescRepair": "Desc repair",
"NestParts": "Parts",
"EdPrice": "5",
"DateRepair": "2015-07-20"
}
]
}
Then you can make a foreach with the dynfields data:
$myvar = json_decode($json,true);
$data = $myvar['dynfields'];
foreach(array_keys($data) as $index){
var_dump($data[$index]);
}
then you will get something like this (var_dump):
array (size=4)
'DescRepair' => string 'Desc repair' (length=11)
'NestParts' => string 'Parts' (length=5)
'EdPrice' => string '10' (length=2)
'DateRepair' => string '2015-07-20' (length=10)
array (size=4)
'DescRepair' => string 'Desc repair' (length=11)
'NestParts' => string 'Parts' (length=5)
'EdPrice' => string '5' (length=1)
'DateRepair' => string '2015-07-20' (length=10)
$query = mysqli_query($mysqli, "INSERT INTO repair (DescRepair, NestParts, EdPrice, DateRepair) VALUES ('?', '?', '?', '?')") or die(mysqli_error($mysqli))
relace each ? with {$arr['xxxxx']} Where xxxxx are your array keys
make sure to well-escape the variables to prevent SQL Injection
Hint: you can use PDO or prepared statements

Organizing dates with times and timezones. (Converting to accurate timestamp.)

I've been picking at my brain for a couple of days with the following conundrum.
I've basically the following complex mySQL table:
| ID | TITLE | DESCRIPTION | EVENT | DATE |
|----|--------------|-------------------|-------|-------------------------|
| 1 | Big painting | 3-day work | No | 03/10/2013 |
| 2 | Meeting | With reps. | Yes | 02/15/2013 09:00 -05:00 |
| 3 | Presentation | 5 paintings | Yes | 08/02/2013 22:00 +02:00 |
| 4 | Round paint. | One week | No | 04/05/2013 |
| 5 | Conference | On Picasso | Yes | 04/22/2013 18:00 -05:00 |
(EDIT: Perhaps I need to clarify that the DATE column is not set as DATE or DATETIME [due to the need to include the Timezone in the data] but rather as VARCHAR, which is why the organization is complicated from the start.)
As you can see, it's a table which comprises all "What's New" items for a painter, for example. The idea is that on this painter's website PHP will call out values in order to display them as a "What's New" news ticker.
All the basics are there but I'm hitting a snag.
Initially, I would like to filter and order my data at the SELECT stage, but I was having trouble doing that. As you can see, bot the event and non-event items have dates, but the non-event items just have them as a way to organize the overall data. The specific date and time is only important for the events, because that way the user will be able to know when these things are occurring. So the basic idea would be to pick out from the table a certain number of the LATEST items. So all items would be read from the table, placed in order of DATE, and then, say, 20 of them would be brought out.
As I said, I had initially though of doing this at the SELECT stage, but I think it might be too complex. So I just extracted all items and set a PHP code after them in order to filter them.
So the snag appears when I try to order the dates. I'm trying to convert dates to timestamps for the ordering process, then back to dates for the displaying. However, I can't get the date-timestamp or timestamp-date (or both) conversion to work. I always end up with dates that are different to those I started with.
As you can see, the entire thing is made more complex because of the Timezones, which are very important, as a user must be able to know where these things are happening or, rather, at what time according to where they're happening.
I've tried simply converting back and forth like so:
$timestamped = strtotime($date);
$datetimed = date('m/d/Y h:i P',$timestamped);
And it doesn't work, so I guessed it had something to do with the date format I'm using in my table.
So then I tried this:
$var = DateTime::createFromFormat('m/d/Y H:i P',$date)->getTimestamp();
To no avail, yet...
I'm thinking that perhaps I should rather set the timestamp at the beginning of the process, i.e. when inserting the data items. But, here also, I would need to convert a "human" date to a timestamp, and if I can't manage this correctly, nothing will properly work.
I understand this question is complex and perhaps my explanation isn't the clearest! Perhaps an output example might help. What I'm trying to achieve is a "What's New" news ticker that includes a list of things that are going on: some of them just information (like status updates, lets say) without visible dates (here dates are only for internal organization; this is where the EVENT column comes in, as it filters which items must show their dates and which must not), others, actual events to which the user is invited and which display their dates for the user. I even have a code that calculates whether the date and time is in the past or the future in order to display an "UPCOMING" tag on those events that are not yet past. However, I'm having trouble handling the dates and ordering them.
This is what this example should more or less look like at the end:
Any and all help will be GREATLY appreciated! (As well as feedback on what you guys think will be the most practical and most clean/elegant/pro way of handling this data retrieval/organization process... if at data input, if at mySQL SELECT stage, if later, etc.)
P.S. I might perhaps add that in the same table I handle other data. This specific "What's New" data is selected by a SELECT function that looks for a specific WHATSNEW column to have a value of TRUE in any row that will be retrieved for this specific "What's New" news ticker.
RESOLUTION (THOUGH NOT ANSWER)
Because the question was about organizing times and timezones as one string, so to speak, then I'm not sure I can mark any of these two great answers as correct for that specific issue. What I did end up doing was stripping the timezones and putting them in a separate column. Then I formatted my date column as Datetime. So I had that solved, because mySQL Select could take care of the order for me. Now, about the timezones, I ended up cheating a bit: I figured our "artist" couldn't possibly be at two events in two different timezones at the same time, so, really, it's rather improbable that we would need to order two events that are so close together that the timezones of each make a real difference which comes first. So I just have the thing order itself by dates and then whipped up a snippet to take care of the timezones and turn them into "GMT+1", "GMT-5" displays, so the users will know where the location is of that local time. I ended up using DateTime::createFromFormat()->getOffset(), which I've now seen my second answerer recommended, and said I was on the right track, so I'm happy I kept it in there In order to further clarify this, I added a Location column, where the webmaster will be able to specify the city, say "Paris", say "London", and so on. So the user will end up having something very similar to that which is shown in my example, except that it will say ... (Paris, GMT+1) and so on.
Anyway, for anyone out there that has the exact same issue and ends up thinking the exact same things and that this way out is more practical, here goes the heart of the code I ended up with. The rest is just "fill-in". Enjoy! And thanks to both darling persons who were so kind as to take time from their days to help me out in finding a resolution for this issue! (I may have an extra }... sorry for that. The re-formatting when one pastes it into SO is really tedious! I've revised the code twice and can't find any problems, though.)
if(isset($item) && $item['event'] == '1') {
$event = $item['event'];
$date = $item['date'];
$date_array = date_parse($date);
$minute = $date_array['minute'];
if($minute<10) {
$minute = '0'.$minute;
}
$timezone = $item['timezone'];
if($timezone!=='') {
$timezone = DateTime::createFromFormat('P',$timezone)->getOffset();
$timezone = $timezone/-3600;
if($timezone<0) {
$timezone = $timezone;
} else
if($timezone==0) {
$timezone = '-0';
} else {
$timezone = '+'.$timezone;
}
$timezone = 'Etc/GMT'.$timezone;
$timezone_real = $item['timezone'];
$timezone_real = DateTime::createFromFormat('P',$timezone)->getOffset();
$timezone_real = $timezone_real/-3600;
if($timezone_real<0) {
$timezone_real = str_replace('-','+',$timezone_real);//.':00';
} else
if($timezone_real==0) {
$timezone_real = '+0';//:00';
} else {
$timezone_real = '-'.$timezone_real;//.':00';
}
$timezone_real = 'GMT'.$timezone_real;
date_default_timezone_set($timezone);
}
$today = date('n/j/Y G:i', time());
$today = strtotime($today);
$event_date = $date_array['month'].'/'.$date_array['day'].'/'.$date_array['year'].' '.$date_array['hour'].':'.$minute;
$event_date_unformatted = strtotime($event_date);
if($date_array['hour'] == '0') {
$hour_convert = '12';
$hour_suffix = 'a.m.';
} else if($date_array['hour']<12) {
$hour_convert = $date_array['hour'];
$hour_suffix = 'a.m.';
} else if($date_array['hour'] == '12') {
$hour_convert = $date_array['hour'];
$hour_suffix = 'p.m.';
} else {
$hour_convert = $date_array['hour']-12;
$hour_suffix = 'p.m.';
}
$date_convert = array('1' => 'January', '2' => 'February', '3' => 'March', '4' => 'April', '5' => 'May', '6' => 'June', '7' => 'July', '8' => 'August', '9' => 'September', '10' => 'October', '11' => 'November', '12' => 'December');
$event_date = $date_convert[$date_array['month']].' '.$date_array['day'].', '.$date_array['year'].', '.$hour_convert.':'.$minute.' '.$hour_suffix;
if(($event_date_unformatted-$today)>0) {
echo '<h5>UPCOMING:</h5>';
echo '<h6>'.$item['location'].', '.$event_date.' <sup>('.$timezone_real.')</sup></h6>';
}
}
You say that DateTime::createFromFormat doesn't work, but don't tell us what the error message is. I guess its because your format string doesn't represent the format you are passing. See the manual page for acceptable formats.
Having said that, I believe that you were on the right track with DateTime::createFromFormat, that is the approach I would take. Somebody with more powerful SQL foo than mine could probably come up with a way of doing this with a query, but here is my purely PHP approach to getting you an array of events sorted on date:-
//first we connect to our database
$dsn = 'mysql:dbname=stackoverflow;host=127.0.0.1';
$user = '********';
$password = '*********';
try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
//then we get our list of events from the table
$sql = "select * from datetable";
$select = $dbh->prepare($sql);
$select->execute();
//We now have an associative array of events, but in the wrong order.
$results = $select->fetchAll(PDO::FETCH_ASSOC);
$events = array();
//we want to sort on date, so lets get the dates into a format we can sort on
foreach($results as $result){
$event = $result;
$date = explode(' ', $result['date']);
if(isset($date[1])){
$event['date'] = \DateTime::createFromFormat('m/d/Y H:i', $date[0] . ' ' . $date[1]);
$event['tz'] = $date[2];
} else {
$event['date'] = \DateTime::createFromFormat('m/d/Y', $date[0]);
}
$events[] = $event;
}
//our sorting function
$byDate = function(array $eventA, array $eventB){
return $eventB['date'] > $eventA['date'] ? -1 : 1;
};
//sort the array
usort($events, $byDate);
//we now have our array sorted correctly
var_dump($events);
Result:-
array (size=5)
0 =>
array (size=6)
'id' => string '2' (length=1)
'title' => string 'Meeting' (length=7)
'description' => string 'With reps.' (length=10)
'event' => string 'Yes' (length=3)
'date' =>
object(DateTime)[4]
public 'date' => string '2013-02-15 09:00:00' (length=19)
public 'timezone_type' => int 3
public 'timezone' => string 'Europe/London' (length=13)
'tz' => string '-05:00' (length=6)
1 =>
array (size=5)
'id' => string '1' (length=1)
'title' => string 'Big painting' (length=12)
'description' => string '3-day work' (length=10)
'event' => string 'No' (length=2)
'date' =>
object(DateTime)[3]
public 'date' => string '2013-03-10 23:18:05' (length=19)
public 'timezone_type' => int 3
public 'timezone' => string 'Europe/London' (length=13)
2 =>
array (size=5)
'id' => string '4' (length=1)
'title' => string 'Round paint.' (length=12)
'description' => string 'One week' (length=8)
'event' => string 'No' (length=2)
'date' =>
object(DateTime)[6]
public 'date' => string '2013-04-05 23:18:05' (length=19)
public 'timezone_type' => int 3
public 'timezone' => string 'Europe/London' (length=13)
3 =>
array (size=6)
'id' => string '5' (length=1)
'title' => string 'Conference' (length=10)
'description' => string 'On Picasso' (length=10)
'event' => string 'Yes' (length=3)
'date' =>
object(DateTime)[7]
public 'date' => string '2013-04-22 18:00:00' (length=19)
public 'timezone_type' => int 3
public 'timezone' => string 'Europe/London' (length=13)
'tz' => string '-05:00' (length=6)
4 =>
array (size=6)
'id' => string '3' (length=1)
'title' => string 'Presentation' (length=12)
'description' => string '5 paintings' (length=11)
'event' => string 'Yes' (length=3)
'date' =>
object(DateTime)[5]
public 'date' => string '2013-08-02 22:00:00' (length=19)
public 'timezone_type' => int 3
public 'timezone' => string 'Europe/London' (length=13)
'tz' => string '+02:00' (length=6)
The main issue still outstanding is the timezones. Your database stores offsets, not timezones. There are some questions on this on SO (this one for example), so I won't double up on those efforts here, but the offsets are available in the array should you find a way to us them.
I noticed in your comments that you are considering adding a time zone column, this is a good idea. However, I would advise you to store them as TZ strings from this list, they can then be passed directly into the constructor of DateTimeZone to give you advantages such as allowance for daylight savings etc.
The SQL query should be
$data= mysql_query( "SELECT * FROM (table name) ORDER BY date ASC")
I am adding an algorithm given your latest comments.
Firstly:
Your data type for the DATE column needs to be uniform, If it is of the datetime or timestamp format it should order the data correctly.
This link provides you with a comprehensive list of date and time functions. It is worth reading to give you a better feel for solving your problem.
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html
See this link that addresses the correct formatting of dates - (however for a cleaner table, I suggest you have only the one format to be accepted into your table):
Order by descending date - month, day and year
For online use:
I think somehow you need to either "standardise" the timezones. The timestamp can be created within the same timezone for all events, the user could then view these times according to their chosen timezone., hence all the times are adjusted for each user.
this link discusses session variables for timezones:
http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html
Per-connection time zones. Each client that connects has its own time zone setting, given by the session time_zone variable. Initially, the session variable takes its value from the global time_zone variable, but the client can change its own time zone with this statement:
mysql> SET time_zone = timezone;
However for local use, where an individual may receive a flyer of the updates, with a view to attending them, then you need to display the timezone for that locality, with the locality mentioned. Adding for eg GMT +2.00 does not give many users an indication of the time with reference to their own timezone, they would usually have to convert it themselves. This puts an added frustration for the user. It would be worth the effort to convert it for them, or offer some explanation for the time differences - so the user can get a clear understanding of "when" this event is happening with respect to their timezone.
To deal with the timezones, it is worth going to this link:
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_convert-tz
CONVERT_TZ() converts a datetime value dt from the time zone given by from_tz to the time zone given by to_tz and returns the resulting value. Time zones are specified as described in Section 10.6, “MySQL Server Time Zone Support”. This function returns NULL if the arguments are invalid.
If the value falls out of the supported range of the TIMESTAMP type when converted from from_tz to UTC, no conversion occurs. The TIMESTAMP range is described in Section 11.1.2, “Date and Time Type Overview”.
mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET');
-> '2004-01-01 13:00:00'
mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00');
-> '2004-01-01 22:00:00'
Note
To use named time zones such as 'MET' or 'Europe/Moscow', the time zone tables must be properly set up. See Section 10.6, “MySQL Server Time Zone Support”, for instructions.
I think if you add an extra column, this will help your problem.
I think by
checking your data types
standardising your timezones
Adding another column to show the timezone
you will have no trouble ordering your table.
I hope this helps. Please let me know.

grouping / formatting `group` with `tags` with mysql or php

lets say we have an array like this
from a mysql function like
function getGroups($limit = 10) {
$data = $this->fetchAll ( 'SELECT gid, `group`, information, tag FROM groups
GROUP BY tag LIMIT ' . $limit );
return $data;
}
Resulting
array
0 =>
array
'gid' => string '6' (length=1)
'group' => string 'Media' (length=5)
'tag' => string 'advertising' (length=11)
1 =>
array
'gid' => string '8' (length=1)
'group' => string 'Fashion' (length=10)
'tag' => string 'shorts' (length=7)
2 =>
array
'gid' => string '7' (length=1)
'group' => string 'Automotive' (length=8)
'tag' => string 'cars' (length=5)
3 =>
array
'gid' => string '1' (length=1)
'group' => string 'Fashion' (length=7)
'tag' => string 'tshirt' (length=6)
i need to display somehow to this ( something like )
array
0 =>
array
'group' => string 'Media'
'tags'
array
0 => string 'advertising'
1 =>
array
'group' => string 'Fashion'
'tags'
array
0 => string 'short'
1 => string 'tshirt'
2 =>
array
'group' => string 'Automotive'
'tags'
array
0 => 'cars'
simpler
group tag
media advertising
fashion short
fashion tshirt
automotive cars
to
media
advertising
fashion
short
tshirt
automotive
cars
what is the best way to do this? from php array? or from the mysql ?
Are you trying to get a list of groups, plus all the tags for each group? GROUP_CONCAT() is the right way to get the tag list but you want to be grouping by group, not by tag:
function getGroups($limit = 10) {
$data = (array) $this->fetchAll (
'SELECT `group`,
GROUP_CONCAT(DISTINCT `tag` ORDER BY `tag`) AS `tags`
FROM `groups`
GROUP BY `group` LIMIT ' . $limit
);
foreach ($data as $i => $row) {
$data[$i]['tags'] = explode(',', $row['tags']);
}
return $data;
}
I would add
ORDER BY group,tag
so the result set has all rows of the same group together.
Starting a new can then be done in php by comparing to the previous group and close/starting the new group when it has changed.
actually using hashes makes more sense...
$names = array();
$query = ''SELECT gid, `group`, information, tag FROM groups GROUP BY tag LIMIT ' . $limit';
$result = mysql_query($query);
$num_rows = mysql_num_rows($result);
if ($num_rows) {
while ($row = mysql_fetch_array($result)) {
array_push($names[$row['group']], $row['tag']);
}
}
Try this
function getGroups($limit = 10) {
$data = $this->fetchAll ( 'SELECT gid, `group`, information, tag FROM groups
GROUP BY group LIMIT ' . $limit );
return $data;
}
This will group you data with group, or you can use group_concat but then you will get short, tshirt something like this.

Categories