Jump to content

Greywacke

Members
  • Posts

    510
  • Joined

  • Last visited

Everything posted by Greywacke

  1. ok have created a test.php as follows, here: <?phpinclude("/home/dwtphovu/public_html/intellisource.co.za/prod_5683194816/includes/content/dwtphovu_f3rr37y.php");function getsiblings($children,$j = 0,$level = 0) { echo " <binds level=\"1\">\n"; for ($i = $j; $i < count($children); $i++) { global $conn; $sql = "SELECT * FROM 1_regions WHERE bigint_ParentRegionID = (SELECT bigint_ParentRegionID FROM 1_regions WHERE bigint_RegionID = ".$children[$i].") ORDER BY text_RegionDescription ASC;"; $result = mysql_query_errors($sql , $conn , __FILE__ , __LINE__ , false); if ($result) { while ($row = mysql_fetch_array($result)) { $selected = ""; if ($children[$i] == $row["bigint_RegionID"] && $i == count($children) - 1) $selected = "selected=\"selected\" "; echo " <bind name=\"".xmlentities($row["text_RegionDescription"])."\" value=\"".$row["bigint_RegionID"]."\" level=\"".$level."\" ".$selected."/>\n"; if ($children[$i] == $row["bigint_RegionID"]) getsiblings($children,$i,$level+1); } mysql_free_result($result); } } echo " </binds>\n";}header("Content-type: text/plain; charset=utf-8");$rz = array(100,2,102020,99501);getsiblings($rz);?> just the function and the array, but i still get the following: without any errors being logged! the functions called exist in the include, and there is nothing wrong with them - they work perfectly in other places they are called... :/
  2. afraid i do not see an issue with this function - it's basically just to convert some invalid xml characters to numeric character references, due to files reverting to ascii from utf-8 from time to time on the server - htmlentities could not be used (not valid entities for xml). function xmlentities($value) { // replace characters if (is_array($value)) { foreach ($value as $key => $val) { $value[$key] = xmlentities($val); } } else { //replace $value's invalid xml characters with entities and unicode characters // used with Hex NCR's (Hexadecimal Numeric Character Representations). $patterns = array( '&', // ampersand symbol '<', // less than symbol '>', // greater than symbol '"', // double quotation mark '©', // © copyright symbols 'ë', // e with diaresis 'è', // e with grave 'é', // e with acute '"', // left slanting double quotation mark '"' // right slanting double quotation mark ); $replacements = array( '&', '<', '>', '"', '©', 'ë', 'è', 'é', '“', '”' ); $value = utf8_encode($value); // convert string to unicode to replace characters $value = str_replace($patterns, $replacements, $value); } return $value;} is there perhaps some "rule" against calling a recursive function from within another recursive function?
  3. i was referring to the function getparents, which works 100% as expected. the problem is with the second function, getsiblings because it processes fine if i comment that function's call, thus there seems to be something wrong with the getsiblings function. the reason i say there is nothing wrong with the call of mysql_query_errors, is because it is called exactly as it is in the function that is working now (getparents).i will attempt this towards finding a solution for the problem, thanks for the advise - i REALLY hope it helps me find the problem!
  4. okay, still on the getsiblings function - currently as follows: function getsiblings($children,$j = 0,$level = 0) { echo " <binds level=\"1\">\n"; for ($i = $j; $i < count($children); $i++) { global $conn; $sql = "SELECT * FROM 1_regions WHERE bigint_ParentRegionID = (SELECT bigint_ParentRegionID FROM 1_regions WHERE bigint_RegionID = ".$children[$i].") ORDER BY text_RegionDescription ASC;"; $result = mysql_query_errors($sql , $conn , __FILE__ , __LINE__ , false); if ($result) { while ($row = mysql_fetch_array($result)) { $selected = ""; if ($children[$i] == $row["bigint_RegionID"] && $i == count($children) - 1) $selected = "selected=\"selected\" "; echo " <bind name=\"".xmlentities($row["text_RegionDescription"])."\" value=\"".$row["bigint_RegionID"]."\" level=\"".$level."\" ".$selected."/>\n"; if ($children[$i] == $row["bigint_RegionID"]) getsiblings($children,$i,($level+1)); } mysql_free_result($result); } } echo " </binds>\n";} this function still generates an internal server error (http 500), without generating error logs despite those lines of code in the global include! :)i'm really at wits end here *sighs* :/
  5. well, i do more or less this within the mysql_query_errors function, but why can i not pass an empty/undefined variable to this function here, when it has been done 10,000 times in other functions - especially noted getparents, which works as expected now, without defining $conn as the global variable, outside of the function? the error is obviously before i am doing the mysql query in the function.and this is what the mysql_query_errors function looks like: function mysql_query_errors($sql, $conn, $doc, $line, $expret = false) { $line--; $err = ""; [b]if (!$conn) $conn = $GLOBALS["conn"];[/b] $result = mysql_query($sql,$conn); if (mysql_errno() > 0) { $err = "ERROR #".mysql_errno().": ".mysql_error()." in ".$doc." on Line ".$line; } elseif ($expret) { if (is_null($result)) { $err = "NOTICE #0504: A null value was returned by the query defined in ".$doc." on line ".$line--; } elseif ($result === false) { $err = "NOTICE #0502: A false value was returned by the query defined in ".$doc." on line ".$line--; } elseif ($result === true) { $err = "NOTICE #0501: A true value was returned by the query defined in ".$doc." on line ".$line--; } elseif (mysql_num_rows($result) < 1) { $err = "NOTICE #0500: An empty result set was returned by the query defined in ".$doc." on line ".$line--; } array_push($GLOBALS["sql"],$sql."\n",$err."\n"); } return $result;} in short - why would this have to be specified here and not in the other functions?
  6. wonderful! and it works!!! but only problem now is the getsiblings recursive function which is throwing an error :/ this is what getsiblings looks like:function getsiblings($children,$j = 0,$level = 0) { echo " <binds level=\"1\">\n"; for ($i = $j; $i < count($children); $i++) { $sql = "SELECT * FROM 1_regions WHERE bigint_ParentRegionID = (SELECT bigint_ParentRegionID FROM 1_regions WHERE bigint_RegionID = ".$children[$i].") ORDER BY text_RegionDescription ASC;"; $result = mysql_query_errors($sql , $conn , __FILE__ , __LINE__ , true); if ($result) { while ($row = mysql_fetch_array($result)) { echo " <bind name=\"".xmlentities($row["text_RegionDescription"])."\" value=\"".$row["bigint_RegionID"]."\" level=\"". $level."\" ".((($children[$i] == $row["bigint_RegionID"]) && ($i == count($children) - 1))?"selected=\"selected\" ":"")."/>\n"; if ($children[$i] == $row["bigint_RegionID"]) getsiblings($children,$i,$level + 1); } mysql_free_result($result); } } echo " </binds>\n";} weird in that it doesn't send a blank/undefined $conn through - it does however, accept it and use the default connection if not valid - the way mysql_query_errors was coded. for some reason it is processing getparents without any incident!also - surely a recursive function does not have to return a value?
  7. yeah try to do that as follows - and it returns an http 500 internal server error again... :/ function getparents($child,$array = array()) { if ($child == 0) { return array_reverse($array); } else { array_push($array,$child); $sql = "SELECT bigint_ParentRegionID FROM 1_regions WHERE bigint_RegionID = ".$child.";"; $result = mysql_query_errors($sql , $conn , __FILE__ , __LINE__ , true); if ($result) { if ($row = mysql_fetch_array($result)) { $return = getparents($row["bigint_ParentRegionID"],$array); } mysql_free_result($result); } } return $return;}
  8. yes, what i do not see is how to return as one array... even if returning the single values with each step. hang on - if i return the id in each step - and add the calling function to the array with each step.... thing is this is not a multitier list it is single tier, with about 4 levels to be returned as an array.
  9. ok, the http 500 error is gone now - but the functions don't return the array, despite passing it as parameter to itsself.i've realised this is due to the function not being written to do what i need it to do. the function is currently as follows, followed by how they are called, and finally the traversed database resultset format: function getparents($child,$array = array()) { if ($child == 0) { return array_reverse($array); } else { array_push($array,$child); $sql = "SELECT bigint_ParentRegionID FROM 1_regions WHERE bigint_RegionID = ".$child.";"; $result = mysql_query_errors($sql , $conn , __FILE__ , __LINE__ , true); if ($result) { if ($row = mysql_fetch_array($result)) { getparents($row["bigint_ParentRegionID"],$array); } mysql_free_result($result); } }}$r = $_GET["r"];$rz = getparents($r);print_r($rz);getsiblings($rz);[b]bigint_RegionID text_RegionDescription bigint_ParentRegionID[/b]100 United States of America 02 Alaska 100102020 Anchorage 299501 Anchorage 102020 unfortunately i am not seeing how the getparents function needs to be modified in order to return an array of region id's, eg $rz = Array(99501, 102020, 2, 100); - stepping through the ancestors recursively till it reaches a top level ancestor (with parent id of 0)... :)this array needs to be passed to the getsiblings function in order to write the xml list of ancestors and their siblings.clearly - recursive functions are not my strong point yet.
  10. it's almost as if the php generated xml documents are being cached somewhere on a proxy! i am at wits end again :/it's ignoring the custom php errors and location as if it was not written at all! it still displays the http 500 error , despite the document requested being repaired... i refer to the previous post with more urgency.
  11. i've repaired these discrepancies that caused the http 500 errors (by referring to $conn from the $GLOBALS namespace), but now - even after clearing cache and refreshing, it still gets the error!sadly though, even with the custom error logging code - it does not log the errors!
  12. hmmm strange though... 0o the error in the log is: however, getparents is called and $conn exists, but within the iteration of the second function getsiblings that variable is not accessable! 0o :)what would have to change in order to make it so?here is the typical mysql_query_errors function call used from within countless functions: $sql = "SHOW COLUMNS FROM 19_consumers;"; $result = mysql_query_errors($sql , $conn , __FILE__ , __LINE__ , false); it works from within countless other functions... how does the scope of this $conn variable change? not too clear on that i am afraid - and how to remedy in this situation?
  13. thanks might be just the edge my php apps need
  14. in my opinion the only real difference between ASP and PHP, above the obvious differences in object model - is that one is commercial and the other is free. i believe strongly that one can do whatever you wish to in either environment - the determining factor would of course be the availability of capital funds for the venture.
  15. Greywacke

    [UPLOAD] dll

    i guess one can check that it was in fact a valid DLL by checking with PHP for the various commonalities between DLL files only - and displaying an error if not a valid DLL. Not specifically sure how, but it is with this approach that i would get to work in this situation
  16. as far as i am aware, what you need to do is emulate a client form submittal to the domain - then send it via ssl to the domain you mentioned. that would mean that domain would have to have the ssl certificate installed correctly.
  17. hi again,i've traced the HTTP 500 error on this page, to the getsiblings function in the ajax_config.php xml generator. // ... some irrelevant lines of codefunction getsiblings($children,$j = 0,$level = 0) { echo " <binds level=\"1\">\n"; for ($i = $j; $i < count($children); $i++) { $sql = "SELECT * FROM 1_regions WHERE bigint_ParentRegionID = (SELECT bigint_ParentRegionID FROM 1_regions WHERE bigint_RegionID = ".$children[$i].") ORDER BY text_RegionDescription ASC;"; $result = mysql_query_errors($sql , $conn , __FILE__ , __LINE__ , false); if ($result) { while ($row = mysql_fetch_array($result)) { echo " <bind name=\"".xmlentities($row["text_RegionDescription"])."\" value=\"".$row["bigint_RegionID"]."\" level=\"". $level."\" ".((($children[$i] == $row["bigint_RegionID"]) && ($i == count($children) - 1))?"selected=\"selected\" ":"")."/>\n"; if ($children[$i] == $row["bigint_RegionID"]) getsiblings($children,$i,$level + 1); } } } echo " </binds>\n";}function getparents($child,$array = array()) { if ($child == 0) { //print_r(array_reverse($array)); getsiblings(array_reverse($array),0,0); } else { array_push($array,$child); $sql = "SELECT bigint_ParentRegionID FROM 1_regions WHERE bigint_RegionID = ".$child.";"; $result = mysql_query_errors($sql , $conn , __FILE__ , __LINE__ , false); if ($result) { if ($row = mysql_fetch_array($result)) { getparents($row["bigint_ParentRegionID"],$array); } } }}// ... some more irrelevant lines of codeswitch ($q) {// ... some more irrelevant lines of code case 29: // return cascaded regions $rid = $_GET["r"]; //echo $rid; getparents($rid); break;// some more irrelevant lines of code the getsiblings function is passed the following ordered array of region id's, retrieved by a previous function to collect the selected parent id's. Array( [0] => 100 [1] => 2 [2] => 102020 [3] => 99501) it would obviously start stepping through this array at element 0, which is the id for United States of America (a country). the next one, id 2 is the id for the state of Alaska. the next is the county, Anchorage - and the last is the zipcode 99501 in the city of Anchorage. testing these mysql queries - it successfully executes in phpmyadmin. the purpose of this code, is to do a reverse lookup of the regions, building a list to select a region programmatically, that is bound on various parts of the site to another group of information, for example supplier regions. can anyone perhaps see what is triggering this HTTP 500 error? i cannot seem to locate a valid error log via ftp... ... noted a discrepancy in passing $level variables to the xml output - as been corrected in this post as well as the code. still getting the HTTP 500 error :/
  18. haha! success at last! this issue is now RESOLVED!!! :)3 layers, top layer only got loading movieclip labelled loader_mc and the actionscript below.first and second layers only have diff colored rectangles over each other as borders. import flash.events.Event;import flash.net.URLLoader;import flash.net.URLRequest;import flash.display.Loader;import flash.utils.Timer;import flash.events.TimerEvent;import flash.display.Sprite;import flash.display.Bitmap;import flash.display.BitmapData;import fl.transitions.Tween;var imagesXML:XML;var xmlLoader:URLLoader = new URLLoader();var imageLoader:Array = new Array();var imageHolder:Array = new Array();var alphaTween:Array = new Array();var imageTimer:Timer;var path:Array = new Array();var delay:uint;var tween:Number;var n:uint=0;var d:uint=0;var o:uint=0;xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded);xmlLoader.load(new URLRequest("http://www.ptbh.co.za/swf/img.xml"));function xmlLoaded(e:Event):void { imagesXML = new XML(xmlLoader.data); imageLoader[d] = new Loader(); imageLoader[d].contentLoaderInfo.addEventListener(Event.COMPLETE, showImage); trace((n+1) + " images detected"); for (var i:uint = 0; i < imagesXML.pic.length(); i++) { path[i] = imagesXML.pic[i].@path; trace(path[i] + " noted"); } imageLoader[d].load(new URLRequest(path[d])); delay = uint(imagesXML.delay[0].@display); tween = Number(imagesXML.delay[0].@tween);}function showImage(e:Event):void { //this.contentLoaderInfo.removeEventListener(Event.COMPLETE, showImage); var tempBitmap:Bitmap = e.target.content; var tempBitmapData:BitmapData = tempBitmap.bitmapData; imageHolder[d] = new Sprite(); var loadBitmap:Bitmap = new Bitmap(tempBitmapData); imageHolder[d].addChild(loadBitmap); addChild(imageHolder[d]); imageHolder[d].x = 13; imageHolder[d].y = 0; setChildIndex(imageHolder[d],2); imageHolder[d].visible = false; trace(path[d] + " downloaded"); d++; if (d < path.length) { imageLoader[d] = new Loader(); imageLoader[d].contentLoaderInfo.addEventListener(Event.COMPLETE, showImage); imageLoader[d].load(new URLRequest(path[d])); } else { loader_mc.visible = false; imageTimer = new Timer(delay); trace(delay + " millisecond timer created"); imageTimer.addEventListener(TimerEvent.TIMER, nextImage); nextImage(); }}function nextImage(e:TimerEvent = null):void { imageTimer.stop(); imageHolder[n].visible = true; imageHolder[n].alpha = 0; if (n!=o) { setChildIndex(imageHolder[o],3); var t = setTimeout(hideHolder,tween,o); } setChildIndex(imageHolder[n],4); alphaTween[n] = new Tween(imageHolder[n],"alpha",null,0,1,tween/1000,true); o = n; if (n < imageHolder.length - 1) { n++; } else { n = 0; } imageTimer.start();}function hideHolder( { imageHolder[b].visible = false;}
  19. hi there, the lines in question are marked in bold (these lines are commented at the moment otherwise it does some unexpected tweening and only on the first sprite!). i need to let the images fade in over the last one: import flash.events.Event;import flash.net.URLLoader;import flash.net.URLRequest;import flash.display.Loader;import flash.utils.Timer;import flash.events.TimerEvent;import flash.display.Sprite;import flash.display.Bitmap;import flash.display.BitmapData;import fl.transitions.Tween;var imagesXML:XML;var xmlLoader:URLLoader = new URLLoader();var imageLoader:Array = new Array();var imageHolder:Array = new Array();[b]var alphaTween:Array = new Array();[/b]var imageTimer:Timer;var path:Array = new Array();var delay:uint;var tween:Number;var n:uint=0;var d:uint=0;var o:uint=0;xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded);xmlLoader.load(new URLRequest("http://www.ptbh.co.za/swf/img.xml"));function xmlLoaded(e:Event):void { imagesXML = new XML(xmlLoader.data); imageLoader[d] = new Loader(); imageLoader[d].contentLoaderInfo.addEventListener(Event.COMPLETE, showImage); trace((n+1) + " images detected"); for (var i:uint = 0; i < imagesXML.pic.length(); i++) { path[i] = imagesXML.pic[i].@path; trace(path[i] + " noted"); } imageLoader[d].load(new URLRequest(path[d])); delay = uint(imagesXML.delay[0].@display); tween = uint(imagesXML.delay[0].@tween)/1000;}function showImage(e:Event):void { //this.contentLoaderInfo.removeEventListener(Event.COMPLETE, showImage); var tempBitmap:Bitmap = e.target.content; var tempBitmapData:BitmapData = tempBitmap.bitmapData; imageHolder[d] = new Sprite(); var loadBitmap:Bitmap = new Bitmap(tempBitmapData); imageHolder[d].addChild(loadBitmap); addChild(imageHolder[d]); imageHolder[d].x = 13; imageHolder[d].y = 0; setChildIndex(imageHolder[d],2); imageHolder[d].visible = false; trace(path[d] + " downloaded"); d++; if (d < path.length) { imageLoader[d] = new Loader(); imageLoader[d].contentLoaderInfo.addEventListener(Event.COMPLETE, showImage); imageLoader[d].load(new URLRequest(path[d])); } else { loader_mc.visible = false; imageTimer = new Timer(delay); trace(delay + " millisecond timer created"); imageTimer.addEventListener(TimerEvent.TIMER, nextImage); nextImage(); }}function nextImage(e:TimerEvent = null):void { imageTimer.stop(); for (var i:uint = 0; i < imageHolder.length; i++) { if (i == n) { imageHolder[n].visible = true; [b]imageHolder[n].alpha = 0; alphaTween[n] = new Tween(imageHolder[n],"alpha",null,0,1,tween,true);[/b] } else if (i != o) { imageHolder[i].visible = false; } } o = n; if (n < imageHolder.length) { n++; } else { n = 0; } imageTimer.start();} and here is a look at the xml document which sets the display time for the sprites, and the tween time to fade in, as well as the images: <pics> <delay display="4000" tween="1000"/> <pic path="http://www.ptbh.co.za/swf/000.jpg"/> <pic path="http://www.ptbh.co.za/swf/001.jpg"/> <pic path="http://www.ptbh.co.za/swf/002.jpg"/> <pic path="http://www.ptbh.co.za/swf/003.jpg"/> <pic path="http://www.ptbh.co.za/swf/004.jpg"/> <pic path="http://www.ptbh.co.za/swf/005.jpg"/> <pic path="http://www.ptbh.co.za/swf/006.jpg"/> <pic path="http://www.ptbh.co.za/swf/007.jpg"/> <pic path="http://www.ptbh.co.za/swf/008.jpg"/> <pic path="http://www.ptbh.co.za/swf/009.jpg"/> <pic path="http://www.ptbh.co.za/swf/010.jpg"/> <pic path="http://www.ptbh.co.za/swf/011.jpg"/> <pic path="http://www.ptbh.co.za/swf/012.jpg"/> <pic path="http://www.ptbh.co.za/swf/013.jpg"/> <pic path="http://www.ptbh.co.za/swf/014.jpg"/> <pic path="http://www.ptbh.co.za/swf/015.jpg"/></pics>
  20. yes it would seem so... but why? what needs to change in order to get it to work? :S
  21. okay, i created a test page to perform the same function, with expected results however. <?phpfunction newpost($key) { if (is_array($key)) { return newpost($key[1]); } if (strstr($key,'$')!==false) { $syskey = str_replace('$','',$key); return $GLOBALS[$syskey]; } else { if ($_POST[$key]=='') { return $GLOBALS['dynarr'][$key]; } else { return $_POST[$key]; } }}$dynarr = array( 'one'=>'111', 'two'=>'222', 'three'=>'33333', 'four'=>'4444', 'five'=>'5555' );$test = array( 'element one', 'element %two%', 'element %$three%', 'element %four%', 'element %$five%', );$three = 'blah!';$five = 'bleh!!'; $test = preg_replace_callback('/%([^%]+)%/',newpost,$test); print_r($test);?> and here is the result of this page: Array( [0] => element one [1] => element 222 [2] => element blah! [3] => element 4444 [4] => element bleh!!) in otherwords it works as expected! however the implemented one does not. the only difference between the two implementations are arrays of length 5 used here, and the $dynarray (instead of test) has a length of 32! in the live implementation, $dynarr is used to store variables to replace with if not a page variable, eg concatenated values. it is also the array that is replaced on. if a variable was not available at the time of the $dynarray creation - it inserts a % enclosed representation of the variable. these are what i need to replace! :/
  22. it gets sent an array of references to various strings to get, which it is then supposed to retrieve the value for either from the $GLOBALS array (a collection of page variables), $sysarr array (all the variable arrays) or $_POST array (posted data) by calling the newpost function, passing the individual array elements (which are variable names if detected between %'s.the matches from the search usually get passed by preg_replace_callback are usually sent as an array. i was attempting to print_r() this array of matches from within this function, but to no avail! :/preg_replace_callback runs the callback function, which gets sent an array with [0] the match and [1] the first bracket of the regular expression. one is supposed to return the replacement.
  23. woohooo!!! issue has now been RESOLVED :)success at last... hehe perseverance does pay off!!!
  24. it loads the first image and stops there, nonregard of the timer object to change them... View "Slideshow"but loads the other images a few times over in the background... why oh why will the sprites not swop visibility? 0o
  25. okay, will atempt this... however, in the other place where preg_replace_callback is used - the function name is passed like here 0obut i do not see how this would be different just because i am parsing an array instead of a string...unfortunately it is not finding anything - either the regular expression is not as it should be, or the $ in the array string elements might be messing it up somehow: // "late" $sysarr element population functionsfunction latepost($input) { print_r($input); foreach ($input as $in) { return newpost($in); }}function newpost($key) { if (strstr($key,"\$")!==false) { $syskey = str_replace("\$","",$key); return $GLOBALS[$syskey]; } else { if ($_POST[$key]=="") { return $GLOBALS["dynarr"][$key]; } else { return $_POST[$key]; } }}// attempted late variable population$sysarr = preg_replace_callback("/%([^%]+)%/","latepost",$sysarr);// print_r'd $sysarr AFTER preg_replace_callback :/Array( [service_id] => 1 [ZipCode] => 99501 [Name] => Pierre du Toit [City] => Anchorage, 99501 [Phone] => 072-915-4799 [County] => Anchorage [Email] => pierre@canopyxchange.za.net [state] => Alaska [iM] => Skype: greywacke_2k7 [Make] => GMC [Condition] => NEW [Model] => SIERRA3500 [Function] => Commercial Deluxe [Year] => 2007-LATEST [Product] => Aluminum [CabSize] => CREWCAB [Color] => COLORCODED [bedSize] => SHORTBOX [budget] => $1,750 plus [Comments] => testing dynamic handler - BLACK CAP [Fitment] => Not within next 3 months [$append] => [b]%$append%[/b] [$space] => [l360firstname] => Pierre du Toit ([b]%$append%[/b]) [$leadid] => [b]%$leadid%[/b] [$formname] => TruckCapXchange [l360makemodel] => GMC SIERRA3500 [l360other] => CREWCAB SHORTBOX Commercial Deluxe NEW [$hash] => # [l360leadid] => #[b]%$leadid%[/b] [$obracket] => ( [$cbracket] => )) note the sections of the array strings which were supposed to be replaced by the callbacks (demarkated in bold on the $sysarr array). the variables $leadid and $append are supposed to be replaxced by their $GLOBAL values - why do they not, despite referring to the function as a string! :S
×
×
  • Create New...