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_bq并且photos_ps

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

非常感谢!

4

3 回答 3

1

你将会拥有:

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

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

于 2013-05-02T18:45:34.980 回答
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 字符串中。当然,这仍然是一种硬编码方式。但我绝不会建议在您的声明中放入未经任何检查从用户那里收到的东西。

于 2013-05-02T18:49:10.613 回答
0

像这样的东西?

$prep = $mysqli->prepare("SELECT photo_fname FROM photos_? WHERE gallery_id = ? LIMIT ?,?");
$prep->bind_param("siii",$_GET['theme_suffix'],$gallery_id,$curPage,$totalPix); 
于 2013-05-02T20:01:51.927 回答