php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2009

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 31.05.2009, 15:08  
Erfahrener Benutzer
 
Benutzerbild von Celli
 
Registriert seit: 24.05.2009
Beiträge: 158
Celli befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Regular Expression: Tabellennamen aus query extrahieren

Hallo zusammen,

habe das Problem die Tabellennamen aus einem Query ordentlich zu extahieren.
Würde gerne die Tabellennamen (tabelle1, tabelle2 und tabelle3) aus dem Query erkennen können.
Habe schon diverse Ideen dazu gehabt, aber alle ohne gültigen Ergebnis.

Hat jemand eine Idee ?

PHP-Code:
<?php

    $query    
'Select * FROM tabelle1 as tb1 ';
    
$query .= 'LEFT JOIN tabelle2 on (tb1.id = tabelle2.id) ';
    
$query .= 'RIGHT JOIN tabelle3 as tb3 on (tabelle2.id = tb3.id) WHERE tb1.id = 999';

    
preg_match_all('~.+(?:FROM|JOIN) (.*) (?:as|on)~'$query$results);

    
var_dump($query);
    
var_dump($results);
?>
Der Query ist so nicht festgelegt, er kann mit/ohne 'as' bzw. mit/ohne JOIN variieren.
__________________
Eine Antwort oder Lösung habe ich nicht immer, aber zu 99,9% eine Idee. (200 Posts Limit)

Geändert von Celli (31.05.2009 um 16:37 Uhr).
Celli ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 31.05.2009, 15:15  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Darf man fragen, wozu? Und brauchst Du den Tabellennamen, oder wenn vorhanden den Alias?

Imho stehen die Tabellen immer direkt nach FROM bzw. JOIN, das grösste Problem dürften implizite Joins (Table, Table) sein. Denn da wirds dann mit Aliasen und so etwas schwieriger.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 31.05.2009, 15:19  
Erfahrener Benutzer
 
Benutzerbild von Celli
 
Registriert seit: 24.05.2009
Beiträge: 158
Celli befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Darf man fragen, wozu? Und brauchst Du den Tabellennamen, oder wenn vorhanden den Alias?
Wozu: Ich bräuchte die Tabellennamen für das Laden der Tabellenbeschreibung (DESCRIBE)
Alias: Nein, ich brauche um die Tabellenbeschreibung laden zu können den echten Tabellennamen.

Zitat:
Imho stehen die Tabellen immer direkt nach FROM bzw. JOIN
Richtig, genau das was mein Gedanke. Siehe Regular Expression im Code.
__________________
Eine Antwort oder Lösung habe ich nicht immer, aber zu 99,9% eine Idee. (200 Posts Limit)
Celli ist offline  
Alt 31.05.2009, 15:23  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Naja, im Prinzip müsste man vorher noch die ganzen ON und WHERE Sachen wegschneiden, es ist schliesslich nicht ausszuschliessen, dass FROM oder JOIN auch im Text einer Bedingungsprüfung vorkommen (WHERE title="You join the army now"). Auch Spaltennamen können prinzipiell innerhalb von Backticks solche Keywords beinhalten/sein.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 31.05.2009, 15:59  
Erfahrener Benutzer
 
Benutzerbild von Celli
 
Registriert seit: 24.05.2009
Beiträge: 158
Celli befindet sich auf einem aufstrebenden Ast
Standard

Habe es teilweise gelöst.

PHP-Code:
<?php

    $query    
'Select from as von,join,FROM,JOIN FROM tabelle1 as tb1 ';
    
$query .= 'LEFT JOIN tabelle2 on (tb1.id = tabelle2.id) ';
    
$query .= 'RIGHT JOIN tabelle3 as tb3 on (tabelle2.id = tb3.id) where tb1.id = \'JOIN the army FROM now on\'';

    
$query preg_replace('~WHERE.*~i'''$query);
    
preg_match_all('~[FROM|JOIN]+[^Select]+ ([a-zA-Z_0-9-]+) [as|on]~i'$query$results);

    
var_dump($results);
?>
Ausgabe:
PHP-Code:

array
  
=> 
    array
      
=> string 'from,join,FROM,JOIN * FROM tabelle1 as' (length=38)
      
=> string 'JOIN tabelle2 on' (length=16)
      
=> string 'JOIN tabelle3 as' (length=16)
  
=> 
    array
      
=> string 'tabelle1' (length=8)
      
=> string 'tabelle2' (length=8)
      
=> string 'tabelle3' (length=8
Allerdings dürfen die Tabellennamen keine Leerzeichen enthalten.
Wenn jemand noch einen besseren Vorschlag hat, bitte ich drum.

Edit: Noch den WHERE case abgefangen.
__________________
Eine Antwort oder Lösung habe ich nicht immer, aber zu 99,9% eine Idee. (200 Posts Limit)

Geändert von Celli (31.05.2009 um 16:22 Uhr).
Celli ist offline  
Alt 31.05.2009, 16:29  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Klappt aber nur, wenn zwingend ON oder AS vorhanden ist. Spaltennamen die Schlüsselwörter enthalten, müssen immer in Backticks stehen. Das wäre ein besseres Indiz.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 31.05.2009, 16:37  
Erfahrener Benutzer
 
Benutzerbild von Celli
 
Registriert seit: 24.05.2009
Beiträge: 158
Celli befindet sich auf einem aufstrebenden Ast
Standard

Habe es mit Backticks geändert. Jetzt ist das Problem mit den Leerzeichen ebenfalls gelöst.

PHP-Code:
<?php

    $query    
'Select from as von,join,FROM,JOIN FROM `mein erste tabelle1` ';
    
$query .= 'LEFT JOIN `tabelle2` on (tb1.id = tabelle2.id) ';
    
$query .= 'RIGHT JOIN `tabelle3` as tb3 on (tabelle2.id = tb3.id) where tb1.id = \'JOIN the army FROM now on\'';

    
$query preg_replace('~WHERE.*~i'''$query);
    
preg_match_all('~[FROM|JOIN]+[^Select]+ [`]([a-zA-Z_0-9- ]+)[`] ~i'$query$results);

    
var_dump($results);
?>
Ausgabe:
PHP-Code:
array
  
=> 
    array
      
=> string 'on,join,FROM,JOIN FROM `mein erste tabelle1` ' (length=45)
      
=> string 'JOIN `tabelle2` ' (length=16)
      
=> string 'JOIN `tabelle3` ' (length=16)
  
=> 
    array
      
=> string 'mein erste tabelle1' (length=19)
      
=> string 'tabelle2' (length=8)
      
=> string 'tabelle3' (length=8
__________________
Eine Antwort oder Lösung habe ich nicht immer, aber zu 99,9% eine Idee. (200 Posts Limit)
Celli ist offline  
Alt 31.05.2009, 16:42  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Habe das eigentlich genau anders herum gemeint. Sehe aber gerade,. das bringt ja auch keine Punkte, weil Tabellennamen ja ebenfalls in Backticks stehen können.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Frage zu Regular Expression Schiedsrichter PHP Tipps 2008 1 19.09.2007 16:41
regular expression? Dilandau PHP Tipps 2006 55 30.06.2006 16:10
regular Expression verstehen GothicFiction PHP Tipps 2006 14 23.05.2006 23:15
Regular Expression - Alles zwischen Anführungzeichen PHP Tipps 2005-2 3 05.08.2005 14:07
Regular Expression, Suchen bis zum ersten suppart... PHP-Fortgeschrittene 7 04.05.2005 09:03
Posix Regular Expression Problem PHP Tipps 2005 9 15.02.2005 15:59
[Erledigt] Datum mit Regular Expression kontrollieren PHP Tipps 2004-2 7 06.12.2004 09:44
[Erledigt] regular expression: bin zu blöd PHP-Fortgeschrittene 2 08.11.2004 13:12

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php tabellenname aus query, falls vorhanden regular expr, query tabellennamen, wichtige regular expression tabelle, regular expression php tabelle, tabellennamen aus query extrahieren reex, tabellen aus query regex, expression in a query, php extrahieren regulär, text extriern php tabelle, php query regular expression, tabellenname aus select regex, regular expressions tabelle, regular expression tabelle, regexp wenn vorhanden, var_dump regexpression

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:10 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum