Can PHP PDO Statements accept the table or column name as parameter? (7个答案)
2年前关闭。
[不是重复的-请参阅问题底部的说明]
我有一个关于我一直在思考的问题的查询-开始为一个大型站点编写PHP代码,以及为什么无法最大程度地简化PHP代码。
这是我的意思:
我正在工作的网站有一个functions.php用于(您猜对了)所有PHP函数-登录函数+所有getTable- / insertTable- / updateTable-functions等。
因此,它具有用于页面的getAllVideos函数,以显示页面上的所有视频...以及用于“视频视图”页面的getVideo函数,您可以在其中播放选定的视频...以及用于主页的getVideoRecommended函数。在顶部,您可以查看通过推荐算法选择和订购的推荐视频...以及供用户更新其头像图片的updateAvatar函数...然后您会得到图片...
总而言之,使用所有login // video / userinfo- / get- / insert- / update- / etc-functions时,functions.php文件的长度为21.347行,有时需要进行故障排除。
因此,在大约10秒钟的时间里,我思考并发现,我认为这是一种非常合理的解决方案,可以真正简化代码,并使代码长度达到2-300行,并且非常容易解决问题……然后我尝试了一下,令人失望的是,它不起作用,也不知道为什么。
解:
首先,我们编写一个包含所有内容的get-function,其中包含要传递的所需变量,并在可能的情况下将其默认值设置为ALL
<?php
function getTable($pdo,$columnNames = "*",$tableNames,$condition = 1,$orderBy = "date",$limitOffset = 0,$limitMax = 65000) {
// Reset variables
// Reset session cookies
然后,我们尽可能使用变量中的值进行查询
$prepareTable = $pdo->prepare( "SELECT ? FROM ? WHERE ? ORDER BY ? LIMIT ?, ?" );
$prepareTable->execute([$columnNames,$tableNames,$condition,$orderBy,$limitoffset,$limitmax]);
$getTable = $prepareTable->fetchAll();
然后我们检查是否找到任何东西并做我们需要做的事情
if (!getTable) {
// Take appropriate action, or write appropriate error message
} else {
// make a variable for each column by exploding $columnNames by , and create a session cookie for each to use on webpage
$columnName[] = explode(',',$columnNames);
foreach ($columnName as $row) {
$_SESSION['variable'][] = $row['$columnName'];
}
}
?>
就这样...您现在有了一个可以满足您所有需求的单一选择查询
现在,在视频页面上,我要显示所有视频缩略图,标题和说明,我只是通过首先定义必要的变量来调用所有视频
<?php
$columNames = "thumbnail,title,description";
$tableNames = "videos";
然后只需调用getTable-function(对于所有查询都将是相同的)
getTable($pdo, $columnNames, $tableNames, $condition, $orderBy, $limitOffset, $limitMax)
?>
它会写一个选择语句,看起来像
SELECT thumbnail,title,description FROM videos WHERE 1 ORDERBY date LIMIT 0, 65000
并从网站上的所有视频中搜索并找到缩略图,标题和说明
或者说我想按标题对它们进行排序,我只是添加
$orderBy = title;
等等
如果我只想要5个结果,我只需添加
$limitMax = 5;
等等
您得到图片。
使用这种方法,您可以只使用一个getTable函数来创建想要的任何SELECT语句(相同的方法仅适用于一个INSERT语句,仅一个,UPDATE语句等),从而减少了function.php的使用。无论您的网站大小如何,都需要20.000行到少于200行。
加上有关故障排除的信息:
Troubleshooting now:
There is a problem with the channel-page...
1. go to channel-page and see what function is used
2. go to functions.php and scroll through 20.000+ lines to find the function used
3. find, fix and check error
4. (if more than one function used) repeat 2, 3 and 4 as many times as necessary
Troubleshooting with my approach:
1. go to channel-page and find, fix, and check error in 2-20 lines of code where the getTable-function is called
And Done!
因此,无论您的站点和数据库的大小如何,我的方法不仅可以极大地将functions.php的大小减少到最多300行代码...而且一旦您检查它可以在一页上使用后,您现在再也不必返回并再次检查functions.php是否存在错误...从那时起,将始终在出现问题的特定页面上找到所有错误...,并且最多将在9行代码pr上进行所有故障排除。函数调用检查您定义的变量...就是这样...
我在这个网站上向好人查询,为什么PHP使得我的解决方案无法正常工作? (您不能将变量用于colomNames,TableNames,整个条件和/或orderBy-您仍然需要根据需要在单独的函数中的条件和orderBy中指定columnNames,tableNames和columnName
SELECT title (columnNames)
FROM videos (tableNames)
WHERE username = ? (condition)
ORDER BY date (orderBy)
等等,这使得有必要针对您的每种需求创建一个单独的getTable函数,这违背了我的解决方案的目的,并且随着您的需求,站点和数据库的增长,使functions.php不断增长)
我的解决方案怎么可能?
有人请告诉我为什么将变量传递给columnNames,tableNames,整个条件和orderBy会比其他值更具安全风险(至少到不能执行上述操作的地步)
编辑:删除了可能重复但无关紧要的第二个问题,因为它对我寻求答案的主要问题来说是微不足道的
先感谢您
APM
区别:
我只问IF / HOW是否有可能是事后的想法(因为可能有我未曾考虑过的解决方案-似乎已经过-请参见已接受的解决方案)
我知道这被认为是一种安全风险,因为它破坏了预准备语句的安全性...而且我知道不可能完全按照自己的意愿进行操作(已经抛出了足够多的致命错误来知道这一点)...我的主要问题是在我不理解为什么代码不起作用的意义上,不是怎么做或为什么...我的主要问题是为什么不能做我描述的事情?:
他们可以根据自己的喜好来推荐正确的使用方法-但是在安全性不成问题的SELECT- / UPDATE- / INSERT查询上-例如在显示所有视频或显示某些视频时...为什么它们使不可能做我建议的事?
就目前而言-做我想做的事情(显着减少代码,甚至更重要的是使故障排除变得轻而易举),我将不得不使用公认的解决方案,该解决方案比我想做的要麻烦一些(但仍然比我想做的要好得多)现在完成)或使用两个数据库连接-一个PDO(例如对安全性至关重要的登录功能)和一个用于安全性不需要的功能的“老式” mysqli查询...
这带来了一系列全新的问题
这就是为什么我的问题与众不同的原因...
我的问题更是一个哲学问题,为什么我没有选择采取必要的安全措施并在需要时跳过安全性的原因,因为这是我的网站,请按我的意愿进行操作(理论上)……就是安全性真的冒着巨大的风险让我不应该这样做吗?如果是这样,为什么呢? -这是我的主要问题...
因此,Shadow ...请删除您重复的声明,或指向提出和回答了我的主要问题的地方(顺便说一句,您所链接的问题不包括在内)