2015-05-24 5 views
0

Я создаю веб-приложение, которое в значительной степени опирается на получение данных из MySQL с помощью PHP. В ~ 50 функций У меня есть очень похожий код запрашивающего отдельных значений данных из MySQL:Общая функция PHP для получения данных из базы данных MySQL

function get_profile_picture($whatmember) { 
    global $connection; 
    $whatmember = mysql_prep($whatmember); 
    $query = "SELECT picture_location FROM members WHERE member_id={$whatmember} LIMIT 1"; 
    $returnval = mysqli_query($connection,$query); 
    if(!$returnval) { 
     return "Query failed: " . mysqli_error($connection); 
    } 
    if(mysqli_num_rows($returnval) > 0) { 
     $row = mysqli_fetch_assoc($returnval); 
     return $row["picture_location"]; 
    } 
    return false; 
} 

Так что мой вопрос заключается в следующем: существует ли универсальный и безопасный способ сделать функцию, так что я могу просто ввести «SELECT что- value FROM what-database.what-table WHERE what-criteria = what-value ", который позволяет массивы результатов, а также одиночные значения? Я сделал попытку с нижеследующим, но это, очевидно, хак и слэш метод, который получает только одно значение:

function get_single_value($database_name,$column_name,$table_name,$criteria,$criteria_value) { 
    $database_name = mysql_prep($database_name); 
    $column_name = mysql_prep($column_name); 
    $table_name = mysql_prep($table_name); 
    $criteria = mysql_prep($criteria); 
    $criteria_value = mysql_prep($criteria_value); 

    if(!empty($column_name) && !empty($table_name) && !empty($criteria) && !empty($database_name)) { 
     global $connection; 
     global $gamesconnection; 
     global $locationconnection; 

     if($database_name=="connection") { 
      $database_connection = $connection; 
     } else if ($database_name=="games") { 
      $database_connection = $gamesconnection; 
     } else if ($database_name=="locations") { 
      $database_connection = $locationconnection; 
     } else { 
      die("Database connection doesn't exist for {$database_name}."); 
     } 
     $query = "SELECT {$column_name} FROM {$table_name} WHERE {$criteria}='{$criteria_value}' LIMIT 1"; 
     $result = mysqli_query($database_connection,$query); 
     if(!$result) { 
      die("Unable to get {$column_name} from {$table_name}. Error: " . mysqli_error($database_connection) . " Query: " . $query); 
     } 
     if(mysqli_num_rows($result)>0) { 
      $row = mysqli_fetch_assoc($result); 
      return $row[$column_name]; 
     } 
    } 
    return false; 
} 

И мой get_profile_picture() функция будет выглядеть примерно так:

function get_profile_picture($whatmember) { 
    return get_single_value("connection","picture_location","members","member_id",$whatmember); 
} 

Я все еще довольно новичок в PHP и MySQL, поэтому любые указатели на улучшение моего кода также будут отличными. Заранее спасибо!

+1

почему бы не найти дб конкретных рамок для этой –

+0

я не знаю, что вы имеете в виду, у вас есть какие-либо предложения? –

+0

Ваша идея не новая, ее сделали. поэтому вместо того, чтобы изобретать колесо ... –

ответ

0

Хорошо, что я написал свои собственные. У него может не быть безопасности PDO, но у меня нет другой возможности для ее использования.

function get_from_database($database_variable) { 
    //PASS IN $database_variable WHICH IS AN OBJECT CONTAINING THE FOLLOWING POSSIBLE VALUES 
    $database_name = $database_variable["database_name"]; //DATABASE NAME 
    $column_name = $database_variable["column_name"]; //COLUMN(S) BEING REQUESTED 
    $table_name = $database_variable["table_name"]; //TABLE BEING SEARCHED 
    $criteria = $database_variable["criteria"]; // 'WHERE X' 
    $limit = $database_variable["limit"]; //ANY LIMITS, IF REQUIRED 
    $group_by = $database_variable["group_by"]; //ANY GROUPING, IF REQUIRED 
    $order_by = $database_variable["order_by"]; //ANY SORT ORDERING, IF REQUIRED 
    if(!empty($column_name) && !empty($table_name)&& !empty($database_name)) { 
     global $connection; 
     global $gamesconnection; 
     global $locationconnection; 
     global $olddataconnection; 

     if($database_name=="connection") { 
      $database_connection = $connection; 
     } else if ($database_name=="games") { 
      $database_connection = $gamesconnection; 
     } else if ($database_name=="locations") { 
      $database_connection = $locationconnection; 
     } else if ($database_name=="olddata") { 
      $database_connection = $olddataconnection; 
     } else { 
      error_log("\nDatabase connection doesn't exist for {$database_name}." . get_backtrace_info()); 
      return false; 
     } 
     if(is_null($limit)) { 
      //IF LIMIT NOT SUPPLIED, MAKE LIMIT 0, IE NO LIMIT 
      $limit = 0; 
     } 
     if(is_int($limit)==false) { 
      //NOT AN INTEGER 
      error_log("\nError in limit provided: " . $limit . get_backtrace_info()); 
      return false; 
     } 
     $query = " SELECT {$column_name} 
        FROM {$table_name} " . (!empty($criteria) /*CHECK IF CRITERIA WAS REQUIRED*/ ? " 
        WHERE {$criteria} " : "") . (!empty($group_by) /*CHECK IF GROUP BY WAS REQUIRED*/ ? " 
        GROUP BY {$group_by} " : "") . (!empty($order_by) /*CHECK IF ORDER BY WAS REQUIRED*/ ? " 
        ORDER BY {$order_by} " : "") . ($limit!==0 /*CHECK IF LIMIT WAS REQUIRED*/ ? " 
        LIMIT {$limit} " : ""); 

     $result = mysqli_query($database_connection,$query); 
     if(!$result) { 
      error_log("\nUnable to process query, got error: " . mysqli_error($database_connection) . "\nQuery: " . $query . get_backtrace_info()); 
      return false; 
     } 
     if(mysqli_num_rows($result)>0) { 
      //RESULT SUPPLIED 
      $row_array = array(); 
      while($row = mysqli_fetch_assoc($result)) { 
       $row_array[] = $row; 
      } 
      mysqli_free_result($result); 
      return $row_array; 
     } 
    } 
    return false; 
} 

Функция отслеживания вызов функции обратно к источнику:

function get_backtrace_info(){ 
    //GET INFORMATION ON WHICH FUNCTION CAUSED ERROR 
    $backtrace = debug_backtrace(); 
    $backtrace_string = ""; 
    for($i=0;$i<count($backtrace);$i++) { 
     $backtrace_string .= '\n'; 
     if($i==0) { 
      $backtrace_string .= 'Called by '; 
     } else { 
      $backtrace_string .= 'Which was called by '; 
     } 
     $backtrace_string .= "{$backtrace[$i]['function']} on line {$backtrace[$i]['line']}"; 
    } 
    return backtrace_string; 
} 

Теперь я могу запросить данные из MySQL следующим образом: Одно значение просил:

function get_profile_picture($whatmember) { 
    $linked_member_code = get_linked_member_code($whatmember); 
    return get_from_database([ "database_name" => "connection", 
           "column_name" => "picture_location", 
           "table_name" => "members", 
           "criteria"  => "linked_member_code='{$linked_member_code}' AND team_id=0", 
           "limit"   => 1 
          ])[0]["picture_location"]; 
} 

2 значения просил:

function get_city_and_region_by_id($whatid) { 
    $row = get_from_database([ "database_name" => "locations", 
           "column_name" => "city, region", 
           "table_name" => "cities", 
           "criteria"  => "row_id={$whatid}", 
           "limit"   => 1 
          ]); 
    return $row[0]["city"] . ", " . $row[0]["region"]; 
} 

Неизвестно количество строк:

function get_linked_teams($linkedmembercode) { 
    return get_from_database([ "database_name" => "connection", 
           "column_name" => "team_id", 
           "table_name" => "members", 
           "criteria"  => "linked_member_code='{$linkedmembercode}' AND team_id!=0" 
          ]); 
}