gpt4 book ai didi

PHP PDO自定义sql查询准备

转载 作者:行者123 更新时间:2023-11-30 23:49:25 24 4
gpt4 key购买 nike

我在使用 PDO 上的 prepare 获取 sql 查询时遇到了一些问题,我有这段代码:

$portfolio = $db->prepare("SELECT * FROM `news`, `:sub` WHERE `news`.`id` = `:sub`.`id_news` AND `page` = `:under` ORDER BY `date` DESC LIMIT :start, :limit");
$portfolio->bindParam(':under', $_GET['under'], PDO::PARAM_STR);
$portfolio->bindParam(':sub', $_GET['sub'], PDO::PARAM_STR);
$portfolio->bindParam(':start', $start, PDO::PARAM_INT);
$portfolio->bindParam(':limit', $limit, PDO::PARAM_INT);
$portfolio->execute();

但这并没有给出任何值,而且我的数据库中的值是正确的,有人知道为什么这不起作用吗?PS:var $start 和 $limit 没问题,没问题,因为它是分页脚本,在所有页面中都工作得很好。

例如我在 url 中:mysite.com/index.php?sub=vid&under=info

所以查询应该是这样的:

"SELECT * FROM `news`, `vid` WHERE `news`.`id` = `vid`.`id_news` AND `page` = `info` ORDER BY `date` DESC LIMIT 0, 10"

那么据我所知,之前拥有此代码应该可以工作并且仍然安全,对吗?

switch($_GET['sub']){
case "vid":
$table = "vid";
break;
case "img":
$table = "img";
break;
}
$portfolio = $db->prepare("SELECT * FROM `news`, `$table` WHERE `news`.`id` = `$table`.`id_news` AND `page` = :under ORDER BY `date` DESC LIMIT :start, :limit");

最佳答案

您不能将查询参数占位符用于表名或列名。

仅使用查询参数来替代表达式中的文字值。 IE。带引号的字符串、带引号的日期或数值。

此外,即使您为字符串或日期使用参数,参数也不会放在引号内。

要使表名或列名动态化,您必须在将字符串提交给 prepare() 之前将应用程序变量插入到您的 SQL 字符串中。

但是要小心验证用户输入(例如 $_GET 变量)以避免 SQL 注入(inject)。例如,根据已知合法表名列表测试输入。

例子:

$subtables = array(
"DEFAULT" => "text",
"text" => "text",
"vid" => "vid",
"pic" => "pic"
);

// if the key exists, use the table name, else use the default table name
$subtable = $subtables[ $_GET["sub"] ] ?: $subtables[ "DEFAULT" ];

// now $subtable is effectively whitelisted, and it is safe to use
// without risk of SQL injection

$portfolio = $db->prepare("SELECT *
FROM news, `$subtable` AS sub
WHERE news.id = sub.id_news
AND page = :under
ORDER BY date DESC LIMIT :start, :limit");

关于PHP PDO自定义sql查询准备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19098613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com