代码之家  ›  专栏  ›  技术社区  ›  halocursed

使用mysqli提取自定义数据

  •  1
  • halocursed  · 技术社区  · 17 年前

    我在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");
    

    任何改进或其他建议都将不胜感激。..

    2 回复  |  直到 17 年前
        1
  •  1
  •   Tom Haigh    17 年前

    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;
    }
    
        2
  •  0
  •   Quassnoi    17 年前
    1. 您应该注意函数的参数来自哪里。如果它们来自不可靠的来源,那么它就非常不安全。

      如果有人通过类似的东西 1 ; DROP TABLE tablename ; SELECT * FROM dual WHERE 1 $condition 参数,你会得到 小鲍比桌 脚本。

      • 您的查询如下:

        FROM表名 WHERE id 排序依据 限制0,10

      id 这里将被铸造 BOOLEAN ,查询将选择全部 s除了 0 NULL .

      这真的是你想要的吗?

      $条件 'id = $id' 或者类似的东西。

      • 你真的需要这种抽象级别吗:从具有未知字段但具有预定义字段的未知表生成查询 SELECT / FROM / ORDER BY / LIMIT 结构?