1

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

4

2 回答 2

1

mysqli::query()您可以简单地使用and ,而不是绑定结果并进行大量循环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;
}
于 2009-07-15T16:27:50.027 回答
0
  1. 您应该注意函数的参数来自哪里。如果它们来自不可靠的来源,那么它是非常不安全的。

    如果有人通过参数1 ; DROP TABLE tablename ; SELECT * FROM dual WHERE 1中的类似$condition内容,您将获得Little Bobby Tables场景。

    • 您的查询将如下所示:

      SELECT id, name, points FROM tablename WHERE id ORDER BY DATE DESC LIMIT 0, 10

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

    真的是你想要的吗?

    你可能想改变你的$conditionto'id = $id'或类似的东西。

    • 您真的需要这种抽象级别:从具有未知字段但具有预定义结构的未知表生成查询SELECT / FROM / ORDER BY / LIMIT吗?
于 2009-07-15T15:34:47.870 回答