| Uutiset | Koodikirjasto | Wiki | Keskustelut | FAQ | Info |
MySQL Search and Querysjobbe 24.07.05 17:39 Helppo tapa penkoa tietokantaa
<?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) |
![]() Haku
|