簡體   English   中英

PHP PDO用於從變量MySQL表中獲取數據的函數

[英]PHP PDO Function for getting data from a variable MySQL Table

我正在嘗試創建一個可以在多個頁面上使用的函數來節省使用的代碼量。 其中一個函數參數應告訴函數哪個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');

為什么功能不起作用? 誰知道?

據我所知,你不能將表作為參數傳遞。 因此,您必須使用字符串連接構建查詢。 在這種情況下,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等。 始終不加選擇地從表中獲取所有數據可能會導致嚴重的性能問題。

@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()execute()的返回值。 它們會在出錯時返回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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM