2012-11-21 44 views
0

我試圖製作一個功能,可以在多個頁面上使用以節省使用的代碼量。其中一個函數參數應該告訴函數哪個mysql表獲取所有數據,但由於某種原因該函數不起作用。以下是我有:PHP PDO用於從變量中獲取數據的函數MySQL表

function get_data($conn, $type) { 
    $stmt = $conn->prepare("SELECT * FROM :type"); 
    $stmt->bindParam(':type', $type); 
    $stmt->execute(); 
    $results = $stmt->fetchAll(); 
    return $results ? $results : false; 
} 

所以,當我呼籲我的網頁的一個功能我用:

$conn = connect(); 
$results = get_data($conn, 'links'); 

爲什麼沒有功能的工作?有人知道嗎?

+0

問題是? –

+0

爲什麼功能不起作用,對不起。 – Ben

回答

1

據我所知,你不能把表作爲參數。因此,您必須使用字符串連接構建您的查詢。在這種情況下,SQL注入的風險應該爲零,因爲您不應該接受來自外部源的表名稱。

function get_data($conn, $table_name) { 
    // The backticks are used in case table name contains spaces, or it matches a keyword 
    $stmt = $conn->prepare('SELECT * FROM `' . $table_name . '`'); 
    $stmt->bindParam(':type', $type); 
    $stmt->execute(); 
    $results = $stmt->fetchAll(); 
    return $results ? $results : false; 
} 

一進一步指出
雖然我能理解你想要達到的目標,訪問數據的這種方法是非常低效的。首先,你使用星號,當運行查詢時,這通常是一個很大的禁忌。其次,用這種方法你不能添加子句,比如WHERE,JOIN等等。總是從一張表中不加區分地獲取所有數據可能會導致嚴重的性能問題。

1

@Diego是正確的,您不能使用SQL參數作爲表名,列名,SQL關鍵字,值列表(如IN()謂詞)或任何其他表達式。

SELECT :column FROM table -- NO, unless you want to select a constant string 

SELECT * FROM :table -- NO 

SELECT * FROM table WHERE column IN (:list) -- NO 

SELECT * FROM table ORDER BY :column -- NO 

SELECT * FROM TABLE ORDER BY column :asc_or_desc -- NO 

基本上,記住這條規則:如果你能代替SQL參數的投入恆定值(例如帶引號的字符串,日期或整數),這是一個合法使用的參數。否則,不。

SELECT :string FROM table -- OK, but returns value of :string for every row 

SELECT * FROM table WHERE column = :string -- OK 

SELECT * FROM table WHERE column IN (:x, :y, :z) -- OK, one parameter per value 

而且編程PDO時,您應經常檢查的prepare()和​​返回值。他們將返回錯誤false,你應該寫你的代碼來檢測這一點,並作出適當的反應(即日誌錯誤,顯示錯誤頁面,用戶給予一次機會,等)

$stmt = $conn->prepare("SELECT * FROM :type"); // illegal use of parameter 
if ($stmt === false) { 
    // check $pdo->errorInfo(), see documentation 
} 
$stmt->bindParam(':type', $type); 
$status = $stmt->execute(); 
if ($status === false) { 
    // check $stmt->errorInfo(), see documentation 
} 

你甚至可能要檢查的回報其他PDO功能的值。請參閱文檔,其中許多人錯誤地返回false