2009-07-15 3 views
1

Я использую функцию в php для всех запросов, чтобы я мог динамически извлекать данные из моей базы данных ..... Я просто хотел знать, что мой код безопасен и эффективен, или если их это лучший способ сделать это, если это так, пожалуйста, мне точку в правильном направлении ... спасибос помощью mysqli для извлечения пользовательских данных

class mysql { 
    private $conn;  
    function __construct(){ 
       $this->conn= new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME); 
       if(mysqli_connect_errno()) 
       { 
        trigger_error('Error connecting to host. '.$this->connections[$connection_id]->error, E_USER_ERROR); 
       } 
    } 
function extracting_data($table, $fields,$condition,$order,$limit){ 
     $query="SELECT ".$fields." 
       FROM ".$table." 
       WHERE id =".$this->sql_quote($condition)." 
       ORDER BY ".$order." 
       LIMIT ".$limit." "; 
     //echo $query; 
     if($stmt = $this->conn->prepare($query)) { 
      $stmt->execute(); 
      $row = array_pad(array(), $stmt->field_count, ''); 
      $params = array(); 
       foreach($row as $k=>$v) { 
        $params[] = &$row[$k]; 
       } 
      call_user_func_array(array($stmt,'bind_result'),$params); 
      $result = array(); 
      while($stmt->fetch()) { 
       foreach ($row as $b=>$elem) { 
        $vals[$b]=$row[$b]; 
       } 
       $result[]=$vals; 
      } 
      $stmt->close(); 
      return $result; 

     } 

    } 
    function sql_quote($value) 
    { 
     if(get_magic_quotes_gpc()) 
     { 
      $value = stripslashes($value); 
     } 
    //check if this function exists 
     if(function_exists("mysql_real_escape_string")) 
     { 
       $value = mysql_real_escape_string($value); 
     } 
    //for PHP version < 4.3.0 use addslashes 
     else 
     { 
       $value = addslashes($value); 
     } 
     return $value; 
    } 

} 

Теперь для вызова функции я использую ::>

$connection=New mysql(); 
$extract=$connection->extracting_data("tablename","id,name,points","$_GET['id']","date desc","0,10"); 

функция возвращает многомерный массив в $ result и сохраняет его в $ extract, в зависимости от данных, которые я хочу извлечь. Любые улучшения или другие предложения были бы оценены ...

ответ

1

Вместо связывания результатов и необходимости делать нагрузки зацикливания, вы могли бы просто использовать mysqli::query() и mysqli_result::fetch_all().

if($stmt = $this->conn->query($query)) { 
    $result = $stmt->fetch_all(MYSQLI_ASSOC);     
    $stmt->close(); 
    return $result; 
} 

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

Редактировать

К сожалению, я был идиотом и не заметил, что fetch_all() только в PHP> = 5.3.Вы все еще можете сделать это, хотя, которое проще:

if($stmt = $this->conn->query($query)) { 
    $result = array(); 
    while ($row = $stmt->fetch_assoc()) { 
     $result[] = $row; 
    }    
    $stmt->close(); 
    return $result; 
} 
+0

Мне нужен php ver 5.3 для этого ??? ... – halocursed

0
  1. Вы должны посмотреть, откуда взялись параметры вашей функции. Если они происходят из ненадежного источника, то это очень неуверенно.

    Если кто-то проходит что-то вроде 1 ; DROP TABLE tablename ; SELECT * FROM dual WHERE 1 в параметре $condition, вы получите Tables сценарий Маленький Бобби.

    • Ваш запрос будет выглядеть следующим образом:

      SELECT, идентификатор, имя, указывает FROM имя_таблицы WHERE ID ORDER BY ДАТА DESC LIMIT 0, 10

    id здесь будет отлита до BOOLEAN, и запрос выберет все id s, кроме 0 и NULL.

    Действительно ли это то, что вы хотите?

    Возможно, вы захотите изменить свой $condition на 'id = $id' или что-то в этом роде. порождающие запросы от Неизвестных таблиц с неизвестными полями, но с предопределенной SELECT/FROM/ORDER BY/LIMIT stucture:

    • вам действительно нужен этот уровень абстракции ли?
+0

Да, я планирую заботиться о параметрах, кроме того, являются их любые избыточные строки кода или некоторые плохие практики возможно .... – halocursed

+0

будет его не выбирайте только 10 идентификаторов из-за лимита 0,10 или я должен удалить предложение where, если мне это не нужно в некоторых моих запросах. – halocursed

+0

. Создание различных функций для каждого извлечения увеличило бы размер класса и количество функции, поэтому я подумал, почему бы не создать одну функцию для извлечения всех видов данных ... – halocursed