【问题标题】:using mysqli to extract custom data使用 mysqli 提取自定义数据
【发布时间】:2010-11-11 01:18:01
【问题描述】:

我在 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 中,具体取决于我要提取的数据.. 任何改进或其他建议将不胜感激...

【问题讨论】:

    标签: php mysql oop mysqli


    【解决方案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;
    }
    

    【讨论】:

      【解决方案2】:
      1. 您应该注意函数的参数来自哪里。如果它们来自不可靠的来源,则非常不安全。

        如果有人在$condition 参数中传递类似1 ; DROP TABLE tablename ; SELECT * FROM dual WHERE 1 的内容,您将得到小鲍比桌 场景。

        • 您的查询将如下所示:

          SELECT id、name、points FROM 表名 地点编号 订购方式 日期说明 限制 0、10

        这里的id 将被强制转换为BOOLEAN,查询将选择除0NULL 之外的所有id

        真的是你想要的吗?

        您可能希望将您的 $condition 更改为 'id = $id' 或类似的东西。

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

      【讨论】:

      • 是的,我打算处理除此之外的参数,它们是否有多余的代码行或一些不良做法......
      • 由于限制 0,10 是否只选择 10 个 ID,或者如果我在某些查询中不需要它,我应该删除 where 子句
      • 。为每次提取创建不同的函数会增加类的大小和函数的数量,所以我想为什么不创建一个函数来提取各种数据...
      猜你喜欢
      • 1970-01-01
      • 2013-02-04
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-04
      • 2011-09-05
      • 2015-01-01
      相关资源
      最近更新 更多