我试图找出从数据库中获取数据的正确方法。无论哪种方式都有效,但有什么不同;一个深入的解释?
$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]";
}
这是我一直想知道的事情。
答案 0 :(得分:4)
不同之处在于您在第一个示例中重新分配变量。但你可以这样说:
while(list($username, $password) = mysql_fetch_array($sql)) {
echo "$username:$password";
}
或者你可以拉出哈希
while($row = mysql_fetch_assoc($sql)) {
echo "{$row['username']}:{$row['password']}";
}
正确的方法取决于应用程序或您的偏好,我个人避免使用数字索引数组,除非我特别需要它们。谁想尝试保留哪个数据在哪个索引中的精神标签?
答案 1 :(得分:3)
不同之处在于fetch_array提取包含BOTH数字和关联索引的数组(除非你提供额外的选项来告诉它),而fetch_row只获取数字索引而fetch_assoc只获取关联索引。通常,你不想要两者。
使用fetch_assoc而不是fetch_array - 只能获取带有关联索引的数组。这意味着它会运行得更快(它必须做更少的工作),但代码将同样清晰。
从功能角度来看,差异很小。但是,前者存在的问题是,您从数据库中获取的数量超出了您的需求(SELECT *)。通常建议不要选择超出实际需要的数量。
答案 2 :(得分:3)
内部没有太大区别。无论如何,MySQL客户端API中的结果集元数据都可以使用序数位置和列名称。
关于使用方法,两种方法在不同情况下都很方便。按名称引用列更具助记符,导致(半)自我记录代码,允许您在不破坏代码的情况下更改查询中的列的位置或数量等。
但有时候用顺序取物也很有用。例如:
SELECT u.name, d.name FROM user u JOIN department d USING (dept_id)
现在结果集中有两个具有相同名称的列。如果获取关联数组,则会覆盖另一个,因为关联数组每个键只能有一个值。所以$row["name"]
是其中一个名字,你不一定知道它会是什么。
SELECT d.name, COUNT(*) FROM user u JOIN department d USING (dept_id) GROUP BY dept_id
现在你有一个没有别名的列,根据你使用的RDBMS品牌,它可以自动发明一个看起来很滑稽的别名,或者只使用整个表达式作为assoc数组的键。因此,在这种情况下能够使用序号而不是列名称是很好的。
(当我正在写作时,当我正在收听StackOverflow播客时,我的写作风格变得更加随意和讨厌,这很有趣。)