使用可变数据替换查询中的硬编码表名

时间:2013-05-02 18:41:53

标签: php mysql database

假设我有一个准备好的声明,在这种情况下,是从数据库中的特定表中选择照片信息的声明:

$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

这可能是一个非常明显的问题,但是如何将表名替换为可以通过查询字符串或会话变量传递给页面的变量,以便查询中的表名不是硬编码的,但是是准备好的声明的一部分吗?

非常感谢!

3 个答案:

答案 0 :(得分:1)

你会:

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

请注意,使您非常容易受到SQL注入

答案 1 :(得分: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);

我想是这样的。检查查询字符串的值,并根据需要进行连接。不要将纯查询字符串连接到SQL字符串中。当然这仍然是一种硬编码的方式。但是我绝不会建议在没有任何检查的情况下在用你的陈述中记录用户收到的东西。

答案 2 :(得分:0)

这样的事情?

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