Ostatnio potrzebowałem funkcji, która z zapytania SELECT, INSERT, UPDATE i DELETE zwróci mi nazwy wszystkich tabel (do cache zapytan mysql). Zrobiłem taką funkcję i pomyślałem, że umieszczę ją tutaj.
Specyfikacja:
- wsparcie dla zapytań SELECT, INSERT, UPDATE i DELETE (cczyli, tych, które są wykonywane przez skrypty)
- wsparcie dla aliasów (tzn wywalanie ich
)
- wsparcie dla JOINow
Poniżej daję kod. Przetestować funkcję można na
http://www.olek.thc.net.pl/get_tables_from_query.php a ten sam kod jest dostępny na
http://www.olek.thc.net.pl/show_code.php?p...m_query_0.6-dev<?php
/**
* Funkcja zwraca z zapytania mysql nazwy tabel użytych w zapytaniu
*
* Metoda pobiera jako parametr zapytanie mysql a zwraca nazwy tabel w postaci ta
licy.
* Przykład użycia
* <code>
* $query = 'SELECT t1.kolumna1, t2.kolumna2 FROM tabela1 t1, tabela2 t2 WHERE t1.kolumna1 =
2.kolumna2';
* $result = get_tables_from_query( $query );
* // array(2) {
* // [0]=>
* // string(7) \"tabela1\"
* // [1]=>
* // string(7) \"tabela2\"
* // }
* </code>
*
* @author Aleksander Dutkowski
* @access public
* @version 1.0-rc
* @copyright Metoda może być dowolnie uzywana i znieniana
* @param string $sql Zapytanie sql
* @return array Nazwy tabel
*
*/
function get_tables_from_query( $sql )
{
$which = substr( $sql, 0
, 6
); if( $which == 'select' )
{
/*
* Wycinanie SELECT nazwy_tabel
*/
$short_str = strstr($sql, ' from '); // zwoci from i wsio za nim /*
* Wycinanie wszystkiego po nazwach tabel tj. where, group by, having, order
by i limit
*/
$posWhere = strpos($short_str , ' where '); $posGroup = strpos($short_str , ' group '); $posHaving = strpos($short_str , ' having '); $posOrder = strpos($short_str , ' order '); $posLimit = strpos($short_str , ' limit '); if( $posLimit != false )
{
}
if( $posOrder != false )
{
}
if( $posHaving != false )
{
}
if( $posGroup != false )
{
}
if( $posWhere != false )
{
}
{
$min = $arr[0];
} elseif( count( $arr ) > 1
) { }
{
$short_str = substr( $short_str, 6
, $min - 6
); } else {
$short_str = substr( $short_str, 6
); }
$str = $short_str;
while( strPos( $str, 'join' ) != false ) {
$spacja = strPos( $str, ' ' ); $joiny[] = substr( $str, 0
, $spacja ); $str = subStr( $str, $spacja ); }
} elseif( $which == 'insert' )
{
$int = strPos( $sql, 'insert into ' ); if( $int === false )
{
} else {
$short_str = subStr( $sql, $int + 12
); }
$posNawias = strPos( $short_str, '(' ); $posValues = strPos( $short_str, 'values' ); $posSet = strPos( $short_str, 'set' ); if( $posNawias != false )
{
}
if( $posValues != false )
{
}
if( $posSet != false )
{
}
{
$min = $arr[0];
} elseif( count( $arr ) > 1
) { }
{
$short_str = substr( $short_str, 0
, $min -1
); } else {
$short_str = substr( $short_str, 0
); }
echo $short_str . '<br />'; } elseif( $which == 'update' ) {
$short_str = subStr( $short_str, 0
, strPos( $short_str, 'set' ) -1
); } elseif( $which == 'delete' ) {
$short_str = subStr( $sql, strPos( $sql, 'delete from ' ) + 12
); $space = strPos( $short_str, ' ' ); if( $space !== false )
{
$short_str = subStr( $short_str, 0
, $space ); }
}
/*
* Likwidowanie niepotrzebnych spacji
*/
$tables = explode( ',', $short_str ); /*
* Likwidowanie aliasów
*/
foreach( $tables as $key => $val )
{
if( strPos( $val, ' ' ) != false ) {
}
}
{
} else {
$return = &$tables;
}
/*
Zwracanie tablicy z nazwami tabel
*/
return $return;
}
?>