2009-11-13 67 views
2

我想知道哪些是从我的数据库中获取数据的正确方法。无论哪种方式都有效,但有什么区别;一个深入的解释?使用mysql_query和mysql_fetch_array

$sql = mysql_query("SELECT * FROM _$setprofile"); 
while($row = mysql_fetch_array($sql)) { 
    $username = $row['user']; 
    $password = $row['pass']; 
    echo "$username:$password"; 
} 

下面的功能...

$sql = mysql_query("SELECT user,pass FROM _$setprofile"); 
while($row = mysql_fetch_row($sql)) { 
    echo "$row[0]:$row[1]"; 
} 

这是我一直想知道的。

回答

4

不同之处在于您在第一个示例中重新分配变量。但是你可以只说:

while(list($username, $password) = mysql_fetch_array($sql)) { 
    echo "$username:$password"; 
} 

或者你可以拉出一个哈希

while($row = mysql_fetch_assoc($sql)) { 
    echo "{$row['username']}:{$row['password']}"; 
} 

正确的方法取决于应用程序或您的喜好,我个人避免了数字索引的数组,除非我特别需要他们。谁想要试图保留哪些数据在哪个索引中的心理标签?

+0

感谢您的关注,请牢记在心。 – Homework 2009-11-13 07:35:03

3

不同之处在于fetch_array会提取一个包含BOTH数字和关联索引的数组(除非您提供额外的选项来说明否则),而fetch_row仅获取数字索引,fetch_assoc仅获取关联索引。通常,你不需要两者。

使用fetch_assoc而不是fetch_array - 只能为您提供带有关联索引的数组。这意味着它会运行得更快一些(它不得不做更少的工作),但代码会一样清晰。

从功能角度来看,差异很小。然而,前者存在的问题是您从数据库中获取的数据比您需要的多(SELECT *)。通常建议不要选择超过实际需要的数量。

+0

因此,如果我不抓取大量数据,那么使用SELECT * FROM并不是首选? – Homework 2009-11-13 07:32:58

+0

只有选择一些你不使用的数据会产生一些无用的流量。 – RageZ 2009-11-13 07:35:32

+1

从性能角度来看,SELECT * FROM几乎是不可取的。在某些情况下,如果您想要的列实际上是表中的所有列(或可能全部都是),则可能会更好,因为这两者都是为了便于阅读并且因为您要获取相同数量的数据。当然,与编码中的大部分内容一样,这只是一个指导方针 - 规则可能有例外。 – 2009-11-13 07:38:34

3

内部没有太大的区别。无论在MySQL客户端API中,序号位置和列名都可用于结果集元数据中。

关于使用情况,在不同情况下都可以得心应手。通过名称引用列更加助记,导致(半)自我记录代码,允许您更改查询中列的位置或列数,而不会破坏您的代码等。

但是,有时。例如:

SELECT u.name, d.name FROM user u JOIN department d USING (dept_id) 

现在,您在结果集中有两个具有相同名称的列。如果您获取关联数组,则会覆盖另一个数组,因为assoc数组每个关键点只能有一个值。所以$row["name"]是其中一个名字,你不一定知道它会是哪一个。

SELECT d.name, COUNT(*) FROM user u JOIN department d USING (dept_id) GROUP BY dept_id 

现在你有没有别名列,并根据您使用RDBMS的品牌,它可以自动地创造一个看起来很有趣的别名,或者只是使用整个表达式作为assoc命令阵列的关键。所以在这种情况下能够使用序号位置而不是列名是很好的。 (这很有趣,当我在写作时正在收听StackOverflow播客时,我的写作风格变得更加非正式和健谈。)

+0

当然,您也可以选择使用AS在这些情况下定义自己的别名。 – 2009-11-13 11:04:24

+0

的确如此,但实际上按顺序获得一个场依然有用。 – 2009-11-13 16:12:57

相关问题