использование mysqli для извлечения пользовательских данных - PullRequest
1 голос
/ 15 июля 2009

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

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, в зависимости от данных, которые я хочу извлечь. Будем благодарны за любые улучшения или другие предложения ...

Ответы [ 2 ]

1 голос
/ 15 июля 2009

Вместо привязки результатов и необходимости выполнения циклов можно просто использовать 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 голосов
/ 15 июля 2009
  1. Вы должны посмотреть, откуда берутся параметры для вашей функции. Если они приходят из ненадежного источника, то это очень ненадежно.

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

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

      ВЫБЕРИТЕ идентификатор, имя, очки ОТ таблицы Где id СОРТИРОВАТЬ ПО DATE DESC LIMIT 0, 10

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

    Это действительно то, что вы хотите?

    Вы, вероятно, хотите изменить $condition на 'id = $id' или что-то в этом роде.

    • Вам действительно нужен этот уровень абстракции: генерация запросов из неизвестных таблиц с неизвестными полями, но с предопределенной структурой SELECT / FROM / ORDER BY / LIMIT?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...