繁体   English   中英

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

[英]Using variable data to replace hard-coded table name in a query

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

$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

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

非常感谢!

你将会拥有:

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

警告,您很容易遭受SQL注入

$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字符串中。 当然,哪一种仍然是硬编码方式。 但我绝不建议您在声明中加入用户收到的未经检查的内容。

这样的东西?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM