其中哪一个会花费最少的时间?
1
q = 'SELECT * FROM table;'
result = db->query(q)
while(row = mysql_fetch_assoc(result))
{
userName = row['userName'];
userPassword = row['userPassword'];
if (enteredN==userName && enteredP==userPassword)
return true;
return false;
}
2
q = 'select * from table where userName='.enteredN.' and userPassword='.enteredP.';'
...
答案 0 :(得分:3)
第二个保证在任何数据库管理系统上都要快得多。如果表中只有几行,您可能不会注意到差异,但是当您拥有数千行时,它将变得非常明显。
作为一般规则,您应该让数据库管理系统处理您需要的过滤,分组和排序;数据库管理系统旨在完成这些工作,并且通常都经过高度优化。
如果这是一个经常使用的查询,请确保在唯一的username
字段上使用索引。
当soulmerge出现时,你需要小心SQL注入; see the PHP Manual for information how to protect against it。当你在它的时候,你应该认真考虑存储密码哈希,而不是密码本身; MySQL Manual has information on various functions that can help you do this。
答案 1 :(得分:1)
2号必然要多,多!,速度更快。 (除非表格只包含几行)
不仅 SQL服务器在过滤方面非常有效(并且它们可以使用#1中的循环无法访问的索引等),而且因为#1可能导致将大量数据从服务器传输到php应用程序。
此外,解决方案#1会导致用户的所有登录凭据在线路上传输,使其暴露于可能的窥探状态,在线路的某处...请注意,如果通道解决方案#2也存在潜在的安全风险SQL Server和应用程序之间的安全性不高;这种风险有所减轻,因为每次登录尝试都不会传输100%的帐户详细信息。
除了这种风险(对内部安全性而言)之外,完全外部攻击者还存在 SQL注入的真正风险(正如本文其他人所指出的那样)。但是,可以通过转义最终用户提供的字符串中包含的单引号字符来完全解决这个问题。