3v4l.org

run code in 200+ php & hhvm versions
Bugs & Features
<?php /* Projekt 1 - 09: XML Query v PHP 5 pro IPP 2014/2015 ** Jmeno a prijemni: Tomas Hynek (c) 2015 ** Login: xhynek09 */ header("Content-type: text/xml; charset=utf-8"); //################################################################################### //############################# HELP - NAPOVEDA ##################################### function help(){ echo "################################################################\n", "############### Projekt 1 - XQR v PHP 5.3.3 ####################\n", "############### Autor: Tomas Hynek (c) 2015 ####################\n", "############### Login: xhynek09 ####################\n", "############### Napoveda ke skriptu ####################\n", "## --help vypise na standardni vystup napovedu skriptu.\n\n", "## --input=filename\n\tzadany vstupni soubor muze byt zadan relativni cestou nebo absolutni cestou;v pripade, ze by\n\tnazev ci cesta obsahovala mezeru, tak musi byt uvedena cela cesta i se jmenem souboru v uvozovkach\n\t(znak uvozovek a rovnitka ve jmene soubory neni treba uvazovat); chybi-li tento parametr, tak je\n\tuvazovnan standardni vstup.\n\n", "## --output=filename\n\tzadany vystupni soubor muze byt zadan relativni cestou nebo absolutni cestou; v pripade, ze by nazev\n\tci cesta obsahovala mezeru, tak musi byt uvedena cesta i se jmenem souboru v uvozovkach (znak uvozovek\n\ta rovnitka ve jmene soubory neni treba uvazovat); chybi-li tento parametr, tak je vystup presmerovan\n\tna standardni vystup; existuje-li jiz vystupni soubor, bude bez varovani prepsan, jinak bude vytvoren\n\tnovy soubor.\n\n", "## --query='dotaz'\n\tzadany dotaz v dotazovacim jazyce definovanem nize (v pripade zadani timto zpusobem nebude dotaz\n\tobsahovat symbol apostrof).\n\n", "## --qf=filename\n\tdotaz v dotazovacim jazyce definovanem nize zadany v externim textovem souboru (nelze kombinovat s --query).\n\n", "## -n\tnegenerovat XML hlavicku na vystup skriptu.\n\n", "## --root=element\n\tjmeno paroveho korenoveho elementu obalujici vysledky. Pokud nebude zadan, tak se vysledky neobaluji\n\tkorenovym elementem, ac to porusuje validitu XML.\n\n"; } //################################################################################### //############### SEPARATE QUERY - VYHODNOCENI VYRAZU SELECT ######################## function separate_query($query) { global $select; global $limit; global $from; global $elem_or_atr; global $operator; global $literal; global $matches_out; global $type_liter; global $condition; global $from_all; $regex = "/^(SELECT\s[a-z]+)". "(\sLIMIT\s[0-9])*". "(\sFROM\sROOT|\sFROM\s[a-z]+\x2E[a-z]+|\sFROM\s\x2E[a-z]+|\sFROM\s[a-z]+)". "($|\sWHERE(\sNOT)?\s([a-z]+\x2E[a-z]+|\x2E[a-z]+|[a-z]+)\s". "((CONTAINS|\x3D|\x3C|\x3E)\s(\x22\w+\x22)|(\x3D|\x3C|\x3E)\s([0-9]+)))\z/"; if (!preg_match_all($regex, $query, $matches_out)) // funkce pracuje s RV a naplni dotaz do pole dle pravidel { file_put_contents('php://stderr', "Error - bad grammar of query\n"); exit(80); } // $count_q = count($matches_out); // for ($l=0; $l < $count_q; $l++) // { // print_r($matches_out[$l]); // } if (($matches_out[1][0]) !='') //SELECT element { $arr = explode("SELECT ", $matches_out[1][0]); // rozparsrovani na SELECT | element $select = $arr[1]; // vyjmuti element do $select echo ("select:".$select."\n"); } if (($matches_out[2][0]) !='') //LIMIT number { $arr = explode(" LIMIT ", $matches_out[2][0]); // rozparsrovani na SELECT | element $limit = $arr[1]; // vyjmuti element do $select echo ($limit."\n"); } if (($matches_out[3][0]) !='') //FROM <FROM-ELM> { $arr = explode(" FROM ", $matches_out[3][0]); // rozparsrovani na SELECT | element $from = $arr[1]; // vyjmuti element do $select echo ("from:".$from."\n"); if ($from == 'ROOT') {$from_all = 1;} } if (($matches_out[4][0]) !='') //WHERE exists? { $condition = 1; // YES } if (($matches_out[5][0]) !='') //NOT { $arr = explode(" ", $matches_out[5][0]); // rozparsrovani na SELECT | element $not = $arr[1]; echo ($not."\n"); } if (($matches_out[6][0]) !='') //<ELEMENT-OR-ATTRIBUTE> { $elem_or_atr = $matches_out[6][0]; // ulozeni do promenne echo ($elem_or_atr."\n"); } if (($matches_out[8][0]) !='') //<RELATION-OPERATOR> |<|>|=|CONTAINS| pro STRING { $opr = $matches_out[10][0]; // ulozeni relation operatoru if ($opr == '='){$operator=1;} else if($opr == '>'){$operator=2;} else {$operator=3;} echo ($operator."\n"); } if (($matches_out[9][0]) !='') //<LITERAL> STRING { $literal = $matches_out[9][0]; // ulozeni literalu - string $type_liter = 1; echo ($type_liter."\n"); } if (($matches_out[10][0]) !='') //<RELATION-OPERATOR> |<|>|=| pro NUM { $opr = $matches_out[10][0]; // ulozeni relation operatoru if ($opr == '='){$operator=1;} else if($opr == '>'){$operator=2;} else {$operator=3;} echo ($operator."\n"); } if (($matches_out[11][0]) !='') //<LITERAL> NUM { $literal = $matches_out[11][0]; // ulozeni literalu - num $type_liter = 2; echo ($type_liter."\n"); } return; } //################################################################################### //##################### PROHLEDAVANI a ZPRACOVANI WHERE ############################# function searchWhere($key, $array, $simple_obj) { if (array_key_exists($key, $array)) { foreach ($array as $index => $subarray) { if ($index == $key) { if (is_object($subarray)) { echo $index." je to object\n"; //$simple_obj = new SimpleXMLElement("<{$index}>{$key}</{$index}>"); $simple_obj->addChild($key, $subarray); print_r($simple_obj); } echo("item find: {$index}=>{$key}\n"); } } return; } else { foreach ($array as $index => $subarray) { echo("RE-SEACHING {$index} FOR : {$key}\n"); return search($subarray, $key, $simple_obj); } } return; } //################################################################################### //#################### PROHLEDAVANI a ZPRACOVANI SELECT ############################# function search($array, $key, $simple_out) { global $select, $rt, $root_elem, $from; if (!is_object($simple_out) && ($rt == 1)) { $simple_out = new SimpleXMLElement("<{$root_elem}></{$root_elem}>"); } if (array_key_exists($key, $array)) { foreach ($array as $index => $subarray) { if ($index == $key ) { if (is_object($subarray)) { echo $index." je to object\n"; print_r($simple_out); } if ($rt != 1) { $simple_out = new SimpleXMLElement("<{$index}></{$index}>"); echo("item find: {$index}=>{$key}\n"); searchWhere($select, $subarray, $simple_out); } else { echo("item find: {$index}=>{$key}\n"); $elem = $simple_out->addChild($index); searchWhere($select, $subarray, $elem); } } return $simple_out; } } else { foreach ($array as $index => $subarray) { echo("RE-SEACHING {$index} FOR : {$key}\n"); return search($subarray, $key, $simple_out); } } return; } //################################################################################### //################# PROHLEDAVANI a ZPRACOVANI PRI FROM ROOT ######################### function searchRoot($array, $key, $simple_out) { global $rt, $root_elem; if (!is_object($simple_out) && ($rt == 1)) { $simple_out = new SimpleXMLElement("<{$root_elem}></{$root_elem}>"); } echo "zpracovavam ROOT\n"; if (array_key_exists($key, $array)) { foreach ($array as $index => $subarray) { if ($index == $key ) { if ($rt == 1) // pokud --root=element { $elem = $simple_out->addChild($index); } else // pokud neni zadan --root= { if (!is_object($simple_out)) // tady jeste nevim jeslti to je dobre, jestli vytvorit book jednou nebo dvakrat?? { // viz sekvence prikazu php -d open_basedir="" xqr.php --input=xml02.in --qf=query02.qu $simple_out = new SimpleXMLElement("<{$index}></{$index}>"); $elem = $simple_out; } } foreach ($subarray as $child => $data) { echo("vypisek: {$child}=>{$data}\n"); $elem->addChild($child, $data); } } } return $simple_out; } else { foreach ($array as $index => $subarray) { echo("RE-SEACHING {$index} FOR : {$key}\n"); return searchRoot($subarray, $key, $simple_out); } } return; } //################################################################################### //########################## HLAVNI PROGRAM SKRIPTU ################################# //################################################################################### $in = 0; // indikace parametru --input $out = 0; // indikace parametru --output $qr = 0; // indikace parametru --query $qf = 0; // indikace parametru --qf $rt = 0; // indikace parametru --root $n = 0; // indikace parametru -n $root=0; // 0-nic, 1-ROOT... jmeno paroveho korenoveho elementu obalujici vysledky $type_liter=0; // 0-nic, 1-string, 2-num $condition=0; // 0-bez podminky, 1-s podminkou $xml_arr = 0; // global $from, $from_all; // $operator = 0; // 0-nic, 1-equal, 2-more, 3-less //$input; // v stupni soubor //$output; // vystupni soubor //$query; // zadany dotaz v dotaz. jazyce //$qfile; // zadany dotaz v externim textovem souboru //$root_elem; // ulozen obalujici root //$xml_arr_out; //########################### ZPRACOVANI ARGUMENTU ################################## for ($i = 0; $i < $argc; $i++) { if ($i > 0) // pokud prochazime druhy argument a vyse..... { if ((strpos($argv[$i], '--help')) !== false) // ---help { $help = explode("--help", $argv[$i]); if (($argc > 2) || ($help[1] != "") || ($help[0] != "")) { file_put_contents('php://stderr', "Error - bad param\n"); exit(1); // spatny format parametru nebo zakazana kombinace parametru } help(); // konec skriptu bez chyby exit(0); } else if ((strpos($argv[$i], '--input=')) !== false) // --input { $input = explode("--input=", $argv[$i]); if (($input[1] == "") || ($input[0] != "")) { file_put_contents('php://stderr', "Error - bad param\n"); exit(1); // spatny format parametru nebo zakazana kombinace parametru } if (file_exists("$input[1]")) { fclose(STDIN); $xml_arr = simplexml_load_file("$input[1]"); //echo "ZDE JE ROOT ELEMENT: ".$xml_arr->getName()."\n"; if($xml_arr === FALSE) { file_put_contents('php://stderr', "Error - file isnt exist\n"); exit(2); } //print_r($xml); } else { file_put_contents('php://stderr', "Error - file isnt exist\n"); exit(2); } $in += 1; } else if ((strpos($argv[$i], '--output=')) !== false) // --output { $output = explode("--output=", $argv[$i]); if (($output[1] == "") || ($output[0] != "")) { file_put_contents('php://stderr', "Error - bad param\n"); exit(1); // spatny format parametru nebo zakazana kombinace parametru } //fclose(STDOUT); $fopen_out = fopen("$output[1]", 'w'); $fopen_final_out = $output[1]; echo $fopen_out."\n"; $out += 1; } else if ((strpos($argv[$i], '--query=')) !== false) // --query { $query = explode("--query=", $argv[$i]); if (($query[1] == "") || ($query[0] != "")) { file_put_contents('php://stderr', "Error - bad param\n"); exit(1); // spatny format parametru nebo zakazana kombinace parametru } separate_query($query[1]); $qr += 1; } else if ((strpos($argv[$i], '--qf=')) !== false) // --qf { $qfile = explode("--qf=", $argv[$i]); if (($qfile[1] == "") || ($qfile[0] != "")) { file_put_contents('php://stderr', "Error - bad param\n"); exit(1); // spatny format parametru nebo zakazana kombinace parametru } if (!(is_readable($qfile[1]))) { file_put_contents('php://stderr', "Error - file isnt exist\n"); exit(2); // spatny format parametru nebo zakazana kombinace parametru } $query_string = file_get_contents($qfile[1]); var_dump($query_string); separate_query($query_string); $qf += 1; } else if ((strpos($argv[$i], '--root=')) !== false) // --root { $root = explode("--root=", $argv[$i]); if (($root[1] == "") || ($root[0] != "")) { file_put_contents('php://stderr', "Error - bad param\n"); exit(1); // spatny format parametru nebo zakazana kombinace parametru } $root_elem = $root[1]; $rt += 1; } else if ((strpos($argv[$i], '-n')) !== false) // -n { $n += 1; } else // jine argumenty nejsou povoleny { file_put_contents('php://stderr', "Error - bad param\n"); exit(1); // spatny format parametru nebo zakazana kombinace parametru } } } //################################################################################### if (($in > 1)||($out > 1)||($qr > 1)||($qf > 1)||($rt > 1)||($n > 1)) // pokud se nejaky parametr opakuje { file_put_contents('php://stderr', "Error - bad param\n"); exit(1); // spatny format parametru nebo zakazana kombinace parametru } if (($qr > 0) && ($qf > 0)) { file_put_contents('php://stderr', "Error - bad param\n"); exit(1); // spatny format parametru nebo zakazana kombinace parametru } print_r($xml_arr); if ($from_all == 0) { $xml_out = search($xml_arr, $from, NULL); } else { $xml_out = searchRoot($xml_arr, $select, NULL); } echo"\n##### Konecna tabulka obejktu ##### \n"; //print_r($xml_out); //var_dump($arr); if (is_object($xml_out)) { $xml_final_output = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"; if ($xml_final_output = $xml_out->asXML()) // prevedeni zpet na XML { echo "wwwwwtttttttttttffffffffff\n"; if ($out == 1) { $xml_out->asXML("$fopen_final_out"); fclose($fopen_out); } else { echo $xml_final_output; } } else { file_put_contents('php://stderr', "Error - pri prevodu na XML format!\n"); exit(100); } } //else ////// totot haze exit 100 pri skriptu test01 ......whaaaaat?????? //{ // file_put_contents('php://stderr', "Error - pri prevodu na XML format!\n"); // exit(100); //} echo "\n"; exit(0); // konec skriptu bez chyby
based on ul8vF
Output for 5.4.0 - 7.2.0
0 Warning: array_key_exists() expects parameter 2 to be array, integer given in /in/fSgRB on line 162 Warning: Invalid argument supplied for foreach() in /in/fSgRB on line 190 ##### Konecna tabulka obejktu #####