MySQL Search and Query

sjobbe 24.07.05 17:39

Helppo tapa penkoa tietokantaa

 Tekstiversio  Arvo: 1 (3 ääntä)  Äänestä: +  -
<?php

#############################################################
#
#   How to use:
#   
#    include("mysql.class");
#
#    $sql_class = new MySQL();
#    $sql_class -> do_mysql_connect();
#
#    Query:
#        $sql = "SELECT * FROM some_table WHERE 1";
#
#        $res = $sql_class -> run_sql_query($sql);
#        $array = $sql_class -> return_sql_array($sql);
#
#        $num = $sql_class -> return_sql_rows($sql);
#
#    Search:
#        $sql_class -> setidentifier("MyPrimaryKey");
#        $sql_class -> settable("MyTable");
#        $results_array = $sql_class -> run_sql_search($mysearchterms);
#
#    Optional:
#        $sql_class -> setsearchcolumns("Name, Description");
#
#############################################################


class MySQL
{
    var $mysql;
   
    function define_settings()
    {
        $this -> mysql['host'] = "localhost";
        $this -> mysql['user'] = "sjobbe";
        $this -> mysql['pass'] = "asdasd";
        $this -> mysql['db'] = "asdasd";

        $this -> mysql['con_error'] = "MySQL encountered a severe error while trying to connect to the host";
        $this -> mysql['db_error'] = "MySQL encountered a severe error while trying to use the database";
        $this -> mysql['gen_error'] = "MySQL Error: Due to a database error this page cannot be displayed";

        $this -> mysql['log_file'] = "mysql_errors.log";
    }
   
    function do_mysql_connect()
    {
        $this -> define_settings();

        $mysql_connect = @mysql_pconnect($this -> mysql['host'], $this -> mysql['user'], $this -> mysql['pass']);
        $mysql_database = @mysql_select_db($this -> mysql['db']);

        if (!$mysql_connect)
        {
            echo "<p style=\"font-weight: bold\">".$this -> mysql['con_error']."</p>\n";
           
            $sql_class = new MySQL();
            $sql_error = mysql_error();
            $sql_log = $sql_class -> log_sql_error("mysql_pconnect", $sql_error);
        }
        elseif (!$mysql_database)
        {
            echo "<p style=\"font-weight: bold\">".$this -> mysql['db_error']."</p>\n";
           
            $sql_class = new MySQL();
            $sql_error = mysql_error();
            $sql_log = $sql_class -> log_sql_error("mysql_select_db", $sql_error);
        }
    }

    function setidentifier($entry_identifier)
    {
        $this -> entry_identifier = $entry_identifier;
    }

    function settable($table)
    {
        $this -> table = $table;
    }
   
    function setsearchcolumns($columns)
    {
        $this -> searchcolumns = $columns;
    }

    function run_sql_search($keywords)
    {
        $keywords_array = explode(" ", $keywords);

        if (!$this -> searchcolumns)
        {
            $this -> searchcolumns = "*";
            $search_data_sql = "SELECT ".$this -> searchcolumns." FROM ".$this -> table;
        }
        else
        {
            $search_data_sql = "SELECT ".$this -> entry_identifier.",".$this -> searchcolumns." FROM ".$this -> table;
        }

        $search_data_ref = @mysql_query($search_data_sql);

        $search_results_array = array();

        if ($search_data_ref)
        {
            while ($all_data_array = @mysql_fetch_array($search_data_ref))
            {
                $my_ident = $all_data_array[$this -> entry_identifier];

                foreach ($all_data_array as $entry_key => $entry_value)
                {
                    foreach ($keywords_array as $keyword)
                    {
                        if ($keyword)
                        {
                            if (stristr($entry_value, $keyword))
                            {
                                $keywords_found_array[$keyword]++;
                            }
                        }
                        else
                        {
                            $keywords_found_array[$keyword]++;
                        }
                        unset($keyword);
                    }
   
                    if (sizeof($keywords_found_array) == sizeof($keywords_array))
                    {
                        array_push($search_results_array, $my_ident);
                        break;
                    }
                }
                unset($keywords_found_array);
                unset($entry_key);
                unset($entry_value);
            }
        }

        $this -> numresults = sizeof($search_results_array);

        return $search_results_array;
    }

    function run_sql_query($sql_code)
    {
        $sql_result = @mysql_query($sql_code);
   
        if (!$sql_result)
        {
            $sql_error = mysql_error();
           
            echo "<p style=\"font-weight: bold\">".$this -> mysql['gen_error']."</p>\n";
           
            $this -> log_sql_error($sql_code, $sql_error);
            return(false);
        }
        else
        {
            return($sql_result);
        }

        mysql_free_result($sql_result);
    }
   
    function return_sql_array($sql_code)
    {
        $sql_result = @mysql_query($sql_code);
       
        if (!$sql_result)
        {
            $sql_error = mysql_error();
           
            echo "<p style=\"font-weight: bold\">".$this -> mysql['gen_error']."</p>\n";
           
            $this -> log_sql_error($sql_code, $sql_error);
            return(false);
        }
        else
        {
            $sql_array = @mysql_fetch_array($sql_result, MYSQL_ASSOC);
            return($sql_array);
        }

        mysql_free_result($sql_result);
    }
   
    function return_sql_rows($sql_code)
    {
        $sql_result = @mysql_query($sql_code);
       
        if (!$sql_result)
        {
            $sql_error = mysql_error();
           
            echo "<p style=\"font-weight: bold\">".$this -> mysql['gen_error']."</p>\n";
           
            $this -> log_sql_error($sql_code, $sql_error);
            return(false);
        }
        else
        {
            $sql_num_rows = @mysql_num_rows($sql_result);
            return ($sql_num_rows);
        }

        mysql_free_result($sql_result);
    }
   
    function log_sql_error($sql_code, $sql_error)
    {
        $this -> define_settings();
       
        if ($log_file = fopen($this -> mysql['log_file'], "a"))
        {
            $message = "[".$_SERVER["REMOTE_ADDR"]."] MySQL query ".$sql_code." produced this error: ".$sql_error;

            fwrite($log_file, date("[d-m-Y H:i:s] ").$message."\n");
            fclose($log_file);
            exit;
        }
    }
}

?>

sjobbe 17:41 24.7.05 
Ehdotuksia. Onko jokin tuossa tyhmästi tehty?
petri_koo 11:50 4.8.05 
Itsekin olen jotain vastaavaa tehnyt ja totesin että eipä sitä php-kielessä juurikaan tarvita....
Ezku 12:52 11.8.05 
Vaikken itse tekisikään hommaa aivan näin, annetaan plussa hyvästä yrityksestä. Tietokanta-abstraktio on iloinen asia. :)
nikohuja 16:09 19.3.06 
Olisin lisännyt vastaavan, mutta aloin penkoa, ja joku olikin jo lisännyt :)
Oma luokkani on 91 riviä (kommentoituna ja kummemmin "lyhentelemättä"), muttä siinä ei ole logimahdollisuutta.

Tosin virhetilanteessa voidaan debug-moodissa antaa vähän tarkempaa tietoa, kuin tässä. Käytän siinä debug_print_backtrace() -funktiota, joka kertoo aika hyvin missä päin koodia vika on jne.
Jos koodaa paljon luokka-pohjaisesti, niin on vähintään näppärä nähdä, missä mahdollinen vika lymyilee :)

Ja tuohon tarpeellisuuteen vielä sen verran, että itse olen ainakin päätynyt käyttämään omaa luokkaani, koska siinä säästää ne iänikuiset mysql_ -härpäkkeet, eikä mysql_connect:ia tarvitse itse käyttää lainakaan. Käytönnössä koodi näyttää tältä:
$sql = sprintf("SELECT * FROM kanta WHERE id = %d LIMIT 1", $id);
$db->query($sql);


Omasta mielestäni ainakin on helpompi lukea ja kirjoittaa :) Toki tämä on vain mielipide.
Niin, ja sen verran vielä, että suosittelen tuon sprintf():n käyttöä, koska sillä saa aika hyvän suojan vielä sql-injectionia vastaan monessa tilanteessa. (Esim. tässä tilanteessa id:ksi kelpaa ainoastaan luku)