output_buffering in Wamp causing issues in the insert form

As mentioned earlier this week i changed my development machine to newer vmware win 7. During this, also upgraded from Wamp 2.2 to Wamp 2.5. Fortunatelly, i still keep both environments in parallel since various issues come up.

One of these issues is the one found today in php form (created with the dreamweaver CC wizard) that inserts some values into a mysql table. In my new dev machine i got these errors:

apache erros

The old dev environment worked fine, the prod environment worked fine, the new dev threw errors.

I started by trying to find any compatibility issues in the PHP versions between Wamp Server 2.2 and 2.5, could not locate anything.

The solution came from the Stack Exchange (again). It appears that the php.ini on the new server came with the default value of

output_buffering = 4096

which should be changed to

output_buffering = on

which was the default on the old dev machine. To change the value in Wamp server just go to PHP menu and edit the php.ini to the mentioned value.

wamp.2.5

One alternative suggested by lots of people, which i did not try was to add

ob_start();

at the beggining of the script, which turns on the output buffering feature for the specific script.

vmware repeated characters problem

For some time now i have this problem in one of the vm`s i use (win XP).When i edit a text document or start typing something, repeated keystrikes appear as if someone is pressing “c” on my keyboard.

repeated c strokes

In the beginning i thought that the cause of the problem was my XP machine, and the fact that i have been installing software from unsecure “origins”.. So i thought that a new vmware would be the solution to the problem. But NO! After backing up all my data, migrating it to a new windows 7 machine, and started using it in production use, guess..

repeated c strokes

It appears that this is a knowkn issue for vmware machines. I should have google it before doing all the work. This is how to get rid of it:

1. Power off the virtual machine.

2. Add a line, similar to this, at the end of your virtual machine’s configuration (.vmx) file

keyboard.typematicMinDelay = “2000000”

which equals to 2 seconds delay in the keyboard.

3. Start the vmware. You should be good to go.

Mike at “Single Founder” suggests the value can be changed to “500000”, since “2 seconds is a long time for computers”. I agree.

 

mysql change single column character set

It turn`s out that there is an easy way to change the character set and collation of a single column in mysql. I usually have this issue since my provider has a swedish collation that is chosen by default when creating a column. I only realize after i get data in of course.. Here it is..

ALTER TABLE `packs`
MODIFY `packsname` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci;

To change the character set (and collation) for all columns in an existing table, use…

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name [COLLATE collation_name];

published date meta data from mysql timestamp

I am using the timestamp data type in mysql to keep track of when each row has been modified or inserted.

CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

This saves the date in the database in the form of: 2015-11-24 13:55:10

I need to have a timestamp though, that will be used in the meta tags and will be in the following form :

<meta property="article:published_time" content="2013-09-17T05:59:00+01:00" />

as advised by opengraph guidelines. Googling a lot, and the following are the two candidates on which i ended up to:

date(DATE_ATOM, strtotime($row_getPost['blogpostimestamp']));

which echoes 2015-11-23T15:27:01+00:00

and

date('Y-m-dTH:i:s.uZ',strtotime($row_getPost['blogpostimestamp']));

whch echoes 2015-11-23UTC15:27:01.00

The latter also includes the server timezone.

An alternative to this would be to convert the timestamp, during the query phase, which from what i read is not suggested, and of course did not work for me. Conversion in the php code allows you to use the timestamp with multiple forms in the same page e.g in meta and on footer notifying when this was published and by whom.

 

 

PHP RSS generator using simple xml

Today`s project was to generate an rss feed for the records in my web-project site using simple xml.

I new that most of the work had already been done, since i created the sitemap for my project. Check here.

So with a little search on the net i found some help. I am not going to write down all the steps that i ve taken to modify code written by others..but just to share some useful resources in case some novice php developer needs to do the same..

Initially i matched my existing code with the example written by Spotless Web Design. What a great and descriptive article…

Most of the word had already been done, but i needed to add some more quality stuff in the raw xml file like the atom link, so i got some more help from this guy.

Finally in order to validate the rss, i visited FeedValidator a couple of times.

 

That`s it for today … Next project is to link this RSS feed with an IFTTT rule to automatically post images to pintrest and twitter.. lets see how this goes.

Mysql Duplicate and Modify Row

I was trying to find an easy way to duplicate a table row in mysql, and it appears that mysql can handle that pretty easily.  Just Use:

insert INTO `server`.`ad` (`adgrp`,`adname`,`ad`,`adlink`,`adtype`,`adprovider`,`visible`) SELECT `adgrp`,`adname`,`ad`,`adlink`,`adtype`,`adprovider`,`visible` FROM `server`.ad where idad=46;

to duplicate any row on any table, or use the  CONCAT() function to add text to the newly created row. In my case i needed to set the name just to be “_copy” of the original one:

insert INTO `server`.`ad` (`adgrp`,`adname`,`ad`,`adlink`,`adtype`,`adprovider`,`visible`) SELECT `adgrp`,CONCAT(`adname`,"_COPY"),`ad`,`adlink`,`adtype`,`adprovider`,`visible` FROM `server`.ad where idad=46;

In the case above the idad column is of course the primary key and auto-increment, so it cannot be copied.

PHP- Mysql database encoding and question-marks in the text (and how to get rid of them)

For my developing project i use Mysql and Dreamweaver set up with Wamp. I would say that i very familiar with databases and how to handle data etc..

Prerequisites to this project was that i could not modify either my php.ini or mysql.ini, since i am on a shared hosting plan.

One issue I had and could not fix though was that i got question-marks  for special characters like quotes or Cyrillic or French characters using ascent. I did work on this many hours but with no luck. Today i finally have managed to solve it. Here is how:

Since all my databases already have data and are online, i created copies of them using the correct charset. So:

1. I Exported all the tables in my databases using mysqldump and recreated them using utf8  character set and utf8_unicode_ci table/column collation. This is essential to make sure all data are saved in the correct format

2. I made sure that all my pages had the following two meta tags in the head tag:

<meta charset="UTF-8" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

3. Finally, and that is what was missing all this time, is to make sure that all communication with the database is done through UTF. Apparently this does not happen automatically when you set the php encoding and the database collation/encoding. To do so, every time you query your database,  you need to specify the communication  encoding format.

mysql_select_db($database_localhost, $localhost);

$query_collections = sprintf("Select  * from table WHERE packbrand=%s and serial='1' AND VISIBLE='1' order by collection asc", GetSQLValueString($colname_collections, "text"));

mysql_query("set names 'utf8'");

This  last part basically fixed it.

What did not work for me:

  • Trying to figure our whether your text editor (like notepad++) is wrongly converting your query to a different encoding.
  •  Pass the set names command in mysql workbench. While typing this i am just now realizing that this would not make any difference on way or an other, because it is the retrieval of the data in PHP that caused issues and not the displaying or the typing in..

One down many to go. Move to next project.

Sitemap & Sitemap Index xml files using php and mysql

For some time now I have been generating sitemap xml files for google submission using Microsoft Excel. Always knew that there would be a way to generate it on the fly/on request and never bother with that again. But how?

Documentation is not very clear because you need to use multiple programming languages, and also because the whole xml validation process seems very sensitive to errors. Since i am not an experienced programmer, stack exchange became my guide and i have finally managed to do it.

If you have multiple pages, you probably need to create intermediate xmlindex pages. These are basically specially marked index files that point to other index files. Warning: Nested xmlindex files are not allowed by Google (even though are at the end followed and indexed).

<?php Header('Content-type: text/xml');

require_once('../Connections/localhost.php'); 

if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
 if (PHP_VERSION < 6) {
 $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
 }

 $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

 switch ($theType) {
 case "text":
 $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
 break; 
 case "long":
 case "int":
 $theValue = ($theValue != "") ? intval($theValue) : "NULL";
 break;
 case "double":
 $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
 break;
 case "date":
 $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
 break;
 case "defined":
 $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
 break;
 }
 return $theValue;
}
}

mysql_select_db($database_localhost, $localhost);
$query_Recordset1 = "select * from sitemaps where `use`='sitemap'";
$Recordset1 = mysql_query($query_Recordset1, $localhost) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);
$xml=new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'
 .'<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'
 .'</sitemapindex>'); 
do { $url=$xml->addChild('sitemap');
 $website="http://www.tharsitis.gr/".strtolower(str_replace(' ','-',$row_Recordset1['url']));
 $url->addChild('loc',$website);
 "<br/>";
 //$url->addChild('lastmod','XXXXXXXX'); OPTIONAL
 } while ($row_Recordset1 = mysql_fetch_assoc($Recordset1));
mysql_free_result($Recordset1);
print($xml->asXML());
?>

This is the xml sitemap  index code that worked for me. I created the database recordset using Dreamweaver. It retrieves all the xml index urls from Mysql database.

At the second part of the project i needed to generate the sitemap xml files that the xml index would be point at.

This is the code that worked for me:

<?php Header('Content-type: text/xml');

require_once('../Connections/localhost.php'); 

if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
 if (PHP_VERSION < 6) {
 $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
 }

 $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

 switch ($theType) {
 case "text":
 $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
 break; 
 case "long":
 case "int":
 $theValue = ($theValue != "") ? intval($theValue) : "NULL";
 break;
 case "double":
 $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
 break;
 case "date":
 $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
 break;
 case "defined":
 $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
 break;
 }
 return $theValue;
}
}

$rs1_Recordset1 = "-1";
if (isset($_GET['id'])) {
 $rs_Recordset1 = strtolower(str_replace ( '-', ' ',$_GET['id']));
}

mysql_select_db($database_localhost, $localhost);
$query_Recordset1 = sprintf("SELECT packbrand,packsuuid,packcollection,packsname,folder FROM packs where collectionid=%s and visible='1' order by serial asc",GetSQLValueString($rs_Recordset1, "text"));
$Recordset1 = mysql_query($query_Recordset1, $localhost) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);
$xml=new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'
 .'<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">'
 .'</urlset>'); 
do { 
 $brand=$row_Recordset1['packbrand'];
 $collection=$row_Recordset1['packcollection'];
 $url=$xml->addChild('url');
// $image="image:image";
 $website="http://www.tharsitis.gr/".strtolower(str_replace(' ','-',$brand."/".$collection."/".$row_Recordset1['packsuuid']));
 $img="http://www.tharsitis.gr/packagecache/".$row_Recordset1['folder']."/".$row_Recordset1['packsuuid'].".jpg";
 $url->addChild('loc',$website);
 $url->addChild('priority','0.7');
 $image = $url->addChild('image:image', null, 'http://www.google.com/schemas/sitemap-image/1.1');
 $image->addChild('image:loc',$img, 'http://www.google.com/schemas/sitemap-image/1.1');
 $image->addChild('image:caption',$row_Recordset1['packsname'], 'http://www.google.com/schemas/sitemap-image/1.1');
 } while ($row_Recordset1 = mysql_fetch_assoc($Recordset1));
mysql_free_result($Recordset1);
print($xml->asXML());
?>

In both files you can skip the initial part where i build the recordset. This was all done automatically by Dreamweaver. Save the files as php files.
Finally, i needed to modify my .htaccess file so that it translated every php  request matching the above files to xml. This is a requirement to get Google validate the files correctly.

Rewriterule ^xmlindex.xml$ /xml/xmlindex.php [L]
Rewriterule ^p(.*).xml$ /xml/xmlpacks.php?id=$1 [L]

As you can see in the second line of the below htaccess code, I use url variables to generate dynamic xml sitemaps for different sets of urls.  Vuala!

Panorama Made using Photoshop – Lake Vegoritida

Lake Vegoritida Panorama using Photoshop and fixed exposure photos taken with my Nikon.

Vegoritida-Lake-panorama
Vegoritida-Lake-panorama

 

Exact Location:

Photomerge is a great functionality of photoshop to create panorama pictures as long as the source images have the same exposure, otherwise it gets confused. To get sequential photos with the same exposure i just half press the photo button on my nikon, so as to lock the exposure, and as i move my body form left to right i press it down with our fully releasing it though. This allows to photometer hust once, in the first photo, and take the rest of them with the same settings.

Now in Photoshop the process is automated. Just import the set of images using the correct menu.

Select the appropriate menu..

Photoshop Photomerge Menu
Photoshop Photomerge Menu

And import the set of pictures. Photoshop does the rest.

Photoshop Photomerge Menu
Photoshop Photomerge Menu

On the specific panorama i messed up the levels a bit.