home *** CD-ROM | disk | FTP | other *** search
/ Chip 2005 November / CDVD1105.ISO / Software / Freeware / programare / sqlyog / SQLyog41.exe / SQLyogTunnel.php < prev    next >
PHP Script  |  2005-08-03  |  17KB  |  733 lines

  1. <?php
  2.  
  3. /*
  4.     SQLyog v4.0
  5.     Copyright 2003-2004, Webyog
  6.     http://www.webyog.com    
  7.     
  8.     HTTP Tunneling Page
  9.     
  10.     This page exposes the MySQL API as a set of web-services which is consumed by SQLyog - the most popular GUI to MySQL.
  11.     
  12.     This page allows SQLyog to manage MySQL even if the MySQL port is blocked or remote access to MySQL is not allowed.
  13.     
  14. */
  15.  
  16. /* PHP for PHP/MySQL tunneling */
  17.  
  18. /* states of comments currently being worked on in the query. */
  19.  
  20.  
  21. /* check whether global variables are registered or not */
  22. if (!get_cfg_var("register_globals")) { 
  23.  extract($_REQUEST);
  24. }
  25.  
  26. define ( "COMMENT_OFF", 0 );
  27. define ( "COMMENT_HASH", 1 );
  28. define ( "COMMENT_DASH", 2 );
  29. define ( "COMMENT_START", 0 );
  30.  
  31. /* current element state while parsing XML received as post */
  32.  
  33. define ( "XML_NOSTATE", 0 );
  34. define ( "XML_HOST", 1 );
  35. define ( "XML_USER", 2 );
  36. define ( "XML_DB", 3 );
  37. define ( "XML_PWD", 4 );
  38. define ( "XML_PORT", 5 );
  39. define ( "XML_QUERY", 6 );
  40.  
  41. /* uncomment this line to create a debug log */
  42. /*define ( "DEBUG", 1 );*/
  43.  
  44. /* current character in the query */
  45. $curpos            = 0;
  46.  
  47. /* version constant */
  48. $tunnelversion  = '4.1';
  49.  
  50. /* global variable to keep the state of current XML element */
  51. $xml_state        = XML_NOSTATE;
  52.  
  53. /* global variables to track various informations about the query */
  54.  
  55. $host            = NULL;
  56. $port            = NULL;
  57. $db                = NULL;
  58. $username        = NULL;
  59. $pwd            = NULL;                                          
  60. $batch            = 0;
  61. $base            = 0;
  62. $query            = NULL;
  63.  
  64. /* we stop all error reporting as we check for all sort of errors */
  65. error_reporting ( 0 );
  66. set_time_limit ( 0 );
  67.  
  68. /* we can now use SQLyogTunnel.php to log debug informations, which will help us to point out the error */
  69. function WriteLog ( $loginfo )
  70. {
  71.     if ( defined("DEBUG") ) 
  72.     {
  73.         $fp = fopen ( "yogtunnel.log", "a" );
  74.  
  75.         if ( $fp == FALSE )
  76.             return;
  77.  
  78.         fwrite ( $fp, $loginfo . chr(13) );
  79.         fclose ( $fp );
  80.     }
  81. }
  82.  
  83. /* we check if all the external libraries support i.e. expat and mysql in our case is built in or not */
  84. /* if any of the libraries are not found then we show a warning and exit */
  85.  
  86. if ( AreModulesInstalled () == TRUE ) {
  87.     WriteLog ( "Enter AreModulesInstalled" );
  88.     ProcessQuery ();
  89.     WriteLog ( "Exit AreModulesInstalled" );
  90. }
  91.  
  92. function convertxmlchars ( $string )  
  93. {   
  94.     WriteLog ( "Enter convertxmlchars" );
  95.     WriteLog ( "Input: " . $string );
  96.     
  97.     $result = $string;   
  98.     
  99.     $result = eregi_replace('&', '&', $result);  
  100.     $result = eregi_replace('<', '<', $result);   
  101.     $result = eregi_replace('>', '>', $result);   
  102.     $result = eregi_replace('\'', ''', $result);
  103.     $result = eregi_replace('\"', '"', $result);
  104.  
  105.     WriteLog ( "Output: " . $result );
  106.     WriteLog ( "Exit convertxmlchars" );
  107.  
  108.     return $result;  
  109. }
  110.  
  111. /* we dont allow an user to connect directly to this page from a browser. It can only be accessed using SQLyog */
  112.  
  113. function ShowAccessError ()
  114. {
  115.     global     $tunnelversion;
  116.  
  117.     WriteLog ( "Enter showaccesserror" );
  118.  
  119.     $errmsg  = '<p><b>Tunnel version: ' . $tunnelversion . '</b>.<p>This PHP page exposes the MySQL API as a set of webservices.<br><br>This page allows SQLyog to manage a MySQL server even if the MySQL port is blocked or remote access to MySQL is not allowed.<br><br>Visit <a href ="http://www.webyog.com">Webyog</a> to get more details about SQLyog.';
  120.  
  121.     echo ( '<html><head><title>SQLyog HTTP Tunneling</title></head><body leftmargin="0" topmargin="0"><img src="http://www.webyog.com/images/webban.jpg" alt="Webyog"><p>' );
  122.     echo ( '<table width="100%" cellpadding="3" border="0"><tr><td><font face="Verdana" size="2">' . $errmsg . '</td</tr></table>' );
  123.     echo ( '</body></html>' );
  124.  
  125.     WriteLog ( "Exit showaccesserror" );
  126. }
  127.  
  128. /* function checks if a required module is installed or not */
  129.  
  130. function AreModulesInstalled ()
  131. {
  132.     global     $tunnelversion;
  133.  
  134.     WriteLog ( "Enter aremodulesinstalled" );
  135.     
  136.     $modules         = get_loaded_extensions();
  137.     $modulenotfound = '';
  138.  
  139.     if ( extension_loaded  ( "xml" ) != TRUE ) {
  140.         $modulenotfound = 'XML';
  141.     } else if ( extension_loaded  ( "mysql" ) != TRUE ) {
  142.         $modulenotfound = 'MySQL';    
  143.     } else {
  144.         return TRUE;
  145.     }
  146.  
  147.     $errmsg   = '<b>Error:</b> Extension <b>' . $modulenotfound . '</b> was not found compiled and loaded in the PHP interpreter. SQLyog requires this extension to work properly.';   
  148.     $errmsg  .= '<p><b>Tunnel version: ' . $tunnelversion . '</b>.<p>This PHP page exposes the MySQL API as a set of webservices.<br><br>This page allows SQLyog to manage a MySQL server even if the MySQL port is blocked or remote access to MySQL is not allowed.<br><br>Visit <a href ="http://www.webyog.com">Webyog</a> to get more details about SQLyog.';
  149.  
  150.     echo ( '<html><head><title>SQLyog HTTP Tunneling</title></head><body leftmargin="0" topmargin="0"><img src="http://www.webyog.com/images/webban.jpg" alt="Webyog"><p>' );
  151.     echo ( '<table width="100%" cellpadding="3" border="0"><tr><td><font face="Verdana" size="2">' . $errmsg . '</td</tr></table>' );
  152.     echo ( '</body></html>' );
  153.  
  154.     WriteLog ( "Exit aremodulesinstalled" );
  155. }
  156.  
  157. function ProcessQuery ()
  158. {
  159.  
  160.     WriteLog ( "Enter processquery" );
  161.  
  162.     /* check that user has not executed the phptunnel.php from browser */
  163.     if ( !isset ( $_POST['textfield'] ) )
  164.     {
  165.         ShowAccessError ();
  166.         return;
  167.     } 
  168.  
  169.     /* fix in v4.1 that checks for global configuration flag get_magic_quotes_gpc() to stripslashes or not */
  170.     if (get_magic_quotes_gpc()) {
  171.         $xmlrecvd = stripslashes ( urldecode ( $_POST['textfield'] ) );
  172.     } else {
  173.         $xmlrecvd = urldecode ( $_POST['textfield'] );
  174.     }    
  175.  
  176.     global    $host;
  177.     global    $port;
  178.     global    $username;
  179.     global    $pwd;
  180.     global  $db;
  181.     global     $batch;
  182.     global    $query;
  183.     global    $base;
  184.  
  185.     $ret = GetDetailsFromPostedXML ( $xmlrecvd );
  186.  
  187.     if ( $ret == FALSE )
  188.         return;
  189.  
  190.     /* connect to the mysql server */
  191.     WriteLog ( "Trying to connect" );
  192.     $mysql        = mysql_connect ( "$host:$port", $username, $pwd );
  193.     if ( !$mysql )
  194.     {
  195.         HandleError ( mysql_errno(), mysql_error() );
  196.         WriteLog ( mysql_error() );
  197.         return;
  198.     }
  199.  
  200.     WriteLog ( "Connected" );
  201.  
  202.     mysql_select_db ( str_replace ( '`', '', $db ), $mysql );
  203.  
  204.     if ( $batch ) {
  205.         ExecuteBatchQuery ( $mysql, $query );
  206.     }
  207.     else 
  208.         ExecuteSingleQuery ( $mysql, $query );
  209.  
  210.     mysql_close ( $mysql );
  211.  
  212.     WriteLog ( "Exit processquery" );
  213. }
  214.  
  215. /* Start element handler for the parser */
  216.  
  217. function startElement ( $parser, $name, $attrs )
  218. {
  219.     global  $xml_state;
  220.     global    $host;
  221.     global    $port;
  222.     global  $db;
  223.     global    $username;
  224.     global    $pwd;
  225.     global     $batch;
  226.     global    $query;
  227.     global    $base;
  228.  
  229.     WriteLog ( "Enter startelement" );
  230.  
  231.     if ( strtolower ( $name ) == "host" ) 
  232.     {
  233.         $xml_state     = XML_HOST;
  234.     }
  235.     else if ( strtolower ( $name ) == "db" ) 
  236.     {
  237.         $xml_state    = XML_DB;
  238.     }
  239.     else if ( strtolower ( $name ) == "user" ) 
  240.     {
  241.         $xml_state     = XML_USER;
  242.     }
  243.     else if ( strtolower ( $name ) == "password" )
  244.     {
  245.         $xml_state    = XML_PWD;
  246.     }
  247.     else if ( strtolower ( $name ) == "port" )
  248.     {
  249.         $xml_state     = XML_PORT;
  250.     }
  251.     else if ( strtolower ( $name ) == "query" )
  252.     {
  253.         $xml_state    = XML_QUERY;
  254.  
  255.         /* track whether the query(s) has to be processed in batch mode */
  256.         $batch = (( $attrs['B'] == '1' )?(1):(0));
  257.         $base  = (( $attrs['E'] == '1' )?(1):(0));      
  258.     }
  259.  
  260.     WriteLog ( "Exit startelement" );
  261. }
  262.  
  263. /* End element handler for the XML parser */
  264.  
  265. function endElement ( $parser, $name )
  266. {
  267.     WriteLog ( "Enter endElement" );
  268.     
  269.     global $xml_state;
  270.     
  271.     $xml_state    =    XML_NOSTATE;
  272.  
  273.     WriteLog ( "Exit  endElement" );
  274. }
  275.  
  276. /* Character data handler for the parser */
  277.  
  278. function charHandler ( $parser, $data )
  279. {
  280.     
  281.     global  $xml_state;
  282.     global    $host;
  283.     global    $port;
  284.     global  $db;
  285.     global    $username;
  286.     global    $pwd;
  287.     global     $batch;
  288.     global    $query;
  289.     global    $base;
  290.  
  291.     WriteLog ( "Enter charhandler" );
  292.  
  293.     if ( $xml_state == XML_HOST ) 
  294.     {
  295.         $host         .= $data;
  296.     }
  297.     else if ($xml_state == XML_DB ) 
  298.     {
  299.         $db         .= $data;
  300.     }
  301.     else if ( $xml_state == XML_USER ) 
  302.     {
  303.         $username    .= $data;
  304.     }
  305.     else if ( $xml_state == XML_PWD )
  306.     {
  307.         $pwd        .= $data;
  308.     }
  309.     else if ( $xml_state == XML_PORT )
  310.     {
  311.         $port         .= $data;
  312.     }
  313.     else if ( $xml_state == XML_QUERY )
  314.     {
  315.         if ( $base ) {
  316.             $query        .= base64_decode ( $data );
  317.         } else {
  318.             $query        .= $data;    
  319.         }
  320.     }
  321.  
  322.     WriteLog ( "Exit charhandler" );
  323. }
  324.  
  325. /* Parses the XML received and stores information into the variables passed as parameter */
  326.  
  327. function GetDetailsFromPostedXML ( $xmlrecvd )
  328. {
  329.  
  330.     WriteLog ( "Enter getdetailsfrompostedxml" );
  331.  
  332.     $xml_parser        = xml_parser_create ();
  333.     xml_set_element_handler($xml_parser, "startElement", "endElement");
  334.     xml_set_character_data_handler ( $xml_parser, "charHandler" );
  335.  
  336.     $ret = xml_parse ( $xml_parser, $xmlrecvd );
  337.     if ( !$ret ) 
  338.     {
  339.         HandleError ( xml_get_error_code ( $xml_parser ), xml_error_string ( xml_get_error_code ( $xml_parser ) ) );
  340.         return FALSE;
  341.     }
  342.  
  343.     xml_parser_free($xml_parser);
  344.  
  345.     WriteLog ( "Exit getdetailsfrompostedxml" );
  346.  
  347.     return TRUE;
  348. }
  349.  
  350. /* Function writes down the correct XML for handling mysql_pconnect() error */
  351.  
  352. function HandleError ( $errno, $error )
  353. {
  354.     global         $tunnelversion;
  355.  
  356.     WriteLog ( "Enter handleerror" );
  357.     
  358.     echo "<xml v=\"" . $tunnelversion . "\"><e_i><e_n>$errno</e_n><e_d>" . convertxmlchars($error) . "</e_d></e_i></xml>";
  359.  
  360.     WriteLog ( "Exit handleerror" );
  361. }
  362.  
  363. /* Process when only a single query is called. */
  364.  
  365. function ExecuteSingleQuery ( $mysql, $query )
  366. {
  367.  
  368.     global            $tunnelversion;
  369.  
  370.     $result        = mysql_query ( $query, $mysql );
  371.  
  372.     WriteLog ( "Enter ExecuteSingleQuery" );
  373.  
  374.     if ( !$result ) {
  375.         HandleError ( mysql_errno(), mysql_error() );
  376.         return;
  377.     }
  378.  
  379.     /* query execute was successful so we need to echo the correct xml */
  380.     /* the query may or may not return any result */
  381.     WriteLog ( "mysql_num_rows in ExecuteSingleQuery" );
  382.     if ( !mysql_num_rows ( $result ) && !mysql_num_fields ( $result ) )
  383.     {
  384.         /* is a non-result query */
  385.         echo "<xml v=\"" . $tunnelversion . "\">";
  386.         echo "<e_i></e_i>";
  387.         HandleExtraInfo ( $mysql );
  388.         echo "<f_i c=\"0\"></f_i><r_i></r_i></xml>";
  389.         return;
  390.     }
  391.  
  392.     /* handle result query like SELECT,SHOW,EXPLAIN or DESCRIBE */
  393.     echo '<xml v="' . $tunnelversion . '">';
  394.     echo "<e_i></e_i>";
  395.     
  396.     /* add some extra info */
  397.     HandleExtraInfo ( $mysql );
  398.  
  399.     /* add the field count information */
  400.     $fieldcount        = mysql_num_fields ( $result );
  401.     print ( $fieldcount );
  402.     echo "<f_i c=\"$fieldcount\">";
  403.  
  404.     /* retrieve information about each fields */
  405.     $i = 0;
  406.     while ($i < $fieldcount ) 
  407.     {
  408.         $meta = mysql_fetch_field($result);
  409.  
  410.         echo "<f>";
  411.         echo "<n>" . convertxmlchars($meta->name) . "</n>";
  412.         echo "<t>" . convertxmlchars($meta->table) . "</t>";
  413.         echo "<m>" . convertxmlchars($meta->max_length) . "</m>";
  414.         echo "<d></d>";
  415.         echo "<ty>" . GetCorrectDataType ( $result, $i ) . "</ty>";
  416.         echo "</f>";
  417.  
  418.         $i++;
  419.     }
  420.  
  421.     /* end field informations */
  422.     echo "</f_i>";
  423.  
  424.     /* get information about number of rows in the resultset */
  425.     $numrows    = mysql_num_rows ( $result );
  426.     echo "<r_i c=\"$numrows\">";
  427.  
  428.     /* add up each row information */
  429.     while ( $row = mysql_fetch_array ( $result ) )
  430.     {
  431.         $lengths = mysql_fetch_lengths ( $result );
  432.  
  433.         /* start of a row */
  434.         echo "<r>";
  435.  
  436.         for ( $i=0; $i < $fieldcount; $i++ ) 
  437.         {
  438.             /* start of a col */
  439.             echo "<c l=\"$lengths[$i]\">";
  440.  
  441.             if ( !isset($row[$i]) /*== NULL*/ ) 
  442.             {
  443.                 echo "(NULL)";
  444.             }
  445.             else 
  446.             {
  447.                 if ( mysql_field_type ( $result, $i ) == "blob" ) 
  448.                 {
  449.                     if ( $lengths[$i] == 0 ) 
  450.                     {
  451.                         echo "_";
  452.                     }
  453.                     else
  454.                     {
  455.                         echo convertxmlchars ( base64_encode ( $row[$i] ) );
  456.                     }
  457.                 }
  458.                 else
  459.                 {
  460.                     if ( $lengths[$i] == 0 ) 
  461.                     {
  462.                         echo "_";
  463.                     }
  464.                     else
  465.                     {
  466.                         echo convertxmlchars($row[$i]);    
  467.                     }
  468.                 }
  469.             }
  470.  
  471.             /* end of a col */
  472.             echo "</c>";
  473.         }
  474.  
  475.         /* end of a row */
  476.         echo "</r>";
  477.     }
  478.  
  479.     /* close the xml output */
  480.     echo "</r_i></xml>";
  481.     
  482.     /* free the result */
  483.     mysql_free_result ( $result );
  484.  
  485.     WriteLog ( "Exit ExecuteSingleQuery" );
  486. }
  487.  
  488. /* function finds and returns the correct type understood by MySQL C API() */
  489.  
  490. function GetCorrectDataType ( $result, $j )
  491. {
  492.     $data    = NULL;
  493.  
  494.     WriteLog ( "Enter GetCorrectDataType" );
  495.  
  496.     switch( mysql_field_type ( $result, $j ) )
  497.     {
  498.         case "int":
  499.             if ( mysql_field_len ( $result, $j ) <= 4 )
  500.             {
  501.                 $data = "smallint";
  502.             }
  503.             elseif ( mysql_field_len ( $result, $j ) <= 9 )
  504.             {
  505.                 $data = "mediumint";
  506.             }
  507.             else
  508.             {
  509.                 $data = "int";
  510.             }
  511.             break;
  512.     
  513.         case "real":
  514.             if (mysql_field_len($result,$j) <= 10 )
  515.             {
  516.                 $data = "float";                                             
  517.             }
  518.             else
  519.             {
  520.                 $data = "double";
  521.             }
  522.             break;
  523.  
  524.         case "string":
  525.             $data = "varchar";
  526.             break;
  527.  
  528.         case "blob":
  529.             $textblob = "TEXT";
  530.             if ( strpos ( mysql_field_flags ($result,$j),"binary") )
  531.             {
  532.                 $textblob = "BLOB";
  533.             }
  534.             if (mysql_field_len($result,$j) <= 255)
  535.             {
  536.                 if ( $textblob == "TEXT" )
  537.                 {
  538.                     $data = "tinytext";
  539.                 }
  540.                 else
  541.                 {
  542.                     $data = "tinyblob";
  543.                 }
  544.             }
  545.             elseif (mysql_field_len($result, $j) <= 65535 )
  546.             {
  547.                 if ( $textblob == "TEXT" ) {
  548.                     $data = "mediumtext";
  549.                 }
  550.                 else
  551.                 {
  552.                     $data = "mediumblob";
  553.                 }
  554.             }
  555.             else
  556.             {
  557.                 if ( $textblob == "TEXT" ) {
  558.                     $data = "longtext";
  559.                 }
  560.                 else
  561.                 {
  562.                     $data = "longblob"; 
  563.                 }
  564.             }
  565.             break;
  566.  
  567.         case "date":
  568.             $data = "date";
  569.             break;
  570.  
  571.         case "time":
  572.             $data = "time";
  573.             break;
  574.  
  575.         case "datetime":
  576.             $data = "datetime";
  577.             break;
  578.     }
  579.  
  580.     WriteLog ( "Exit GetCorrectDataType" );
  581.  
  582.     return (convertxmlchars($data));
  583. }
  584.  
  585. /* Processes a set of queries. The queries are delimited with ;. Will return result for the last query only. */
  586. /* If it encounters any error in between will return error values for that query */
  587.  
  588. function ExecuteBatchQuery ( $mysql, $query )
  589. {
  590.  
  591.     WriteLog ( "Enter ExecuteBatchQuery" );
  592.  
  593.     $found        = FALSE;
  594.     $token        = NULL;
  595.     $prev        = NULL;
  596.  
  597.     $token         = my_strtok ( $query, $found );
  598.  
  599.     while ( !empty($token) )
  600.     {
  601.         $prev = $token;
  602.  
  603.         $token         = my_strtok ( $query, $found );
  604.  
  605.         if ( empty($token) )
  606.         {
  607.             return ExecuteSingleQuery ( $mysql, $prev );
  608.         }
  609.  
  610.         $result = mysql_query ( $prev, $mysql );
  611.  
  612.         if ( !$result )  {
  613.             return HandleError ( mysql_errno(), mysql_error() );
  614.         }
  615.  
  616.         mysql_free_result ( $result );
  617.     }
  618.  
  619.     WriteLog ( "Exit ExecuteBatchQuery" );
  620.  
  621.     return;
  622. }
  623.  
  624. /* */
  625.  
  626. function HandleExtraInfo ( $mysql )
  627. {
  628.  
  629.     WriteLog ( "Enter HandleExtraInfo" );
  630.  
  631.     echo "<s_v>" . mysql_get_server_info ( $mysql ) . "</s_v>";
  632.     echo "<m_i></m_i>";
  633.     echo "<a_r>" . mysql_affected_rows ( $mysql ) . "</a_r>";
  634.     echo "<i_i>" . mysql_insert_id ( $mysql ) . "</i_i>";
  635.  
  636.     WriteLog ( "Exit HandleExtraInfo" );
  637.  
  638. }
  639.  
  640. /* implementation of my_strtok() in PHP */
  641.  
  642. function my_strtok ( $query, &$found )
  643. {
  644.     WriteLog ( "Enter my_strok" );
  645.  
  646.     global            $curpos;
  647.     
  648.     $delimiter        = ';';
  649.     $quote            = NULL;
  650.     $escapedchar    = NULL;
  651.     $ch                = NULL;
  652.     $i                = $curpos;
  653.     $quotestart        = 0;
  654.     $comment         = COMMENT_OFF;
  655.     $found            = TRUE;
  656.             
  657.     if ( $query[$curpos] == NULL )
  658.         return 0;
  659.  
  660.     for ( ; $query[$curpos] != NULL; $curpos++ )
  661.     {
  662.         $ch = $query[$curpos];
  663.  
  664.         if ( $ch == $delimiter )
  665.         {
  666.             if ( isset ( $quote ) == FALSE && ( $comment==COMMENT_OFF ) )
  667.             {
  668.                 $curpos++;
  669.                 $temp = substr ( $query, $i, $curpos-$i-1 );
  670.                 return ( $temp );
  671.             }
  672.             else
  673.                 continue;
  674.         }
  675.         else if ( $ch == '\'' || $ch == '\"' )
  676.         {
  677.             // we only do this if the quote is  open
  678.             if ( $quote )
  679.             {
  680.                 // we just check if its the same quote.
  681.                 if ( $quote != $query[$curpos] )
  682.                     continue;
  683.  
  684.                 $quote = NULL;
  685.  
  686.             } else if ( $comment == COMMENT_OFF ) {
  687.  
  688.                 $quote = $query[$curpos];
  689.                 continue;
  690.             }
  691.         }
  692.         else if ( $query[$curpos] == '#' ) {
  693.             if ( $comment == COMMENT_OFF && $quote == NULL ) 
  694.                 $comment = COMMENT_HASH;
  695.         }
  696.         else if ( $query[$curpos] == '-' && $query[$curpos+1] == '-' && $query[$curpos+2] == ' ' && $quote == NULL )
  697.         {
  698.             if ( $comment == COMMENT_OFF    )
  699.             {
  700.                 $curpos     += 2;
  701.                 $comment     = COMMENT_DASH;
  702.             }
  703.         }
  704.         else if ( $query[$curpos] == '/' && $query[$curpos+1] == '*' && $quote == NULL )
  705.         {
  706.             if ( $comment == COMMENT_OFF    )
  707.             {
  708.                 $curpos        += 1;
  709.                 $comment    = COMMENT_START;
  710.             }
  711.         }
  712.         else if ( $query[$curpos] == chr(13) || $query[$curpos] == chr(10) )
  713.         {
  714.             if ( $comment != COMMENT_OFF && $comment != COMMENT_START )
  715.                 $comment = COMMENT_OFF;
  716.         }
  717.         else if  ( $query[$curpos] == '*' && $query[$curpos+1] == '/' )
  718.         {
  719.             if ( $comment == COMMENT_START )
  720.                 $comment = COMMENT_OFF;
  721.  
  722.         } else  if ( $query[$curpos] == '\\' ) {
  723.  
  724.             if ( $quote )
  725.                 $curpos++;
  726.         }
  727.     }
  728.  
  729.     WriteLog ( "Exit my_strok" );
  730.  
  731.     return substr ( $query, $i, $curpos-$i );
  732. }
  733. ?>