Código PHP:
class mysql {
var $link;
var $host;
var $user;
var $pasw;
var $database;
function mysql(){
$args=func_get_args();
if(isset($args[2])){
$this->host = $args[0];
$this->user = $args[1];
$this->pasw = $args[2];
if(isset($args[3])){
$this->database = $args[3];
}
$this->connect();
}
}
function connect(){
$args=func_get_args();
if(isset($args[2])){
$this->host = $args[0];
$this->user = $args[1];
$this->pasw = $args[2];
}
$this->link = mysql_connect($this->host,$this->user,$this->pasw)or die(mysql_error());
if(isset($args[3])){
$this->database = $args[3];
}
if(isset($this->database)){
mysql_select_db($this->database,$this->link)or die(mysql_error());
}
}
function change_database($new_database){
mysql_select_db($new_database,$this->link)or die(mysql_error());
}
var $result;
function query($string){//interfaz de bajo nivel
$query = mysql_query($string)or die(mysql_error());
if($query!=NULL){
if(mysql_num_rows($query)==1){
$return = mysql_fetch_array($query);
}else{
$i=0;
while($row = mysql_fetch_array($query)){
$return[$i] = $row;
$i++;
}
}
if(!isset($return)){
$return = 'No results';
}
$this->result = $return;
return $return;
}
}
private function createQuery($array){
$args = $array;
if(isset($args[0])){
if($args[0]=='select'){
array_shift($args);
if(preg_match('/^!.*$/',$args[0])){
$dis = preg_replace('/^!/','',$args[0]);
$query = 'select distinct '.$dis.' from ';
array_shift($args);
}else{
$query = 'select * from ';
}
}elseif($args[0]=='delete'){
array_shift($args);
$query = 'delete from ';
}
$query .= $args[0];//table
//where clause:
if(isset($args[1]) and !is_bool($args[1])){
if(!preg_match('/^@/',$args[1]) && !preg_match('/^#/',$args[1])){
if(preg_match('/^where /',$args[1])){
$query .= $args[1];
$bool=false;
}elseif(preg_match('/[A-z]/',$args[1]) && isset($args[2])){
$query .= ' where '.$args[1];
$where = explode(',',$args[2]);
if(preg_match('/^\/.*\/$/',$where[0])){
$regexp = preg_replace(array('/^\//','/\/$/'),'',$where[0]);
$query .= ' regexp "'.$regexp.'"';
}else{
$query .= ' = "'.$where[0].'"';
}
for($i=1, $num=count($where);$i<$num;$i++){
$query .= ' or '.$args[1].' ';
if(preg_match('/^\/.*\/$/',$where[$i])){
$regexp = preg_replace(array('/^\//','/\/$/'),'',$where[$i]);
$query .= ' regexp "'.$regexp.'"';
}else{
$query .= ' = "'.$where[$i].'"';
}
}
$bool=true;//revision de los otros argumentos
}else{
$query .= ' where id = "';
$ids = explode(',',$args[1]);
$query .= $ids[0].'"';
for($i=1, $num=count($ids);$i<$num;$i++){
$query .= ' or id = "'.$ids[$i].'"';
}
$bool=false;
}
}
}
if(isset($bool) && $bool){//agumentos restantes de la cláusula where
for($i=3,$num=count($args);$i<$num;$i+2){
if(!isset($args[$i]) or empty($args[$i]) or
preg_match('/^@.*/',$args[$i]) or preg_match('/^#.*/',$args[$i])){
break;
}else{
if(!isset($args[$i+1]) or empty($args[$i+1]) or
preg_match('/^@.*/',$args[$i+1]) or preg_match('/^#.*/',$args[$i+1])){
break;
}else{
if(preg_match('/^&.*/',$args[$i])){
$and = preg_replace('/^&/',' and ',$args[$i]);
$query .= $and;
}else{
$query .= ' or '.$args[$i];
}
$where = explode(',',$args[$i+1]);
if(preg_match('/^\/.*\/$/',$where[0])){
$regexp = preg_replace(array('/^\//','/\/$/'),'',$where[0]);
$query .= ' regexp "'.$regexp.'"';
}else{
$query .= ' = "'.$where[0].'"';
}
for($i=1, $num=count($where);$i<$num;$i++){
$query .= ' or '.$args[1].' ';
if(preg_match('/^\/.*\/$/',$where[$i])){
$regexp = preg_replace(array('/^\//','/\/$/'),'',$where[$i]);
$query .= ' regexp "'.$regexp.'"';
}else{
$query .= ' = "'.$where[$i].'"';
}
}
}
}
}
}
//cláusula order by
$p_last=count($args)-2;
if(preg_match('/^@.*sc$/',end($args)) or
(isset($args[$p_last]) && preg_match('/^@.*sc$/',$args[$p_last]))){
if(preg_match('/^@.*sc$/',end($args))){
$p = explode(' ',end($args));
}else{
$p = explode(' ',$args[$p_last]);
}
$o_by = preg_replace('/^@/','',$p[0]);
if(!isset($p[1])){
$p[1]='asc';
}
$query .= ' order by '.$o_by.' '.$p[1];
}//cláusula limit
if(preg_match('/^#.*/',end($args))){
$limit = preg_replace('/^#/','',end($args));
$query .= ' limit '.$limit;
}
}
return $query;
}
function select(){
$args=func_get_args();
array_unshift($args, 'select');
$query = $this->createQuery($args);
$result = $this->query($query);
//return $query;
return $result;
//return 'Error: no args passed to select() method';
}
function delete(){
$args=func_get_args();
$num_args=func_num_args();
if($num_args<=1){
return 'Security error: delete a complete table requires two arguments';
}else{
if(gettype($args[1])=='bool' && $args[1]){
$query = 'delete from '.$args[0];
}elseif(gettype($args[1])=='bool' && !$args[1]){
return 'Security error: delete a complete table requires two "true" elements';
}else{
array_unshift($args, 'delete');
$query = $this->createQuery($args);
}
}
if(isset($query)){
mysql_query($query)or die(mysql_error());
}
}
function truncate(){
$args=func_get_args();
$num_args=func_num_args();
if($num_args<=1){
return 'Security error: truncate a table requires two arguments';
}else{
if($args[1]){
$query = 'truncate table '.$args[0];
}
}
if(isset($query)){
mysql_query($query) or die(mysql_error());
}
}
function insert(){
$args=func_get_args();
if(isset($args[1])){
$query = 'insert into '.$args[0];
$keys=' (';
$values=' values (';
foreach($args[1] as $key=>$value){
$keys.=$key.',';
$values.='\''.$value.'\',';
}
$keys = substr($keys,0,(strlen($keys)-1)).')';
$values = substr($values,0,(strlen($values)-1)).')';
$query.= $keys.$values;
mysql_query($query)or die(mysql_error());
}
}
}
Es algo larga, pero merece la pena.
Es capaz de trabajar tanto a bajo nivel (un simple mysql_query), como a un nivel más alto. Os pongo la referencia de los métodos:
Código PHP:
$mysql = new mysql($host,$user,$pasw,$database);
$mysql->select([$distinct,]$table[,$row,$matches[,$row2,$matches[, ...]]][,$orderby][,$limit]);
$mysql->delete($table,$row,$matches[,$row,$matches[,..]][,$limit]);
$mysql->truncate($table,$bool);//el $bool es por seguridad
$mysql->insert($table,array($key=>$value));//todavía tengo que mejorar esto
- $distinct es una cadena que empieza por '!' y sigue con las columnas a seleccionar, separadas por comas
- $matches son todas las coincidencias deseadas para el $row, separadas por comas. Se pueden usar expresiones regulares (rodeadas por / y /) y mezclar cadenas exactas y expresiones regulares
- $row2 (y todos los siguientes) puede llevar delante '&', que hará que sea necesario cumplir con todos los $matches pasados como argumentos (where ... and ...), o no llevar nada (where ... or ...).
- $orderby tiene que empezar por '@', luego seguido de la columna índice
- $limit tiene que empezar por '#', luego seguido de dos numeros separados por comas
Es algo difícil de comprender... Pero uno se acostumbra rápido.
Y si no es mucho pedir... podríais postear si encontráis algún bug o mejora posible? gracias
Que podáis hacer uso de la clase
Saludos