【问题标题】:Using variable data to replace hard-coded table name in a query使用可变数据替换查询中的硬编码表名
【发布时间】:2013-05-02 18:41:52
【问题描述】:

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

$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

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

非常感谢!

【问题讨论】:

    标签: php mysql database


    【解决方案1】:

    你会:

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

    请注意,这会让您很容易受到 SQL 注入的影响

    【讨论】:

    • 谢谢!我想我应该更具体...我想要一个准备好的陈述的解决方案。我深知 SQL 注入的危险,在处理变量时只使用准备好的语句。
    • 刚刚看到这篇文章并想更新它。有一篇 SO 文章 HERE 说我们不能在使用占位符的查询中参数化表名。通过首先检查表名是否来自用户输入的表的白名单来遵循答案。所以这毕竟是正确的答案!
    【解决方案2】:
    $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 字符串中。当然,这仍然是一种硬编码方式。但我绝不会建议在您的声明中放入未经任何检查从用户那里收到的内容。

    【讨论】:

    • 我了解先检查变量,谢谢。实际上,我喜欢你建议的这种方法,尽管我想用一个变量来做。
    【解决方案3】:

    像这样?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 2019-12-04
      • 1970-01-01
      • 2021-01-18
      • 2017-08-17
      • 1970-01-01
      相关资源
      最近更新 更多