我只是有一个通用的数据库理论问题.我需要制作类似于显示用户观看过的帖子/项目(例如在论坛中)或未读电子邮件的内容.我所拥有的是有多个用户可以查看的帖子,但它需要由实际查看过的用户分开.因此,如果用户A查看了帖子1,它将不再显示帖子1是要查看的新项目,但是对于用户B,它仍然会显示帖子1是要查看的新项目.
我已经搜索了其他想法,其中一个是获取用户上次登录时间的时间戳,但实际上我需要跟踪他们看到的帖子,而不是自上次登录后发生的帖子.
如果可能的话,我想要一个MySQL数据库解决方案,但如果必须的话,我愿意接受cookie.我可以自己完成这个并且弄清楚,但我很欣赏任何有关如何正确构建表格以使其最有效的建议.此外,带宽和存储不是问题.
在我上班的公司,他们运行PHP/MySQL关系数据库.我一直认为,如果我需要从不同的表中提取不同的信息,我可以做一个简单的连接来提取数据,如....
SELECT table_1.id, table_2.id FROM table_1 LEFT JOIN table_2 ON table_1.sub_id = table_2.id
Run Code Online (Sandbox Code Playgroud)
当我到达目前工作的地方时,这就是他们所做的.
<?php $query = mysql_query("SELECT sub_id FROM table_1");
while($rs = mysql_fetch_assoc($query)) {
$query_2 = mysql_fetch_assoc(mysql_query("SELECT * FROM table_2 WHERE id = '{$rs['sub_id']}'"));
//blah blah blah more queries
?>
Run Code Online (Sandbox Code Playgroud)
当我问为什么这是第二种方式时,他们说它实际上比连接运行得更快.他们管理一个数据库,该数据库在不同的表上有数百万条记录,而且有些表格有点宽(按行方式).他们说,如果执行不当的查询可能会锁定一个表(或其中几个),他们想避免连接.另外要记住的是,有一个大型报表生成器附加到此数据库,客户端可以使用它来构建自己的报表,如果它们发疯并构建一个大型报表,则可能会造成一些严重破坏.
我很困惑,所以我想我会把它扔到那里为一般的编程公众.这可能是一个观点问题,但是执行while语句真的更快(一个更大的查询来拉大量行,然后是很多小的子查询,如果你愿意)或者做一个连接(拉一次更大的查询,以获得您需要的所有数据).只要索引正确完成,重要吗?另一件需要考虑的事情是当前的数据库是InnoDB格式.
谢谢!
2014年8月28日更新
所以我想我会对这个更新,以及更长远的工作.在讨论之后,我决定在这里重建报告生成器.我没有明确的结果数字,但我想我会分享结果.
我觉得有点矫枉过正,因为我将整个报告(就返回的数据而言非常有活力)变成了一个大规模的连接节目.大多数连接(如果不是全部)都将一个值加入主键,因此它们都运行得非常快.如果报告允许说出30列数据并且它提取了2000条记录,则每个字段都在运行查询以获取数据(因为该数据可能位于不同的字段上).30 x 2000 = 60000甚至在每个查询的甜蜜查询时间0.0003秒之间,这仍然只是查询时间的18秒(这几乎就是我记得它).现在我将查询重建为一堆主键上的大量连接(如果可能),同样的报告在大约2-3秒内加载,大部分时间都是下载html.每个返回的记录在0-4个额外查询之间运行,具体取决于所需的数据(如果可以在连接中获取它,则可能不需要任何数据,这种情况发生在75%的时间).因此,相同的2000条记录将返回额外的0-8000个查询(远远好于60000).
我会说while语句在某些情况下很有用,但正如下面评论中所述,基准测试就是它的全部内容.在我的例子中,连接是更好的选择,但在我的网站的其他区域,while语句更有用.在一个实例中,我有一个报告,其中客户端可以请求多个类别,并仅返回这些类别的数据.发生了什么事情,我有一个category_id IN(...,...,..,.., etc etc etc)50-500的ID,索引会扼杀我的怀抱,因为我在最后时刻拿着它.所以我所做的就是在10组展开的ID,并运行相同的查询X/10次,我的结果是取的方式,因为指数喜欢处理10点的ID,而不是500比以前快了,所以我就看见一个很大的进步我的查询然后因为做了while语句.
我有一个非复杂的问题......似乎比它应该更复杂.
我有一个简单的表单,用于向网站添加内容.一些字段需要输入html.但是,当您将某些html元素输入到表单的不同部分时,它会决定它讨厌您并抛出禁止的403错误.这是下面的表格:
<?php
$data = f("SELECT * FROM table WHERE id = '{$_GET['id']}'");
?>
<form action="<?=$_SERVER['PHP_SELF']?>?id=<?=$_GET['id']?>&action=edit" method="post">
<table cellspacing="0" cellpadding="2" border="0">
<tr>
<td><b>Title:</b></td>
<td><input type="text" name="title" style="width: 300px;" value="<?=$data['title']?>" /></td>
</tr>
<tr>
<td><b>URL:</b></td>
<td><input type="text" name="url" style="width: 300px;" value="<?=$data['url']?>" /></td>
</tr>
<tr>
<td><b>Sub-Category:</b></td>
<td>
<select name="subCategoryId">
<option value=""></option>
<option value="1">A</option>
<option value="2">B</option>
</select>
</td>
</tr>
<tr>
<td><b>Short Description:</b></td>
<td><textarea name="shortDescription" rows="6" cols="60"><?=$data['shortDescription']?></textarea></td>
</tr>
<tr>
<td><b>Template:</b></td>
<td><textarea name="template" rows="6" cols="60"><?=$data['template']?></textarea></td>
</tr>
<tr>
<td><b>Ads:</b></td>
<td><textarea name="ads" rows="6" cols="60"><?=$data['ads']?></textarea></td>
</tr>
<tr>
<td><b>Keywords:</b></td>
<td><textarea …Run Code Online (Sandbox Code Playgroud) 我做了很多研究,我发现了很多东西,但是还没能找到能做我需要做的事.首先,我在运行ModSecurity 2.7.3的CentOS 7服务器上.
我希望能够扫描除某些参数之外的所有参数,并通过已经设置的所有标准核心规则运行它们.例如,如果我有一个文件path/to/myfile.php,它有2个参数发送给它param1和param2.当用户点击时,myfile.php我希望它能够运行它可以反对的所有可爱的检查param1,param2除非param2我不需要它进行检查,WEB_ATTACK/XSS因为它应该期望该字段的某些HTML(或其他).
我不认为我可以通过ID删除规则(除非我的理解有缺陷).我们目前正在登台服务器上进行设置,然后我们将安装ModSecurity以及我们在登台服务器上设置的排除项,并将它们复制到实时服务器.我不认为规则ID会与登台日志相匹配(除非我误解了某些内容)并且在我们的实时服务器上抛出ModSecurity并等待规则开始跳闸并不"有趣".
这是我试过的......
<LocationMatch /path/to/myfile.php>
<IfModule mod_security2.c>
SecRuleEngine Off # This is super bad I know
</IfModule>
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)
这是一个坏主意,所以我可以这样做......
<LocationMatch /path/to/myfile.php>
<IfModule mod_security2.c>
SecRuleRemoveByTag "WEB_ATTACK/XSS" # better but.....still not close enough
</IfModule>
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)
所以我尝试过没有成功的东西,如下所示:
SecRule ARGS|!ARGS:param2 "@detectXSS" # only 2.8.0 and above :(
# or
SecRule ARGS|!ARGS:param2 "ctl:ruleRemoveByTag=WEB_ATTACK/XSS"
# or
SecRule REQUEST_FILENAME "@streq /path/to/myfile.php" "pass,ctl:ruleRemoveByTag=WEB_ATTACK/XSS;ARGS:param2"
Run Code Online (Sandbox Code Playgroud)
ModSecurity的文档很好,但我需要更深入的理解,特别是ctl的东西.我也看了一些其他的问题, …
在一些情况下,我遇到过这个问题,我只需要问一下是否有更好的东西.我有一个值可以通过派克分配给它的数字.数字意味着什么,所以将其输出给用户.例如,我需要将1更改为对用户来说意味着什么的东西.这是一个代码示例:
switch($data['priority']) {
case 1:
$priority = 'Low';
break;
case 2:
$priority = 'Medium';
break;
case 3:
$priority = 'High';
break;
default:
$priority = 'None';
break;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法用较少的代码将值分配给优先级?我知道在JavaScript中你可以做多个三元运算符(var data = type == 1 ? 'Good' : type == 2 ? 'Bad' : type == 3 ? 'Unknown' : '';)但PHP不允许这样做.我知道你也可以做多个if,else if else else if else语句,但这看起来好像是很多额外的代码.有没有更好的方法来做我要问的事情?
我的网站上有一个奇怪的问题.只要单击链接,文件就会执行两次.我注意到这一点的唯一原因是因为当我提交关键字的搜索请求时,我会在MySQL数据库中记录搜索.数据库总是保存两个记录(有一个时间戳,有时在同一秒添加记录,但通常只相隔一秒).我知道我是网站上唯一的一个,并且查询没有被循环调用.所以我做了一个fopen($ file,'a')来查看将添加多少行代码,并且大部分时间都添加了两行代码.我可以添加一条记录的唯一方法是连续2-3次运行相同的搜索.
所以我唯一能想到的就是我们在网站上有广告.我能想象的唯一一件事就是当我点击链接时,与广告相关联的javascript也会遵循相同的链接.
还有其他好主意吗?