Friday, July 14, 2017

GST Submit with DSC Error [SOLVED]

Unable to connect to the installed EMSigner. Please close any other application running on following ports 8080, 1645, 1812, 2083 and restart your system, and try again.

Unable to connect to the installed EMSigner. Please close any other application running on following ports 8080, 1585, 1812, 2083 and restart your system, and try again.

If you are getting above error while submitting / verifying your GST application using DSC
then you are at right place.

I tried submitting using google chrome, Mozilla firefox even Internet Explorer but it failed.
Many blog posts suggests changing java settings, port settings even hosts settings.

But for layman and CA's the best possible way is to download and install UC Browser.
When I used this browser it worked like Charm.

Link - https://uc-browser.en.softonic.com/

ITS a FREE Browser.

Happy GST submitting.

Tuesday, December 29, 2009

Thursday, October 22, 2009

PHP Regular expressions tool

Regular expressions can be a pain. This tool is designed to help developers learn, practice, and compose regular expressions.


http://gethifi.com/regexp/

http://gethifi.com/regexp/

http://gethifi.com/regexp/

Thursday, July 30, 2009

Wednesday, July 29, 2009

Twitter extensions

Twitter is on rage these days.
Twitters apps as firefox extensions just keeps on increasing

https://addons.mozilla.org/en-US/firefox/search?q=twitter&cat=all

Friday, June 5, 2009

MySql GROUP_CONCAT() tip

Recently I found myself into a silly problem because of misunderstaning / confusion relating to data type of variable set in SELECT commmand using GROUP_CONCAT()

I wanted to get all integer ids as comma separated string to be used in other update query

my query:

SELECT GROUP_CONCAT(spm_ids) INTO @csvIds FROM someTable WHERE is_active = 1;

Whenever my select executed correctly it gave e.g. '2,5,6' as a string and when it failed it gave me '0' as a string.

before updating I checked

IF @csvIds <> 0 THEN
// perform some update on some other table
END IF;


I changed to below and my Stored procedure worked perfectly fine.

IF @csvIds <> '0' THEN
// perform some update on some other table
END IF;

Some of mysql String comparison
> select if('2' <> 0, 1, 0)
> 1

> select if('0,2' <> 0, 1, 0) //my problematic condition
> 0

> select if('0' <> 0, 1, 0)
> 0

> select if('2,5,6' <> 0, 1, 0)
> 1





MySql tip 2:
If you are writing too many Stored Procedures(SP) and also including below code in your SPs

DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SELECT 2 AS `error_code`, 'Fail to update ' AS `error_message` ;
END;

Then I would suggest that you first create your SP entirely run it many times under different conditions, if all working fine than include above code and test it again for failure.
This is because you will save some of your precious time by knowing exactly where the query failed.

Wednesday, February 11, 2009

Python Type Conversions


FunctionDescription
int(x [,base])converts x
to an integer
long(x [,base])converts x
to a long integer
float(x)converts x
to a floating-point number
complex(real [,imag])creates a complex number
str(x)converts x
to a string representation
repr(x)converts x
to an expression string
eval(str)evaluates str and returns an object
tuple(s)converts a sequence object to a tuple
list(s)converts a sequence object to a list
chr(x)converts an integer to a character
unichr(x)converts an integer to a Unicode character
ord(c)converts a character to its integer value
hex(x)converts an integer to a hexadecimal string
oct(x)converts an integer to an octal string


Use:
totalRings = int(userInput)
//where totalRings and userInput are variables

Friday, February 6, 2009

Clone node issue in IE

Hi all,

I am writing after a long time.
If you are wondering why so long?
didnt I had anything worthwhile to type?
Yes, I didnt had anything to write, coz whatever I learnt in last few months its well documented all over internet.
Not to forget an important fact that during my free time last year i Played a lot with my Canon SLR-Like Camera.
You can check my photography @ Sinless Photography

But this Time again our big time sucker IE(Internet Explorer) showed his ugly face and delayed our work and entangled us in DOM herarchies.

IE Sucks it AGAIN.

cloneNode doesnt work for all elements in IE.
yes
cloneNode doesnt work for all elements in IE.

My Problem.
I wanted to upload an image form without submitting the original form (in page1).
What I wanted to do:
1. Created a hidden form outside original form.
2. Copy / Clone input (type = file) element from original form to hidden Form.
3. Submit hidden form via JavaScript and view output in a frame (in page1).

What I did:
1. var clonedFileObject = document.forms['originalForm'].fileElement.cloneNode(true);
( where fileElement is input type = file element)
2. document.hiddenForm.appendChild(clonedFileObject);
3. hiddenForm.submit();

And What Happened.
var clonedFileObject = document.forms['originalForm'].fileElement.cloneNode(true);
Above statement worked perfectly fine in Firefox but in IE nothing happened.
No cloning was done and on form submission / image upload button All I could see was empty $_FILES array with error code = 4.

What all I tried:
1. hiddenForm.fileElement.value = originalForm.fileElement.value // didnt in FF either
2. Created a outer div and copied innerHTML of first div to hiddenforms div // didnt worked for input type file (didnt wasted much time either...should have worked)
3. Finally I did a shabby Patch work in my code which i really hated but in the given time limit and set conditions this was only I could think of.
var OriginalFileObj = document.getElementById('fileElement');
//this will remove fileElement from Original Form

var clonedFileObj = OriginalFileObj;
document.hiddenForm.appendChild(OriginalFileObj);
document.hiddenForm.submit();
divObj.appendChild(OriginalFileObj); //restoring of original file object in original form
//if you dont do this there wont be any file object in original form


I am sure there would be other better ways to do the same.
If you are aware of it please add in comments so as others can benefit from you including me.

Wednesday, August 6, 2008

Mozilla Keyboard Shortcuts

As you start spending more and more time on Internet and Web Browsers, you will soon realise that you got to surf faster and faster. This is where Mozilla Shortcuts will help.



This is a list of keyboard shortcuts in Mozilla Firefox. If you have enabled Emacs-style text editing shortcuts in GNOME, they will also work in Firefox. When an Emacs text editing shortcut conflicts with the default shortcuts (as occurs with Ctrl+K), the Emacs shortcut will take preference if focus is inside a textbox (which would include the location bar and search bar). In such cases you should use the alternate keyboard shortcut if one is listed below.



CommandShortcut
Navigation
Back Alt+Left Arrow
Ctrl+[


ForwardAlt+Right Arrow
Ctrl+]


HomeAlt+Home
Open FileCtrl+O
ReloadF5
Ctrl +R

Reload (override cache)Ctrl+F5
Ctrl+Shift+R
StopEsc

Current Page
Go to Bottom of PageEnd
Go to Top of PageHome
Move to Next FrameF6
Move to Previous FrameShift+F6
Page InfoCtrl+I

Page SourceCtrl+U
PrintCtrl+P
Save Page AsCtrl+S

Text Size: DecreaseCtrl+-
Text Size: IncreaseCtrl++
Text Size: RestoreCtrl+0

Editing
CopyCtrl+C
CutCtrl+X
DeleteDelete

PasteCtrl+V
RedoCtrl+Shift+Z

Select AllCtrl+A
UndoCtrl+Z
Search
FindCtrl+F

Find AgainF3
Ctrl+G
Find As You Type Link'
Find As You Type Text/

Open search results in
new tab


Alt+Enter
Find PreviousShift+F3

Web SearchCtrl+K
Ctrl +J


Windows & Tabs
Close Tab Ctrl+W
Ctrl+F4

Close WindowCtrl+Shift+W
Alt+F4


Move Tab Left
(when tab is focused)
Ctrl+Left Arrow
Ctrl+Up Arrow
Move Tab Right
(when tab is focused)
Ctrl+Right Arrow
Ctrl+Down Arrow

Move Tab to Beginning
(when tab is focused)
Ctrl +Home
Move Tab to End
(when tab is focused)
Ctrl+End

New TabCtrl+T
New WindowCtrl+N
Next TabCtrl+Tab
Ctrl+Page Down

Open Address in New Tab
(from Location Bar or Search Bar)
Alt+Enter
Previous TabCtrl+Shift+Tab
Ctrl+Page Up

Undo Close TabCtrl+Shift+T
Select Tab (1 to 8)Alt+(1 to 8)

Select Last TabAlt+9
Tools
Bookmark All TabsCtrl+Shift+D

Bookmark This PageCtrl+D
BookmarksCtrl+B

Caret BrowsingF7
DownloadsCtrl+Y
HistoryCtrl+H

Clear Private DataCtrl+Shift+Del
Miscellaneous
Complete .com AddressCtrl+Enter

Complete .net AddressShift+Enter
Complete .org AddressCtrl+Shift+Enter
Delete Selected Autocomplete EntryDel

Full ScreenF11
Select Location BarAlt+D
F6
Ctrl+L
Select or Manage Search Engines
(when Search Bar is focused)
Alt+Up Arrow
Alt+Down Arrow
F4




Friday, March 21, 2008

Problems with JS for...in Loop

Sometimes on pleasant mornings when you have got all the reasons to smile your code breaks down suddenly and your Page contains errors n errors.
Similar thing happen to me recently.
My webpage was full of JS errors on one fine morning.
I just could understand why..... but again google came to my rescue.
I found this article.... about dangers of using for...in loop

The Problem

Try the following code on an empty page, one without any JavaScript libraries added:

var associative_array = new Array();
associative_array["one"] = "Lorem";
associative_array["two"] = "Ipsum";
associative_array["three"] = "dolor";
for (i in associative_array) { alert(i) };

You’ll get three sequential alert boxes: “one”; “two”; “three.” This code has a predictable output and looks logically sound: you’re declaring a new array, giving it three string keys, then iterating over them.

Now do this: replace “Array” with “RegExp” and run the code again. As if by magic, this also works! It’s not the only one. Try Boolean, or Date, or String, and you’ll find they all work as well. It works because all you’re doing is setting properties on an object (in JS, foo["bar"] is the same as foo.bar), and a for..in loop simply iterates over an object’s properties. All data types in JS are objects (or have object representations), so all of them can have arbitrary properties set.

In JavaScript, one really ought to use Object for a set of key/value pairs. But because Array works as demonstrated above, JavaScript arrays (which are meant to be numeric) are often used to hold key/value pairs. This is bad practice. Object should be used instead.

I’m not trying to ridicule or scold. This misconception is too common to attribute it to stupidity, and there are many legitimate reasons for the confusion. But this is something that needs to be cleared up if JavaScript is ever to be used on a grand scale.

If you need further evidence that Array is not meant to be used this way, consider:

  • There is no way to specify string keys in an array constructor.
  • There is no way to specify string keys in an array literal.
  • Array.length does not count them as items. In the above example, associative_array.length will return 0.
  • The page on Arrays in the Mozilla JavaScript reference makes no mention of this usage. (Nor does the ECMAScript specification, by the way, but you’ll have to do your own legwork to verify that, because I’m not linking to page 88 of a kajillion-page PDF.)

The History

This confusion has several other contributing factors:

  • In PHP, a language that many JavaScript users are also familiar with, numeric arrays and associative arrays are treated more or less identically. And since a set of key/value pairs goes by about eleven different names, depending on the language, this usage is quite often a result of unclear definitions of terms.
  • JavaScript is interpreted, not compiled, and many people have learned it by example. Thus a third-party script that uses Array improperly might rub off on its users.
  • JavaScript started with no specification, then received a poor specification, and I know few people who spend their free time reading specifications. Especially bad ones.
  • Because there is no formal construct for key/value pairs, JavaScript cannot distinguish between creating a hash and setting properties on an object. As we’ve demonstrated, any object can have arbitrary properties, and a for..in loop simply iterates over each of these properties, so the code above is not explicitly incorrect.
  • The harmful side effects of using Array for key/value pairs are not experienced unless Array.prototype is extended. Since this is an underutilized feature of JavaScript, it hasn’t been done on a large scale until rather recently.

Why Prototype “breaks” this usage

Concurrent with Prototype’s rise in popularity have been various blog posts complaining that the JavaScript framework “breaks” associative arrays — i.e. Arrays with string keys. It “breaks” them because it adds a handful of useful methods for working with arrays to Array.prototype, and these methods are also iterated over in a for..in loop. This means that when Prototype is included on a page the code above will loop 35 times instead of the original three.

Prototype also extends String with some methods for dealing with strings. If you try to use String as an associative array, your code will loop 20 times instead of three.

I am aware of the mitigating factors — hell, I just enumerated them — but complaining that Prototype “breaks” your ability to use Array as a hash is like complaining that Prototype “breaks” your ability to use String as a hash. It is not Prototype’s fault that JavaScript does not deter this improper use, and it certainly does not mean that Prototype does not “play well with others.” You are free to reject Prototype and keep using Array improperly, but then you give up your right to bitch and moan.

Actually, we’ve been here before: before version 1.4, Prototype added a couple methods onto Object.prototype, meaning that Object couldn’t even be used in the manner I describe, and a bunch of people rightly took Sam Stephenson to task for it. Object.prototype is verboten. Since version 1.4, however, this is no longer an issue, and therefore there is no longer an excuse.

So I will say it again: Array is not meant to be used for key/value pairs. Luckily, there is a dead-simple way to fix this. In the above example, you need only change Array to Object. (Or, if you’re using literal syntax, change [] to {}.) There. Your wrong code is no longer wrong, and it took only a little more work than a simple find-and-replace.

There are plenty of JavaScript frameworks to choose from, and many of them are excellent. I use Prototype because it works for me, and I do not take it personally when other people decide they don’t like it. But I believe Prototype deserves to be hated on its merits, dammit, not because it makes wrong code stop working — especially when the wrong code can be made right in ten seconds.

Thursday, January 24, 2008

The Guru's

This image is posted here coz all these Guru's (Father's) have influenced me in some point of time.

Wednesday, December 19, 2007

PHP filters

Gone are days of writing a validation class for vaildating different user inputs.
Gone are days of writing secure functions for validating URL, email address,etc.
In october 2005, first version of Filter package was released by PECL and within 1 year and 5 more releases PECL released final version 0.11 of Filter pack
age.

You can download filter package from here http://pecl.php.net/package/filter.
All you need is Php5.0 or higher and PEAR installer.
Installation steps are simple just write this in your console
$ pecl install filter

Usage Documentation.
Although filter functions are documented in php.net (http://in.php.net/filter), I find these documentation incomplete.
While doing some googling I found a good link which described different usages of Filter functions in a simple manner.
The Link is : http://phpro.org/tutorials/Filtering-Data-with-PHP.html

I won't provide you with entire usage as it would be a waste of time when I already have good link doing the same for me.
I will only provide a snapshot to show you the power of PHP filters

Filter IP Address

Following on from validation of URLs, we often find we need to validate an IP Address. Of course, and IP address may be of different formats for ipv4 and ipv6. An IP address may also need to be within a range of private or reserved ranges. The filter extension makes it possible to discern these differences and to validate an IP address to fit most needs. In its simplest form the validation of a url will look like this.



/*** an IP address ***/
$ip = "192.168.0.1";

if(
filter_var($ip, FILTER_VALIDATE_IP) === FALSE)
{
echo
"$ip is not a valid IP";
}
else
{
echo
"$ip is valid";
}
?>

As we have supplied the above with a valid IP address it validates and all is well. But now we may wish to validate an IPV6 address or an address with a private range. The IP filter has several flag with which to validate an IP address with. Listed here.

  • FILTER_FLAG_IPV4
  • FILTER_FLAG_IPV6
  • FILTER_FLAG_NO_PRIV_RANGE
  • FILTER_FLAG_NO_RES_RANGE

Starting at the top we will check to see if an IP is a valid IPV4 address.



/*** an IP address ***/
$ip = "192.168.0";

/*** try to validate as IPV4 address ***/
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) === FALSE)
{
echo
"$ip is not a valid IP";
}
else
{
echo
"$ip is valid";
}
?>

In the above example the IP address has failed to validate as it is not a complete IPV4 address. It would need to be of the form of the example that preceded it, 192.168.0.1 to validate. This is fine, but growth of the net has seen us run out of IPV4 addresses and so we need to validate against IPV6 addresses also.


Please visit the above link, read carefully and start saving time by using the above

Friday, November 16, 2007

Checking Apache Runtime Status

mod_status provides information on your apache server activity and performance.
This tutorial will show you how to enable this feature in such a way that only requested issued from localhost will be accepted and served.

Setting mod_status up

By default, server status report is commented so you can not access it. To enable it, you need to uncomment from /etc/apache2/apache2.conf or /usr/local/apache/conf/httpd.conf :


SetHandler server-status
Order deny,allow
Deny from all
Allow from .your_domain.com

This is a default setting, and will not work out of the box. What is said here is: server status will be acessible at location http://servername/server-status, access will be denied to everybody but people connecting from domain your_domain.com and any sub-domain from your_domain.com.

We want the server status to be provided only to people connected directly from the host running the apache server. Therefore we are going to deny access to /server-status to everybody except for people connecting from localhost, in the end the setting will look like:


SetHandler server-status
Order deny,allow
Deny from all
Allow from 127.0.0.1

Note: You could be using localhost instead of 127.0.0.1, but keep in mind that if the directive HostnameLookups is turned to Off, apache won't let you access to http://localhost/server-status .

OK, now that everything is set up, check that there is no error in your configuration by using:

$apache2ctl -t or $ /usr/local/apache/bin/apachectl configtest

if everything is fine, reload apache2 configuration with:

$sudo /etc/init.d/apache2 reload or $ /usr/local/apache/bin/apachectl restart

Accessing Apache Status

To access apache status and activity, you need to request the page http://localhost/server-status, you could use text mode navigators such as elinks or links in order to connect through a console using ssh.

Now, you can access information such as server start time, server uptime, number of requests being processed, number of slots available .... The different keys are explained just under the server activity.
A neat feature of server-status is the ability to refresh every X seconds, in order to get up-to-date activity, by calling:

elinks http://localhost/server-status?refresh=2

In the previous example, the status will be updated every 2 seconds.

Getting more from Apache Server-status

If you want to get more information from your server activity, you can add the directive:

ExtendedStatus On

just above the directive. But keep in mind that this cannot be set on a per virtualhost basis and will use more resources.
But in another hand, you will be able to access more informations such as:
  • Total accesses
  • CPU usage
  • number of requests/sec, Bytes/sec and Bytes/request
  • See the different clients connected to your server, on which virtual host as well as the page there are requesting, you can even access the time it took to request a specific page as well as the resources required.

References : http://www.debuntu.org/apache-activity-performance-mod_status

Thursday, November 15, 2007

Web Developers Link Farm

Recently I found this cool link [ http://www.devlisting.com/ ] which displays all useful links that can be referred during Web Development. Its a resourceful link farm.
Some of the link categories of this farm contains are listed below:
  • Ajax
  • Firefox Plugins
  • Ruby
  • Traffic / SEO
  • Flash
  • Asp.net
  • Design

Go here http://www.devlisting.com/

Friday, October 26, 2007

Steps to Improve Front End

  1. With reference to my last post that Front End Performance are more important than Back End performance I have finally managed to find a nice descriptive article stating how to exactly achieve it.
The below are some of the common steps taken at Yahoo to improve performance of Yahoo Products.
All the points are covered in this link http://developer.yahoo.com/performance/rules.html


  1. The Importance of Front-End Performance
  1. Make Fewer HTTP Requests
  2. Use a Content Delivery Network
  3. Add an Expires Header
  4. Gzip Components
  5. Put Stylesheets at the Top
  6. Put Scripts at the Bottom
  7. Avoid CSS Expressions
  8. Make JavaScript and CSS External
  9. Reduce DNS Lookups
  10. Minify JavaScript
  11. Avoid Redirects
  12. Remove Duplicate Scripts
  13. Configure ETags
  14. Make Ajax Cacheable

In addition to these Yahoo also provides developers with their custom FireFox extension which finds out what components of your page are slow and what can be done for improvement.
download Page :
http://developer.yahoo.com/yslow/
https://addons.mozilla.org/en-US/firefox/addon/5369

Wednesday, October 24, 2007

Reduce your page load time

Ever wondered why your page loads slowly even when your database queries execute at lightning speed.
Ever wondered why Super sites like Yahoo, AOL, etc load faster than your site.

If you are still wondering than this small article and the link mentioned at the bottom may help you reduce your page load time.

In any optimization effort it's critical to profile current performance to identify where the greatest improvement can be made. It's clear that the place to focus for fast web pages is the front end:

1. There is more potential for improvement by focusing on the front end. Making the back-end twice as fast reduces response times by 5-10%, whereas making the front end twice as fast saves 40-45%.
2. Front end improvements typically require less time and resources than back-end performance projects.
3. Focusing on front end improvements has proven to work. Over fifty teams at Yahoo! have reduced their end-user response times by following the best practices described here.

As web applications evolve to contain more functionality and content, these best practices are expected to have an even bigger impact.

Results Php Benchmark tests:
http://www.php.lt/benchmark/phpbench.php

The above link serves only the programming aspect of PHP.
There is still lot of improvement you can do in JavaScript and DOM.
So keep googling you might end up with what you exactly want.

Friday, August 31, 2007

Send Header without error

One of the common errors a web developer often gets is "Headers already sent" error.This happens when we render some text/characters /space in the browser and then try to redirect the page using header function of php.
For long I always thought that header function will only work when there is nothing rendered before the header call.
But recently I discovered(ofcorse with help of google) that we can render anything before the header call and still redirect the page.

Normal Usage with error is


echo "This will give error"
header("location:http://www.yahoo.com");


echo "This will NOT give error";
header("refresh:0; url:http://www.yahoo.com");


Here refresh:0 means the page will load after 0 seconds(which is instantly).
Basically this can be used when we want to have delay the page loading say we want to load yahoo after 2 seconds.
In this case the code will be


header("refresh:2; url:http://www.yahoo.com");




So start using this header call and redirect the page anytime during page execution.

Saturday, August 18, 2007

Store procedure usage in PHP

Stored routines (procedures and functions) are supported in MySQL 5.1. A stored procedure is a set of SQL statements that can be stored in the server. Once this has been done, clients don't need to keep reissuing the individual statements but can refer to the stored procedure instead.

A stored routine is either a procedure . Stored routines are created with CREATE PROCEDURE statements. A procedure is invoked using a CALL statement, and can only pass back values using output variables. Stored routines may call other stored routines.
A stored procedure or function is associated with a particular database.

Procedures can be created using CREATE PROCEDURE command of mysql.
To know the exact syntax visit Online MySql documentation.

Once the procedure is created we have to use it in php code for this PHP's mysqli extension allows you to access the functionality provided by MySQL 4.1 and above

In order to have these functions available, you must compile PHP with support for the mysqli extension(MySQL Improved Extension).

To install the mysqli extension for PHP, use the --with-mysqli=mysql_config_path/mysql_config configuration option where mysql_config_path represents the location of the mysql_config program that comes with MySQL versions greater than 4.1.

mysqli functions are similar to mysql functions, there is substitute for each mysql functions in mysqli.
For e.g.

mysqli_query() has to be used instead of mysql_query()

using mysqli_query() the stored procedure query can be called and its result can be fetched.

Note: if you have to use any of mysqli functions then you will have to use mysqli functions throughout the current mysql connection
i.e. from mysqli_connect() to mysqli_close() all intermediate functions used must be of mysqli and not mysql.

references:

http://in.php.net/
http://dev.mysql.com/doc/refman/5.1/en/

Thursday, August 9, 2007

Control Flow Functions of MySQL

While doing web programming many times you fetch data from database and depending on the value fetched, the user is shown something or other.
In case of optional fields in table it is quite likely that the value may be NULL or something default that you have set.
Take for example and option field called product awards which lists all awards bagged by that product.

When you write query
SELECT pro_id, pro_awards FROM products

This will give info regarding all the awards bagged by products.
However since pro_awards is optional many records will contain value NULL.

To tackle this NULL value you check in php whether the fetched value is NULL, if yes you display "No awards bagged by this product".

You can also do this checking at database level to reduce some load on webserver.
And as Databases are configured at their optimum level the processing time is much faster than your php / any script.

This can be done this way:
SELECT pro_id, IF(pro_awards IS NULL,'No awards bagged by this product', pro_awards) as pro_awards
FROM products
Above was use of if-else construct in MySQL

You can also make use of Switch-case construct effectively.
SELECT pro_id, CASE WHEN pro_awards IS NULL THEN No awards bagged by this product' ELSE pro_awards END FROM products

Above examples are very simple to understand, I am sure you can come out with difficult situations and use these Control flow functions of MySQL effectively to reduce script execution time.

references: http://dev.mysql.com/doc/refman/4.1/en/control-flow-functions.html

Saturday, July 14, 2007

Backward Incompatible Changes

Although most existing PHP 4 code should work without changes in PHP5, you should pay attention to the following backward incompatible changes:

  • There are some new reserved keywords.
  • strrpos() and strripos() now use the entire string as a needle.
  • Illegal use of string offsets causes E_ERROR instead of E_WARNING. An example illegal use is: $str = 'abc'; unset($str[0]);.
  • array_merge() was changed to accept only arrays. If a non-array variable is passed, a E_WARNING will be thrown for every such parameter. Be careful because your code may start emitting E_WARNING out of the blue.
  • PATH_TRANSLATED server variable is no longer set implicitly under Apache2 SAPI in contrast to the situation in PHP 4, where it is set to the same value as the SCRIPT_FILENAME server variable when it is not populated by Apache. This change was made to comply with the » CGI specification. Please refer to » bug #23610 for further information, and see also the $_SERVER['PATH_TRANSLATED'] description in the manual. This issue also affects PHP versions >= 4.3.2.
  • The T_ML_COMMENT constant is no longer defined by the Tokenizer extension. If error_reporting is set to E_ALL, PHP will generate a notice. Although the T_ML_COMMENT was never used at all, it was defined in PHP 4. In both PHP 4 and PHP 5 // and /* */ are resolved as the T_COMMENT constant. However the PHPDoc style comments /** */, which starting PHP 5 are parsed by PHP, are recognized as T_DOC_COMMENT.
  • $_SERVER should be populated with argc and argv if variables_order includes "S". If you have specifically configured your system to not create $_SERVER, then of course it shouldn't be there. The change was to always make argc and argv available in the CLI version regardless of the variables_order setting. As in, the CLI version will now always populate the global $argc and $argv variables.
  • An object with no properties is no longer considered "empty".
  • In some cases classes must be declared before use. It only happens if some of the new features of PHP 5 (such as interfaces) are used. Otherwise the behaviour is the old.

§ get_class(), get_parent_class() and get_class_methods() now return the name of the classes/methods as they were declared (case-sensitive) which may lead to problems in older scripts that rely on the previous behaviour (the class/method name was always returned lowercased). A possible solution is to search for those functions in all your scripts and use strtolower().

This case sensitivity change also applies to the magical predefined constants __CLASS__, __METHOD__, and __FUNCTION__. The values are returned exactly as they're declared (case-sensitive).

  • ip2long() now returns FALSE when an invalid IP address is passed as argument to the function, and no longer -1.
  • If there are functions defined in the included file, they can be used in the main file independent if they are before return() or after. If the file is included twice, PHP 5 issues fatal error because functions were already declared, while PHP 4 doesn't complain about it. It is recommended to use include_once() instead of checking if the file was already included and conditionally return inside the included file.
  • include_once() and require_once() first normalize the path of included file on Windows so that including A.php and a.php include the file just once.

Reference: http://www.php.net/manual/en/migration5.incompatible.php