2013-05-02 50 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); 
相关问题