2009-07-15 53 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
  1. 你應該看你的函數參數來自哪裏。如果他們來自不可靠的來源,那麼這是非常不安全的。

    如果有人通過$condition參數中的1 ; DROP TABLE tablename ; SELECT * FROM dual WHERE 1之類的東西,您將獲得Little Bobby Tables方案。

    • 您的查詢將如下所示:

      SELECT ID,姓名,指向 FROM表名 WHERE ID ORDER BY 日期降序 LIMIT 0,10

    id這裏將被鑄造到BOOLEAN,查詢將選擇所有id s除了0NULL

    它真的是你想要的嗎?

    您可能想要將您的$condition更改爲'id = $id'或類似的東西。

    • 您是否真的需要這種抽象級別:從未知字段生成具有未知字段的查詢,但使用預定義的SELECT/FROM/ORDER BY/LIMIT結構?
+0

是的,我打算拆開從參數的照顧,是他們的代碼,任何多餘的線條或一些不好的做法也許.... – halocursed 2009-07-15 15:37:40

+0

將它不是隻選擇由於限制0,10而產生的10個id,或者如果我在某些查詢中不需要它,我應該刪除where子句 – halocursed 2009-07-15 15:42:24