Avatar billede phpbegynder2004 Nybegynder
31. maj 2007 - 18:27 Der er 12 kommentarer og
1 løsning

Åbn fil og hent alle mysql_queries

Hej Eksperter,

Jeg har en masse dårlige sql_queries som jeg gerne vil have optimeret. Jeg har gået en masse af dem igennem manuelt, men så tænkte jeg, om det ikke kunne gøres automatisk.
Jeg har tænkt mig del således:
1. Åbn php-filerne i en mappe, én efter én.
2. Hent alle SELECT queries. f.eks. mysql_query("SELECT celle FROM tabel WHERE noget='etellerandet'");
Alle disse sql_queryes skal herefter udskrives:
mysql_query("explain SELECT celle FROM tabel WHERE noget='etellerandet'");

På denne måde kan jeg hurtigt se, hvilke queries der skal optimeres :)

På forhånd tak :)
Avatar billede j4k0b Nybegynder
31. maj 2007 - 21:00 #1
Hvad lyder dit spørgsmål på? :-)
Avatar billede phpbegynder2004 Nybegynder
31. maj 2007 - 21:41 #2
Hehe... Du siger noget :)

Altså, Nu gør jeg således: kigger hundredevis af php-filer igennem, tager hver eneste select-sql-statement i hver eneste fil og smækker den ind i phpmyadmin med Explain foran og derved kan jeg optimere min kommando.

Det kunne være rart med et script, der automatisk kører gennem alle mine php-filer, henter alle select-sql-statement og udfører dem med EXPLAIN foran. Så kan jeg så herefter optimerer manuelt hvor det er nødvendigt...

Kan I hjælpe mig med at skrive sådan et script?

På forhånd tak!
Avatar billede jakobdo Ekspert
31. maj 2007 - 21:52 #3
Ikke testet, men prøv:

<?php

$dir = '/noget/';

foreach(glob($dir . "*.php") as $filename)
{
    $content = file_get_contents($filename);
    if(preg_match_all('/(mysql_query\\(("|\')SELECT.+?("|\')\\);)/si', $content, $result))
    {
        echo '<b>FILENAME : ' . $filename . '</b><br />';
        for ($i = 0; $i < count($result[0]); $i++)
        {
            echo $bodytag = str_ireplace("SELECT", "EXPLAIN SELECT", $result[0][$i]) . '<br />';
        }
    }
}
?>
Avatar billede jakobdo Ekspert
31. maj 2007 - 21:53 #4
Udskrivningen skal være:
echo = str_ireplace("SELECT", "EXPLAIN SELECT", $result[0][$i]) . '<br />';
(for meget copy/paste)
Avatar billede phpbegynder2004 Nybegynder
31. maj 2007 - 22:07 #5
Super sejt! Mange tak :)

Jeg er dog stødt på et problem:

$sql="SELECT * FROM tabel WHERE id=''";
mysql_query($sql);

Er det muligt at den også bliver opfanget?
Avatar billede jakobdo Ekspert
01. juni 2007 - 07:33 #6
Prøv denne:

if(preg_match_all('/\\(?("|\')(SELECT(.+?))("|\')\\)?;/si', $content, $result))

og jeg tror så du skal bruge: $result[1][$i]
Avatar billede j4k0b Nybegynder
01. juni 2007 - 08:36 #7
Du kunne også bruge en form for Db wrapper, som opsamler alle dine queries løbende som de bliver eksekveret. Mit eksempel nedenfor kan let omskrives til at gøre dette (har ikke testet koden nedenfor):


class Db {

    private $__connected = false;
    private $__resource = 0;
    private $__result = null;


    public function is_connected() {
        return $this->__connected;
    }


    public function connect($host, $user, $passwd, $db) {
        if($this->__connected) {
            return true;
        } elseif(!$this->__resource = @mysql_connect($host, $user, $passwd)) {
            return false;
        } elseif(@mysql_select_db($db, $this->__resource)) {
            return false;
        } else {
            $this->__connected = true;
            return true;
        }
    }


    public function query($sql) {
        $this->__result = mysql_query($sql, $this->__resource) or die(mysql_error());
    }


    public function fetch() {
        return mysql_fetch_array($this->__result);
    }


    public function rowcount() {
        return mysql_num_rows($this->__result);
    }

}


// Eksempel på brug

    $db = new Db();
    $db->connect('localhost', 'john', 'johnson', 'testdb');

    if(!$db->is_connected()) {
        die('Kunne ikke skabe forbindelse til databasen');
    }

// Hent og udskriv flere rækker på samme tid

    $db->query('SELECT * FROM tabel');

    print $db->rowcount() . ' resultater';

    while($row = $db->fetch()) {
        print_r($row);
    }


// Hent og udskriv kun 1 række

    $db->query('SELECT * FROM tabel LIMIT 1');
    print_r($db->fetch());
Avatar billede phpbegynder2004 Nybegynder
17. september 2007 - 02:51 #8
Læg et svar jackbdo :)
Avatar billede phpbegynder2004 Nybegynder
17. september 2007 - 02:51 #9
ups.. Men jakob :)
Avatar billede jakobdo Ekspert
17. september 2007 - 07:41 #10
J4KOB eller JAKOBDO?
Avatar billede phpbegynder2004 Nybegynder
18. september 2007 - 18:16 #11
JAKOBDO
Avatar billede jakobdo Ekspert
18. september 2007 - 18:35 #12
Svar!
Avatar billede jakobdo Ekspert
25. september 2007 - 21:33 #13
Takker for point.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester