* @author Thomas Hooge * */ // must be run within Dokuwiki if (!defined('DOKU_INC')) die(); /** * All DokuWiki plugins to extend the parser/rendering mechanism * need to inherit from this class */ class syntax_plugin_sqlquery extends DokuWiki_Syntax_Plugin { public function getType() { return 'substition'; } public function getSort() { return 666; } public function getPType() { return 'block'; } public function connectTo($mode) { $this->Lexer->addSpecialPattern('(?:.*?)', $mode, 'plugin_sqlquery'); } /** * Handle matches of the sqlquery syntax * * @param string $match The match of the syntax * @param int $state The state of the handler * @param int $pos The position in the document * @param Doku_Handler $handler The handler * * @return array Data for the renderer */ public function handle($match, $state, $pos, Doku_Handler $handler) { $data = array('state' => $state); if ($state == DOKU_LEXER_SPECIAL) { # get type (DSN prefix) if (preg_match('/getConf('type'); } # get host if (preg_match('/getConf('Host'); } # get database if (preg_match('/getConf('DB'); } # get query $data['match'] = $match; if (preg_match('%(.*)%s', $match, $result)) { $data['query'] = trim($result[1]); } } return $data; } /** * Render xhtml output or metadata * * @param string $mode Renderer mode (supported modes: xhtml) * @param Doku_Renderer $renderer The renderer * @param array $data The data from the handler() function * * @return bool If rendering was successful. */ public function render($mode, Doku_Renderer $renderer, $data) { if ($mode != 'xhtml') return false; if (empty($data['query'])) return true; // get configuration $user = $this->getConf('user'); $password = $this->getConf('password'); // connect to database $dsn = "{$data['type']}:host={$data['host']};dbname={$data[db]};charset=UTF-8;"; try { $dbh = new PDO($dsn, $user, $password); } catch (PDOException $e) { $renderer->doc .= "
Unable to connect ro database:" . $e->getMessage() . "
\n"; return true; } $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_NUM); // run query try { $result = $dbh->query($data['query']); } catch (PDOException $e) { $renderer->doc .= "
Error in query:" . $e->getMessage() . "
\n"; return true; } // get the number of fields in the table $fieldcount = $result->columnCount(); // build a table $renderer->doc .= '' . "\n"; // build the header section of the table $renderer->doc .= ""; for ($i = 0; $i < $fieldcount; $i++) { $meta = $result->getColumnMeta($i); $renderer->doc .= ""; } $renderer->doc .= "\n"; // build the contents of the table $renderer->doc .= "\n"; foreach ($result as $row) { $renderer->doc .= ""; for ( $i = 0; $i < $fieldcount; $i++ ) { $renderer->doc .= ""; } $renderer->doc .= "\n"; } // finish the table $renderer->doc .= "\n
"; $renderer->doc .= $meta['name']; $renderer->doc .= "
"; $renderer->doc .= htmlentities($row[$i]); $renderer->doc .= "
\n"; // Close connection, there is no close() method with PDO :-( $result = null; $dbh = null; return true; } }