For as long as he could remember, one Millan C's clients had always bragged about having their very own, in-house PHP Guru. "You could really learn something from this guy," they would often tell him, "he's brilliant, you know! And a guru!" Not being a particularly big fan of PHP, nor really interested in meeting the guru, Millan always put it off for "some day."
One day, however, it was pretty clear that "some day" would never happen, as the guru left for greener pastures. "It couldn't have been worse timing," Millan's client said frantically, "our website's traffic exploded, and everything is slowing to a crawl! The guru's consulting rate is just too high for us... can you fix it?"
Since he knew his way around PHP, Millan agreed, and opened up the website's code. The first thing he saw was the following function declaration.
/******************************************************************
FUNCTION NAME: saveForm
PARAMETER(S): 1st = how many fields to skip at the start
2nd = how many fields to skip at the end
3rd = tablename to save info into
4th = array of items to check for duplicate
entries if needed
RETURNS: returns either an error or success message
******************************************************************/
function saveForm($a,$b,$c,$d,$e){
....
}
Note that the guru left the definition of the 5th parameter ($e) as an exercise for his successor. In fact, the entire "library" of 46 functions used to process form contents has arguments like this:
function checkLogin($a,$b,$c,$d,$e){ ... }
And naturally, this code lead towards such obvious and clear constructions as follows.
$sql = "SELECT * FROM ".$c.
" WHERE ".$d." = '".$a.
"' AND ".$e." = '" .$b."'";
You following along? That's where $d = $a and $e = $b! Few things are more of a pleasure to debug. Nevermind the SQL Injection.
But the good news was that the guru managed to put an "INDEX" at the header of each of his files. You're familiar with those, right? In case your search command is broken, it tells you what line numbers each of the functions are on.
/******************************************************************
INDEX: showStates ln 68
showCountries ln 102
validateForm ln 132
saveForm ln 179
resetPassword ln 240
checkLogin ln 266
logout ln 297
subscribe ln 308
[etc...]
******************************************************************/
Of course, the INDEX was hopelessly out of date. In the end, Millan advised his client to either pay for a rewrite or pay the guru's rate.