2013-05-02 18 views
0

比方說,我有一份聲明,在這種情況下,一個從特定數據庫表中選擇照片信息:使用可變數據的查詢,以取代硬編碼表名

$conn = dbConnect('query'); 
$bgImage = "SELECT photo_fname 
    FROM photos_bn 
    WHERE gallery_id = ? 
    LIMIT $curPage,".$totalPix; 
$stmt = $conn->prepare($bgImage); 
$stmt->bind_param('i', $gallery); 
$stmt->bind_result($pFname); 
$stmt->execute(); 
$stmt->store_result(); 
$stmt->fetch(); 

而且,由於我在我的數據庫中有幾個處理特定照片主題的表格,人們會認爲我需要爲每個表格分別查詢。上面的代碼從表中選擇信息,photos_bn,但我有其他表格,我們將其稱爲photos_bqphotos_ps

這可能是一個非常明顯的問題,但我該如何去替換一個變量,該變量可以通過查詢字符串或會話變量傳遞給頁面,以便查詢中的表名不會被硬編碼,但是是一個準備好的聲明的一部分?

非常感謝!

回答

1

你必須:

$bgImage = "SELECT photo_fname 
FROM ".$_GET["querystringvar"]." WHERE gallery_id = ? 
LIMIT $curPage,".$totalPix; 

被警告,讓你非常vulerable SQL注入

+0

謝謝!我想我應該是更具體的......我想要一個解決方案是一個準備好的聲明。我很清楚SQL注入的危險,並且在處理變量時只使用預處理語句。 – wordman 2013-05-02 19:48:29

+0

只是跑過這篇文章,想要更新它。有一個SO文章[這裏](http://stackoverflow.com/questions/11312737/can-i-parameterize-the-table-name-in-a-prepared-statement),說我們不能參數化表名帶有佔位符的查詢。如果表名來自用戶輸入,則首先檢查一張表的白名單,然後回答。所以這是正確的答案! – wordman 2015-01-28 04:30:00

0
$bgImage = "SELECT photo_fname "; 

    if ($querystring == 'bn') { 
     $bgImage .= " FROM photos_bn "; 
     } 
    else if ($querystring == 'bq') { 
     $bgImage .= " FROM photos_bq "; 
     } 
    else { 
     $bgImage .= " FROM photos "; 
     } 
$bgImage .= "WHERE gallery_id = ? 
      LIMIT $curPage,".$totalPix; 
    $stmt = $conn->prepare($bgImage); 

喜歡的東西,我猜。檢查你的查詢字符串的值和concat什麼你需要的。不要將純查詢字符串轉換爲SQL字符串。當然這仍然是一種硬編碼方式。但我絕不會建議在沒有任何檢查的情況下,向用戶收取一些東西。

+0

我明白首先檢查變量,謝謝。其實,我喜歡你提出的這種方法,儘管我想用一個變量來做。 – wordman 2013-05-02 19:50:42

0

這樣的事情?

$prep = $mysqli->prepare("SELECT photo_fname FROM photos_? WHERE gallery_id = ? LIMIT ?,?"); 
$prep->bind_param("siii",$_GET['theme_suffix'],$gallery_id,$curPage,$totalPix); 
相關問題