只是一个简单的问题.
在循环中使用PDO :: fetchAll()和PDO :: fetch()之间是否有任何性能差异(对于大型结果集)?
我正在获取用户定义类的对象,如果这有任何区别.
我最初没有受过教育的假设是fetchAll可能更快,因为PDO可以在一个语句中执行多个操作,而mysql_query只能执行一个.但是我对PDO的内部工作知之甚少,而且文档没有说明这一点,以及fetchAll()是否只是一个转储到数组中的PHP端循环.
有帮助吗?
假设我有一个如下所示的数组:
Array
(
[arm] => Array
(
[0] => A
[1] => B
[2] => C
)
[gender] => Array
(
[0] => Female
[1] => Male
)
[location] => Array
(
[0] => Vancouver
[1] => Calgary
)
)
Run Code Online (Sandbox Code Playgroud)
如何在保留外部关联数组的键并在内部数组中使用它们的同时找到笛卡儿积?算法的结果应该是这样的:
Array
(
[0] => Array
(
[arm] => A
[gender] => Female
[location] => Vancouver
)
[1] => Array
(
[arm] => A
[gender] => Female
[location] => Calgary
)
[2] => Array
(
[arm] => A
[gender] => …Run Code Online (Sandbox Code Playgroud) 我不明白使用"挑战令牌"会增加任何形式的预防:应该将什么价值与什么相比较?
来自OWASP:
通常,开发人员只需为当前会话生成一次此令牌.在初始生成此令牌之后,该值将存储在会话中,并用于每个后续请求,直到会话到期为止.
如果我正确理解了这个过程,就会发生这种情况.
我在http://example.com登录,并创建包含此随机令牌的会话/ cookie.然后,每个表单都包含一个隐藏的输入,该输入也包含会话中的这个随机值,在表单提交时与会话/ cookie进行比较.
但那取得了什么成果呢?您是不是只是将会话数据放入页面,然后将其与完全相同的会话数据进行比较?似乎像循环推理.这些文章一直在谈论遵循"同源策略",但这没有任何意义,因为所有CSRF攻击都与用户起源相同,只是诱使用户采取他/她不打算采取的行动.
除了将令牌作为查询字符串附加到每个URL之外,还有其他选择吗?看起来非常丑陋且不切实际,并且使用户的书签更难.
与简单地将所有数据存储在一个表中相比,使用一对一表关系有什么好处?我一直理解并使用一对多,多对一和多对多,但实现一对一的关系似乎是一项单调乏味且不必要的任务,特别是如果你使用命名将(php)对象与数据库表相关联的约定.
我在网上或网站上找不到任何可以提供一对一关系的真实世界范例的例子.起初我认为将"用户"分成两个表可能是合乎逻辑的,一个表包含公开信息,如关于我的个人资料页面和一个包含私人信息(如登录/密码等)等.但为什么要去通过使用不必要的JOINS的麻烦,你可以选择从该表中选择哪些字段?如果我正在显示用户的个人资料页面,显然我只会选择id,用户名,电子邮件,aboutme等,而不是包含其私人信息的字段.
有人想用一对一关系的一些真实世界的例子来启发我吗?
我在一个关于MVC缓存的相关问题中发表了一些评论,并提出了一些关于实际实现的问题.如何在没有开发人员需要手动缓存的情况下实现透明工作的模型级缓存,但仍然保持高效?
我会将我的缓存职责牢牢地放在模型中.它不是模型获取数据的控制器或视图业务.他们关心的是,当请求数据时,提供数据 - 这就是MVC范例应该如何工作的.
(来源:Jarrod发布)
我怀疑的原因是,除非有真正的需要,否则通常不应该进行缓存,不应该对搜索结果这样的事情进行缓存.因此,模型本身必须知道发给它的SELECT语句是否值得缓存.模型不是必须天文学上聪明,和/或存储长时间最常查询的内容的统计数据,以便准确地做出决定吗?并不是所有这些的开销不会使缓存无用吗?
如何从另一个查询中唯一标识查询(或者更确切地说,从另一个结果集中识别结果集)?如果您使用预准备语句,只根据用户输入改变参数,那该怎么办?
另一张海报说:
我建议使用查询的md5哈希值和输入参数的序列化版本.
碰撞的微小机会值得担心吗?
从概念上讲,模型中的缓存似乎对我来说是一个好主意,但它看起来很实用,并且由于缓存的性质,开发人员应该直接控制它并明确地将其编码到控制器逻辑中.
更新赏金
我确实使用了一个非常轻量级的ORM,有点类似于ActiveRecord,但是能够在没有n^2问题的情况下进行复杂的连接和子查询.我自己构建它,所以它很灵活,并且在关系或列名方面没有限制,我只是想了解我应该如何实现缓存机制.
根据乐于助人的建议,我会将查询的哈希值(可能是md5)与其参数列表连接起来,并将其用作该特定数据存储的键.我应该在需要它的Model类中单独实现缓存,还是应该成为ORM层的一部分?
我怎么知道什么时候应该失效?我是否必须手动解析UPDATE/DELETE/INSERT查询和子参数以找出正在修改的记录?或者更糟糕的是,每当修改数据时都要进行其他查询,以便跟踪哪些内容发生了变化,哪些内容应该失效?
我将奖励那些可以给我一个明确的概念性解释的人(无论这是否真的必须/有效地透明地完成),如果是这样,有一些模型缓存的实现细节.我正在使用PHP和MySQL,如果这有助于缩小你的注意力.
我正在尝试制作一组封装表单元素的自定义标记(标记和验证).
有一种方法可以轻松检索"Out"对象:
JspWriter out = getJspContext().getOut();
Run Code Online (Sandbox Code Playgroud)
但是我无法弄清楚如何获取请求对象.我希望能够从Tag类中直接访问提交的表单值,以便我可以验证每个字段.
该文件是相当稀疏,所以我想也许我可以使用的JspContext对象以某种方式获得请求属性.但我不明白不同的范围.
System.out.println(getJspContext().findAttribute("field1"));
Run Code Online (Sandbox Code Playgroud)
总是打印"null".
Enumeration e = getJspContext().getAttributeNamesInScope(1);
Run Code Online (Sandbox Code Playgroud)
循环并打印出枚举只是给我一个不存在的类列表:
javax.servlet.jsp.jspOut
javax.servlet.jsp.jspPage
javax.servlet.jsp.jspSession
javax.servlet.jsp.jspApplication
javax.servlet.jsp.jspPageContext
javax.servlet.jsp.jspConfig
javax.servlet.jsp.jspResponse
javax.servlet.jsp.jspRequest
Run Code Online (Sandbox Code Playgroud)
这甚至可能吗?
如果没有,有人可以指向我处理表单显示和验证的标签库吗?我在互联网上搜索了几个小时,似乎每一个都停止了,我无法下载它们.无论是那个或建议一个更好的替代处理表格.
编辑:标签扩展了SimpleTagSupport类.
由于电子邮件地址有很多有效字符,是否有任何有效的电子邮件地址本身可以是XSS攻击或SQL注入?我在网上找不到任何相关信息.
电子邮件地址的本地部分可以使用以下任何ASCII字符:
- 大写和小写英文字母(a-z,A-Z)
- 数字0到9
- 人物!#$%&'*+ - /=?^ _` {| }〜
- 性格.(点,句号,句号),条件是它不是最后一个字符,并且还提供它不连续出现两次或多次(例如John..Doe @ example.com).
http://en.wikipedia.org/wiki/E-mail_address#RFC_specification
我不是在问如何防止这些攻击(我已经在使用参数化查询和转义/ HTML净化器),这更像是一个概念验证.
首先想到的是'OR 1=1--@gmail.com,除了不允许空格.所有SQL注入都需要空格吗?
我需要将哪些方法添加到自定义Java类中,以便我可以遍历其中一个成员中的项目?我找不到关于JSTL forEach标签实际如何工作的任何规范,所以我不确定如何实现它.
例如,如果我创建了一个通用的"ProjectSet"类,我想在JSP视图中使用以下标记:
<c:forEach items="${projectset}" var="project">
...
</c:forEach>
Run Code Online (Sandbox Code Playgroud)
基本类文件:
public class ProjectSet {
private ArrayList<Project> projects;
public ProjectSet() {
this.projects = new ArrayList<Project>();
}
// .. iteration methods ??
}
Run Code Online (Sandbox Code Playgroud)
是否有任何接口我必须像PHP一样实现ArrayAccess或Iterator为了使其工作?
编辑:没有直接访问ArrayList本身,因为我可能会使用泛型使用某种类,而JSP视图不应该知道类的内部工作.
为特定对象创建"重置"函数是否被认为是更好的实践和/或更有效,它清除/默认所有必要的成员变量以允许进一步操作,或者简单地从外部构造新对象?
我已经看到两种方法都使用了很多,但我无法确定哪种方法更好.当然,对于代表数据库连接的类,你必须使用重置方法而不是构造一个新方法,导致不必要的连接/断开,但我在抽象类方面更多.
谁能给我一些关于何时使用每种方法的真实例子?在我的特定情况下,我主要考虑ORM或MVC中的模型.例如,如果我想要检索一堆数据库对象以供显示,并在一次操作中修改它们.